反应为什么调用函数对其进行初始化时状态不会更新?

洛根·沃尔夫(Logan Wlv)

React那些日子。我知道setState异步调用但是像这样设置一个初始值:

const [data, setData] = useState(mapData(props.data))

它不应该直接更新吗?

下面是一个codeandbox来说明我当前的问题,这里是代码:

import React, { useState } from "react";

const data = [{ id: "LION", label: "Lion" }, { id: "MOUSE", label: "Mouse" }];

const mapData = updatedData => {
  const mappedData = {};
  updatedData.forEach(element => (mappedData[element.id] = element));
  return mappedData;
};

const ChildComponent = ({ dataProp }) => {
  const [mappedData, setMappedData] = useState(mapData(dataProp));

  console.log("** Render Child Component **");

  return Object.values(mappedData).map(element => (
    <span key={element.id}>{element.label}</span>
  ));
};

export default function App() {
  const [loadedData, setLoadedData] = useState(data);
  const [filter, setFilter] = useState("");

  const filterData = () => {
    return loadedData.filter(element =>
      filter ? element.id === filter : true
    );
  };

  //loaded comes from a useEffect http call but for easier understanding I removed it

  return (
    <div className="App">
      <button onClick={() => setFilter("LION")}>change filter state</button>
      <ChildComponent dataProp={filterData()} />
    </div>
  );
}

所以,在我的理解,当我按一下按钮我打电话setFilter所以App应该重新呈现等ChildComponent新过滤后的数据。

我可以看到它正在重新渲染并mapData(updatedData)返回正确的过滤数据, ChildComponent保留了旧的状态数据。

这是为什么 ?还是由于某种原因,它会重新渲染两次?

我知道我可以利用,useEffect(() => setMappedData(mapData(dataProp)), [dataProp])但我想了解这里发生的事情。

编辑:我简化了很多代码,但是mappedData在ChildComponent中必须处于状态,因为在我的实际用例中,它有时会被用户的操作更新

https://codesandbox.io/s/beautiful-mestorf-kpe8c?file=/src/App.js

马里奥·维尔纳里(Mario Vernari)

useState钩得到的第一个初始化它的参数。因此,当再次调用该函数时,该挂钩始终产生原始集合。

顺便说一句,您不需要在那里的状态:

const ChildComponent = ({ dataProp }) => {
  //const [mappedData, setMappedData] = useState(mapData(dataProp));
  const mappedData = mapData(dataProp);

  console.log("** Render Child Component **");

  return Object.values(mappedData).map(element => (
    <span key={element.id}>{element.label}</span>
  ));
};

编辑:这是一个修改后的版本,以保持useState您所说的需要。不过,我不太喜欢此代码!:(

const ChildComponent = ({ dataProp }) => {
  const [mappedData, setMappedData] = useState(mapData(dataProp));

  let actualMappedData = mappedData;
  useMemo(() => {
      actualMappedData =mapData(dataProp);
    },
    [dataProp]
  )

  console.log("** Render Child Component **");

  return Object.values(actualMappedData).map(element => (
    <span key={element.id}>{element.label}</span>
  ));
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么每次调用F#类成员都会对其进行初始化?

来自分类Dev

为什么每次调用F#类成员都会对其进行初始化?

来自分类Dev

UILabel初始化时调用的函数

来自分类Dev

UILabel初始化时调用的函数

来自分类Dev

为什么在调用构造函数之前进行显式初始化

来自分类Dev

为什么我的主管在使用badarg进行初始化时失败?

来自分类Dev

初始化时如何基于模型解析进行POST调用

来自分类Dev

当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

来自分类Dev

为什么在声明成员函数之前先对其进行调用?

来自分类Dev

为什么初始化时不使用setter方法?

来自分类Dev

为什么Hibernate在初始化时在子句中执行sql

来自分类Dev

为什么在初始化时使用子类的实现?

来自分类Dev

React 初始化时未定义道具。为什么?

来自分类Dev

向量的向量初始化工作不会进行,但是矩阵数组会进行,为什么呢?

来自分类Dev

函数调用后反应状态未更新

来自分类Dev

为什么在可能首次使用这些字段之前未对其进行初始化?

来自分类Dev

为什么我的类构造函数不初始化其成员变量?

来自分类Dev

为什么在构造函数初始化类的属性时声明其属性

来自分类Dev

为什么在对象初始化时可以通过赋值运算符将参数传递给构造函数?

来自分类Dev

使用初始化列表初始化字段并在构造函数内部对其进行初始化之间有什么区别?

来自分类Dev

为什么成员初始化程序在移动时会调用额外的构造函数调用?

来自分类Dev

警告 C26495 从构造函数调用函数以初始化变量,为什么?

来自分类Dev

为什么 React Component 函数构造函数中的方法在组件初始化后进行评估?

来自分类Dev

为什么在函数内部的extern中提供显式的初始化程序不会覆盖extern?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

初始化时的Angular 2调用API

来自分类Dev

为什么实例变量在构造函数调用之前被初始化?

来自分类Dev

为什么成员字段不能让字段初始化程序调用成员函数?

Related 相关文章

  1. 1

    为什么每次调用F#类成员都会对其进行初始化?

  2. 2

    为什么每次调用F#类成员都会对其进行初始化?

  3. 3

    UILabel初始化时调用的函数

  4. 4

    UILabel初始化时调用的函数

  5. 5

    为什么在调用构造函数之前进行显式初始化

  6. 6

    为什么我的主管在使用badarg进行初始化时失败?

  7. 7

    初始化时如何基于模型解析进行POST调用

  8. 8

    当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

  9. 9

    为什么在声明成员函数之前先对其进行调用?

  10. 10

    为什么初始化时不使用setter方法?

  11. 11

    为什么Hibernate在初始化时在子句中执行sql

  12. 12

    为什么在初始化时使用子类的实现?

  13. 13

    React 初始化时未定义道具。为什么?

  14. 14

    向量的向量初始化工作不会进行,但是矩阵数组会进行,为什么呢?

  15. 15

    函数调用后反应状态未更新

  16. 16

    为什么在可能首次使用这些字段之前未对其进行初始化?

  17. 17

    为什么我的类构造函数不初始化其成员变量?

  18. 18

    为什么在构造函数初始化类的属性时声明其属性

  19. 19

    为什么在对象初始化时可以通过赋值运算符将参数传递给构造函数?

  20. 20

    使用初始化列表初始化字段并在构造函数内部对其进行初始化之间有什么区别?

  21. 21

    为什么成员初始化程序在移动时会调用额外的构造函数调用?

  22. 22

    警告 C26495 从构造函数调用函数以初始化变量,为什么?

  23. 23

    为什么 React Component 函数构造函数中的方法在组件初始化后进行评估?

  24. 24

    为什么在函数内部的extern中提供显式的初始化程序不会覆盖extern?

  25. 25

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  26. 26

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  27. 27

    初始化时的Angular 2调用API

  28. 28

    为什么实例变量在构造函数调用之前被初始化?

  29. 29

    为什么成员字段不能让字段初始化程序调用成员函数?

热门标签

归档