reactjs - React,如果多个效果 setState 一个值会发生什么?

标签 reactjs react-native

执行以下操作安全吗?

const [foo, setFoo] = useState(undefined)

useEffect(() => {
  dispatch(someFunc()).then(response => {
    let { someFoo } = response
    setFoo(someFoo)
  })
}, []) // or  }, [bar])

useEffect(() => {
  dispatch(anotherFunc()).then(response => {
    let { anotherFoo } = response
    setFoo(anotherFoo)
  })
}, [bar])

最佳答案

效果按照给定的顺序执行,并且只有最后一个效果 setter 中的“foo”在 UI 中可见。例如,以下组件将输出 bar - 1:

const Component = ({ bar }) => {
  const [foo, setFoo] = useState(undefined);
  console.log("render", bar, foo);

  useEffect(() => {
    console.log("effect 1");
    let someFoo = bar + 1;
    setFoo(someFoo);
  }, [bar]);

  useEffect(() => {
    console.log("effect 2");
    let anotherFoo = bar - 1;
    setFoo(anotherFoo);
  }, [bar]);

  return (
    <div>
      {bar} sets {foo}
    </div>
  );
};

https://codesandbox.io/s/proud-leaf-g55n9?file=/src/App.js:76-482

编辑:如果使用 [] 作为依赖数组,它只会执行一次。如果效果中有async函数,例如fetch,则以最后执行的setFoo为准。以下示例将在每次点击中显示随机结果:

  useEffect(() => {
    if (disabled) {
      const random = 500 * Math.random();
      const handle = setTimeout(() => {
        setFoo(1);
      }, random);

      return () => clearTimeout(handle);
    }
  }, [disabled]);

  useEffect(() => {
    if (disabled) {
      const random = 500 * Math.random();
      const handle = setTimeout(() => {
        setFoo(2);
      }, random);

      return () => clearTimeout(handle);
    }
  }, [disabled]);

示例 2: https://codesandbox.io/s/jovial-architecture-0ybcz?file=/src/App.js

关于reactjs - React,如果多个效果 setState 一个值会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62618637/

相关文章:

reactjs - Chart 中的 SVG 在 Prop 更改后不会重新渲染。 react + d3

javascript - 如何使用钩子(Hook)将值发送到 React Native 中的另一个屏幕?

reactjs - 错误 : Unable to resolve module ./Easing from node_modules\react-native-reanimated\src\Animated.js

react-native - 打开开发菜单或重新加载应用程序而不会晃动?

xcode - 如何使用 React Native expo 获取 IOS 和 Android 的包 ID

reactjs - 切换路由后 React 路由器 componentDidMount 不执行

reactjs - 如何生成动态 React 标记

javascript - 我的 React 应用程序出现错误 "action undefined"

javascript - 从嵌套 JavaScript 对象插入/删除数据

android - 无法在 native react 中编辑 TextInput 数据