【问题标题】:React : Update child component state from parent with asynchronous dataReact:使用异步数据从父组件更新子组件状态
【发布时间】:2020-11-28 07:18:39
【问题描述】:

我有一个 react 应用程序,当父级异步获取学生列表时,StudentView(父级)需要更新 Table 组件(子级)。

父组件

const StudentView = () => {
    const [studentData, setStudentData] = useState();  

   useEffect(() => {
     let url = "/api/students";
    axios
      .get(url)
      .then((response) => {
        setStudentData(response.data);
      })
  }, []);

  return (
    <div>
      <div className="container">
        <Table tableRows={studentData} />
      </div>
    </div>
  );
};
export default StudentView;

子组件(表格)

const Table = ({  tableRows }) => {
  
 
  return (
    
      <table className="table table-striped border">
         {createTableBody(tableRows )}
      </table>
    
  );
};

export default Table;

问题是父级获取数据后,表没有更新。

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    诀窍是在子组件中使用useEffect 与从父组件传递的值

    const Table = ({  tableRows }) => {
      const [rows, setRows] = useState(tableRows);
      useEffect(() => {
        if (tableRows) {
          setRows(tableRows);
        }
      }, [tableRows]);
    
     
    
      return (
        <table className="table table-striped border">
             {createTableBody(rows)}
          </table>
      );
    };
    
    export default Table;
    

    【讨论】:

      【解决方案2】:

      去掉子组件中的状态钩子,prop tableRows已经是一个状态变量,会触发子组件中的重新渲染。

      const Table = ({  tableRows }) => {
      
      return (
        <table className="table table-striped border">
           {createTableBody(tableRows)}
        </table>
      

      【讨论】:

      • 如果异步获取数据,则重新渲染不起作用。如果在创建表时传递了数据,那么它工作正常。
      • 异步数据不是问题,这种结构应该工作是 Dumb 和 Smart 组件的基本原则:coderwall.com/p/znkw-q/… 如果你尝试过但没有工作,那么调试你的应用程序,因为数据不是更新
      • 是的。我试过了,子组件中没有useEffect和state,异步数据在子组件中没有得到更新。
      • 调试你的应用,因为数据没有更新
      • 如果您不相信,请阅读此内容。 stackoverflow.com/questions/56903577/…
      猜你喜欢
      • 1970-01-01
      • 2020-09-22
      • 2020-09-10
      • 2020-05-31
      • 2018-10-09
      • 2021-01-12
      • 2021-04-02
      • 2018-07-20
      • 2021-12-27
      相关资源
      最近更新 更多