Reactjs 使用React钩子初始化第三方库

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(() => {

我想在某个组件使用React钩子挂载时初始化一个实例。在调整大小时,我希望根据视口宽度销毁或更新Swiper实例

我用
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依赖项数组中。这是一个有趣的问题