【问题标题】:useState not setting inital state with a filtered arrayuseState 未使用过滤数组设置初始状态
【发布时间】:2021-02-01 08:09:04
【问题描述】:

我正在使用 useContext 将数据提取到我的组件中。然后我想过滤tasks,所以它只显示项目的相关任务。

我将tasks 过滤成initState,然后想使用这个过滤列表的useState 设置初始状态。

当我过滤initState 中的列表时,我得到了正确的值,但是当我这样做时:

const [listToRender, setListToRender] = useState(initState)

listToRender 是一个空数组,组件内没有状态。

    const TasksTable = ({ match: { params: { projectId }} }) => {
    const { tasks } = useContext(TasksContext)
    const initState = [...tasks].filter(task => task.taskProject === projectId)
    const [listToRender, setListToRender] = useState(initState)

有人知道我在哪里可能会出错吗?

这是组件首次渲染时不同值的控制台日志

【问题讨论】:

标签: reactjs react-hooks use-state react-state


【解决方案1】:

我会使用 useEffect 来初始化 listToRender 状态的值

 const TasksTable = ({ match: { params: { projectId }} }) => {
 const { tasks } = useContext(TasksContext)
 const [listToRender, setListToRender] = useState([])

React.useEffect(() => {
const initState = tasks?.filter(task => task.taskProject === projectId) ?? []
 setListToRender(initState)
}, [tasks, projectId]);

原因是它在设置listToRender状态时可能没有任务数据,导致它是一个空数组。

每次组件更新时都会运行一个useEffect,在这种情况下,useEffect 只会在任务发生变化时运行,(参见依赖数组)。因此,当任务获得值时,会触发 useEffect 更新 listToRender 状态。

【讨论】:

  • 完美,修复了它。你介意帮我理解为什么会这样吗?为什么这会在组件加载时运行但在其外部不起作用的useEffect 中起作用?
  • 而且您不需要将tasks 复制到[...tasks],因为filter 方法返回一个新数组。
  • 每次组件更新时都会运行一个useEffect,在这种情况下,只有在任务发生变化时才会运行useEffect,(参见依赖数组)。因此,当任务获得值时,会触发 useEffect 更新 listToRender 状态。 :)
【解决方案2】:

以后需要setListToRender()更新listToRender吗?如果你不是,那么你可以改用useMemo

const TasksTable = ({ match: { params: { projectId }} }) => {
  const { tasks } = useContext(TasksContext);
  
  const initState = useMemo(() => {
    return tasks.filter(task => task.taskProject === projectId);
  }, [projectId, tasks]);

【讨论】:

  • 是的,我稍后会根据用户选择的其他过滤器更新listToRender - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2020-03-08
  • 2019-08-24
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多