javascript - 使用 useState Hook 时 - 更改 setState 函数调用顺序是否重要?

标签 javascript reactjs react-hooks

我有一个带有两个状态变量的 React 功能组件(itemsDataitemsCollections)。变量在 useEffect 方法中更新。但是在 useEffect 发生之后,其中一个状态变量是 null

切换 setStateFunctions (setItemsData & setItemsCollect) 调用顺序后,两个参数都按预期初始化。

怎么样?

const MyComponent = ({itemsIds}) => {
   const [itemsData, setItemsData] = useState([]);
   const [itemsCollections, setItemsCollect] = useState({});

 useEffect(() => {
        fetchItemsData({ itemsIds }).then(({ items, itemCollect }) => {
             setItemsData(items);
             setItemsCollect(itemCollect);
        })
    }, [itemsIds]);
...
console.log('itemsData', itemsData) // the expected array
console.log('itemCollect', itemCollect) // empty objecy

useEffect 后的状态:itemCollect = {}, itemsData = [{value:...},...]

切换调用顺序:

const MyComponent = ({itemsIds}) => {
   ...
 useEffect(() => {
        fetchItemsData({ itemsIds }).then(({ items, itemCollect }) => {
             setItemsCollect(itemCollect); // <--> switched rows
             setItemsData(items); // <--> switched rows

        })
    }, [itemsIds]);
...
console.log('itemsData', itemsData) // the expected array
console.log('itemCollect', itemCollect) // the expected object

useEffect 之后的状态:itemCollect = { someValue: ...} , itemsData = [{value:...},...]

最佳答案

有一种称为批处理的性能优化,can change between React versions .应用此优化后,多个 setState 调用将在下一次渲染之前一起批处理(顺序无关紧要)。

如果未应用(例如,在您的情况下的 Promise 内部,请参阅 Does React batch state update functions when using hooks? ),则每次状态更新都将触发新的渲染(并且顺序很重要)。

=> console.log('itemCollect', itemCollect) 可能会在每个渲染中记录不同的数据。

如果您需要强制更新单个状态,则从 useReducer 调用单个调度可能是最好的选择。

关于javascript - 使用 useState Hook 时 - 更改 setState 函数调用顺序是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57027697/

相关文章:

javascript - "useEffect has a missing dependency"警告有时是错误的吗?

javascript - 如何在 React 经典 `class` 组件中使用 React hooks?

javascript - 使用 Facebook Graph API 获取用户好友列表

javascript - 在 jquery 数据表中禁用排序

Javascript/jQuery - 需要在页面上查找原始文本,将后面的内容捕获到变量中,并用 HTML 替换原始文本

javascript - 我应该使用 props 还是 states 来传递数据?

javascript - React hook useState() 的行为真的很奇怪

javascript - 减少两个 Canvas html 之间的空间

javascript - React - 窗口上的 beforeunload 事件不会触发

reactjs - Firestore 按数组的字段值查询