Reactjs 使用React钩子初始化第三方库
我想在某个组件使用React钩子挂载时初始化一个实例。在调整大小时,我希望根据视口宽度销毁或更新Swiper实例 我用Reactjs 使用React钩子初始化第三方库,reactjs,react-hooks,Reactjs,React Hooks,我想在某个组件使用React钩子挂载时初始化一个实例。在调整大小时,我希望根据视口宽度销毁或更新Swiper实例 我用useffect钩子初始化插件,在这里我调用一个存储为const的函数 const MyComponent = () => { const [swiper, setSwiper] = useSate(null); const element = useRef(null); const initSwiper = useCallback(() => {
useffect
钩子初始化插件,在这里我调用一个存储为const
的函数
const MyComponent = () => {
const [swiper, setSwiper] = useSate(null);
const element = useRef(null);
const initSwiper = useCallback(() => {
// swiper is always null here so I can't destroy the instance
if (MediaQuery.is('large up') && swiper !== null) {
return setSwiper(swiper.destroy());
}
if (MediaQuery.is('small up')) {
const currentSwiper = new Swiper(element.current, swiperSettings);
currentSwiper.init();
return setSwiper(currentSwiper);
}
}, [swiper, swiperSettings]);
useEffect(() => {
initSwiper();
window.addEventListener('resize', initSwiper);
return () => {
window.removeEventListener('resize', initSwiper);
}
}, []);
return (
<div ref={element}>...</div>
}
constmycomponent=()=>{
常量[swiper,setSwiper]=useSate(空);
常量元素=useRef(null);
const initSwiper=useCallback(()=>{
//swiper在这里总是空的,所以我不能破坏这个实例
if(MediaQuery.is('large up')&&swiper!==null){
返回设置雨刮器(swiper.destroy());
}
if(MediaQuery.is('small up')){
const currentSwiper=新Swiper(element.current,swiperSettings);
currentSwiper.init();
返回设置雨刮器(电流开关);
}
},[swiper,Swippertings]);
useffect(()=>{
initSwiper();
addEventListener('resize',initSwiper);
return()=>{
removeEventListener('resize',initSwiper);
}
}, []);
返回(
...
}
我想知道初始化后如何访问Swiper实例。我是否应该使用
ref
?我不确定处理此问题的最佳方法。您实际上不需要此处的状态。因为useffect()
callback是一个闭包,您不需要在闭包外部使用swiper
,创建一个变量(let swiper
),并将swiper
的当前实例分配给该变量。您还应该在闭包内部声明initSwiper
,并且您不需要(实际上不能)用useffect包装它()
因为useffect()
块只在init上运行
注意:开关
不是来自道具或状态,因此useffect()
块不依赖于它们。如果需要通过props
更改,请通过ref传递它们
const MyComponent = () => {
const element = useRef(null);
useEffect(() => {
let swiper = null;
const initSwiper = () => {
if (MediaQuery.is('large up') && swiper !== null) {
swiper = swiper.destroy();
} else if (MediaQuery.is('small up')) {
// swiper.destroy(); // should probably start by destroying the old swiper
swiper = new Swiper(element.current, swiperSettings);
swiper.init();
}
};
window.addEventListener('resize', initSwiper);
return () => {
window.removeEventListener('resize', initSwiper);
}
}, []);
return (
<div ref={element}>...</div>
);
};
constmycomponent=()=>{
常量元素=useRef(null);
useffect(()=>{
设swiper=null;
常量initSwiper=()=>{
if(MediaQuery.is('large up')&&swiper!==null){
swiper=swiper.destroy();
}else if(MediaQuery.is('small up')){
//swiper.destroy();//应该首先销毁旧的swiper
开关=新开关(元件电流、开关次数);
swiper.init();
}
};
addEventListener('resize',initSwiper);
return()=>{
removeEventListener('resize',initSwiper);
}
}, []);
返回(
...
);
};
并用作自定义挂钩(as):
const useSwiper=()=>{
常量元素=useRef(null);
useffect(()=>{
设swiper=null;
常量initSwiper=()=>{
if(MediaQuery.is('large up')&&swiper!==null){
swiper=swiper.destroy();
}else if(MediaQuery.is('small up')){
//swiper.destroy();//应该首先销毁旧的swiper
开关=新开关(元件电流、开关次数);
swiper.init();
}
};
addEventListener('resize',initSwiper);
return()=>{
removeEventListener('resize',initSwiper);
}
}, []);
返回元素;
};
常量MyComponent=()=>(
);
这里实际上不需要状态。因为useffect()
回调是一个闭包,并且在闭包之外不使用swiper
,所以创建一个变量(let swiper
),并将Swiper
的当前实例分配给变量。您还应该在闭包中声明initSwiper
,并且您不需要(实际上也不能)用useffect()
包装它,因为useffect()
块只在init上运行
注意:开关
不是来自道具或状态,因此useffect()
块不依赖于它们。如果需要通过props
更改,请通过ref传递它们
const MyComponent = () => {
const element = useRef(null);
useEffect(() => {
let swiper = null;
const initSwiper = () => {
if (MediaQuery.is('large up') && swiper !== null) {
swiper = swiper.destroy();
} else if (MediaQuery.is('small up')) {
// swiper.destroy(); // should probably start by destroying the old swiper
swiper = new Swiper(element.current, swiperSettings);
swiper.init();
}
};
window.addEventListener('resize', initSwiper);
return () => {
window.removeEventListener('resize', initSwiper);
}
}, []);
return (
<div ref={element}>...</div>
);
};
constmycomponent=()=>{
常量元素=useRef(null);
useffect(()=>{
设swiper=null;
常量initSwiper=()=>{
if(MediaQuery.is('large up')&&swiper!==null){
swiper=swiper.destroy();
}else if(MediaQuery.is('small up')){
//swiper.destroy();//应该首先销毁旧的swiper
开关=新开关(元件电流、开关次数);
swiper.init();
}
};
addEventListener('resize',initSwiper);
return()=>{
removeEventListener('resize',initSwiper);
}
}, []);
返回(
...
);
};
并用作自定义挂钩(as):
const useSwiper=()=>{
常量元素=useRef(null);
useffect(()=>{
设swiper=null;
常量initSwiper=()=>{
if(MediaQuery.is('large up')&&swiper!==null){
swiper=swiper.destroy();
}else if(MediaQuery.is('small up')){
//swiper.destroy();//应该首先销毁旧的swiper
开关=新开关(元件电流、开关次数);
swiper.init();
}
};
addEventListener('resize',initSwiper);
return()=>{
removeEventListener('resize',initSwiper);
}
}, []);
返回元素;
};
常量MyComponent=()=>(
);
您可能应该使用一个可以将Swiper用作React组件的软件包(例如)。这不是对您最初问题的回答。但是initSwiper
是一个依赖项,应该包含在useffect
s依赖项数组中。这是一篇有趣的文章:不要添加不必要的包您可能应该使用一个包,让您将Swiper用作React组件(例如)。这不是对原始问题的回答。但是initSwiper
是一个依赖项,应该包含在useffect
s依赖项数组中。这是一个有趣的问题