使用 React Hooks 时状态未更新

IT技术 reactjs react-hooks
2021-04-28 11:10:37

我目前正在使用新的 React Hooks 功能,但我遇到了一个问题,即功能组件的状态没有被更新,即使我相信我做的一切都是正确的,这个测试应用程序的另一双眼睛会是非常感激。

import React, { useState, useEffect } from 'react';

const TodoList = () => {
  let updatedList = useTodoListState({ 
    title: "task3", completed: false 
  });
const renderList = () => {
  return (
    <div>
      {
        updatedList.map((item) => {
          <React.Fragment key={item.title}>
            <p>{item.title}</p>
          </React.Fragment>
        })
      }
    </div>
  )
}
return renderList();
}

function useTodoListState(state) {
  const [list, updateList] = useState([
    { title: "task1", completed: false },
    { title: "task2", completed: false }
  ]);
  useEffect(() => {
    updateList([...list, state]);
  })
  return list;
}

export default TodoList;

useTodoListState 的 useEffect 函数中的 updateList 应该是更新 list 变量以保存三个数据,但事实并非如此。

1个回答

你在这里有几个问题:

  1. renderList您滥用React.Fragment. 它应该用于包装多个 DOM 节点,以便组件只返回单个节点。您将各个段落元素包装在各自的 Fragment 中。
  2. 每次迭代 a 时都需要返回一些东西map这意味着您需要使用return关键字。有关箭头函数语法的更多信息,请参阅此问题。)
  3. 您的代码将无限更新,因为useEffect正在更新其自己的钩子状态。为了解决这个问题,您需要包含一个数组作为第二个参数,useEffect这将告诉 React 只有在给定数组更改时才使用该效果。

这是它应该看起来的样子(经过一些重新格式化):

import React, { useState, useEffect } from 'react';

const TodoList = () => {
  let updatedList = useTodoListState({
    title: "task3", completed: false
  });

  return (
    <React.Fragment> // #1: use React.Fragment to wrap multiple nodes
      {
        updatedList.map((item) => {
          return <p key={item.title}>{item.title}</p> // #2: return keyword inside map with braces
        })
      }
    </React.Fragment>
  )
}

function useTodoListState(state) {
  const [list, updateList] = useState([
    { title: "task1", completed: false },
    { title: "task2", completed: false }
  ]);

  useEffect(() => {
    updateList([...list, state]);
  }, [...list]) // #3: include a second argument to limit the effect

  return list;
}

export default TodoList;

编辑:
虽然我已经测试过上述代码有效,但最终最好重新设计结构以updateListuseEffect另一个变量中删除或实现另一个变量来控制更新。