小编Emr*_*mre的帖子

React Hooks useEffect,添加依赖项触发无限循环

在useEffect内部,我有一个props依赖项(setIsValid)。当我将此依赖项添加到useEffect时,它会陷入无限循环。

调用子组件时为父:

const setIsValid = (bool) => {
  const tmpStateCopy = Object.assign({}, state);
  tmpStateCopy.isValid = bool;

  setState(tmpStateCopy);
};

return <Child
  setIsValid={setIsValid}
/>
Run Code Online (Sandbox Code Playgroud)

在子组件中:

const { setIsValid } = props;

const [state, setState] = useState({
  transformations: [],
  duplicateIndexes: []
});

const { transformations, duplicateIndexes } = state;

useEffect(() => {
  const invalids = transformations.find(x => (x.value === '' || x.replaceWith === ''));
  const hasDuplicates = duplicateIndexes.length > 0;
  const isValid = ((invalids === undefined) && (transformations.length > 0) && !hasDuplicates);

  setIsValid(isValid) …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-hooks use-effect

6
推荐指数
1
解决办法
1432
查看次数

使用 useRef 恢复 React Hooks 中的滚动位置不稳定

我想通过在 useEffect 内部将窗口位置设置回之前的状态来滚动到之前的窗口位置。为了获取之前的状态,我使用了 useRef。

该组件曾经是基于类的,并且在那里它工作得非常完美。当我将其重构为钩子后,这种“不稳定”的行为就开始了。

useRef一开始就宣告权利

const scrollRef = useRef(window.pageYOffset);
Run Code Online (Sandbox Code Playgroud)

每当组件重新渲染时:

scrollRef.current = window.pageYOffset;
Run Code Online (Sandbox Code Playgroud)

当状态更新时:

useEffect(() => {
  window.scrollTo(0, scrollRef.current)
});
Run Code Online (Sandbox Code Playgroud)

完整代码:

export default () => {
   const scrollRef = useRef(window.pageYOffset);
   ...
   scrollRef.current = window.pageYOffset;
   useEffect(() => {
      window.scrollTo(0, scrollRef.current)
   });

   return (
      ...
   );
}
Run Code Online (Sandbox Code Playgroud)

在状态更新时,我想通过不出现这种“不稳定”行为来改回之前的窗口位置。(摇晃是指看起来他滚动到顶部,然后滚动到上一个位置,所以看起来像摇晃)

javascript reactjs react-hooks

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

javascript ×2

react-hooks ×2

reactjs ×2

use-effect ×1