首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查useEffect中的哪个依赖项已被更新

检查useEffect中的哪个依赖项已被更新
EN

Stack Overflow用户
提问于 2019-09-08 16:04:10
回答 1查看 4.1K关注 0票数 5

我有一个useEffect钩子:

代码语言:javascript
复制
useEffect(() => {
  setTop(t => t + (controller.position.y * tileSize))
  setLeft(l => l + (controller.position.x * tileSize))
}, [controller.position])

我希望它只在position改变的情况下进行加法。如果tileSize改变了,我只想让它做乘法。

我试着将其放入两个useEffect中,但随后得到了React Hook useEffect has missing dependencies警告:

代码语言:javascript
复制
useEffect(() => {
    setTop(t => t + (controller.position.y * spriteSize))
    setLeft(l => l + (controller.position.x * spriteSize))
}, [controller.position])

useEffect(() => {
    setTop((controller.position.y * spriteSize))
    setLeft((controller.position.x * spriteSize))
}, [spriteSize])

这个案子的最佳做法是什么?

编辑:

可复制的例子:

代码语言:javascript
复制
const [tileSize, setTileSize] = useState(0)
const controller = {
    position: {
        x: 0,
        y: 0
    }
}
useEffect(() => {
    setTop(t => t + (controller.position.y * tileSize))
    setLeft(l => l + (controller.position.x * tileSize))
}, [controller.position])

useEffect(() => {
    setTop((controller.position.y * tileSize))
    setLeft((controller.position.x * tileSize))
}, [tileSize])

const asdf = () => {
    setTileSize(150)
}

return (
    <div onClick={() => asdf()}>click me</div>
)

警告信息:

第31行: React useEffect缺少一个依赖项:'tileSize‘。要么包含它,要么删除依赖数组。如果“useState”需要“tileSize”的当前值-tileSize-钩子/详尽-deps,您还可以用useReducer替换多个tileSize变量。 第36行: React缺少依赖项:“控制项.位置.x”和“控制项.位置.y”。要么包含它们,要么删除依赖数组Reacti-钩子/详尽-deps第46行:不可访问的代码。不可及

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-08 16:30:56

有许多方法,您应该查看用例中最易读的一种方法。

  1. 如警告所示,用useReducer替换

React缺少一个依赖项:“tileSize”。要么包含它,要么删除依赖数组。如果‘useState’需要当前的'tileSize‘值,也可以用useReducer替换多个setTop变量。(反应-钩/详尽-行动)

代码语言:javascript
复制
const STATE = {
  ADDITION: 'addition',
  MULTIPLICATION: 'multiplication'
};

function reducer(state, action) {
  switch (action.type) {
    case STATE.ADDITION:
      return {
        ...state,
        position: action.position,
        top: state.top + action.position * state.spriteSize
      };
    case STATE.MULTIPLICATION:
      return {
        ...state,
        spriteSize: action.spriteSize,
        top: state.position * action.spriteSize
      };
    default:
      throw new Error();
  }
}

function Controller({ position, spriteSize }) {
  const [state, dispatch] = useReducer(reducer, {
    top: 0,
    position,
    spriteSize
  });

  useEffect(() => {
    dispatch({ type: STATE.ADDITION, position });
  }, [position]);

  useEffect(() => {
    dispatch({ type: STATE.MULTIPLICATION, spriteSize });
  }, [spriteSize]);

  return <FlexBox>{state.top}</FlexBox>;
}
  1. 您可以使用引用useRef并与旧值进行比较。
  2. 如果你知道你在做什么,只需禁用棉布警告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57843551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档