【问题标题】:How to render a component after setState in React?如何在 React 中的 setState 之后渲染组件?
【发布时间】:2022-11-02 05:46:32
【问题描述】:

我知道这是一个常见问题,但在寻找答案数小时后,我决定寻求帮助。

我正在尝试将状态变量传递给组件,但该组件是在设置值之前呈现的

我的代码:

import React, { useState, useEffect } from "react";
import { useLocation } from "react-router-dom";
import Seguradora from "../../components/seguradora/seguradora.component";

const CorretorasShow = () => {
  const obj = useLocation();
  const [names, setNames] = useState([]);

  useEffect(() => {
    const url =
      "http://localhost:3001/corretoras/63338f415c502044e953d408" +
      obj.state._id;

    const fetchData = async () => {
      try {
        const response = await fetch(url);
        const json = await response.json();
        setNames(json.seguradora); // <<<<<< setState
      } catch (error) {
        console.log("error", error);
      }
    };

    fetchData();
  }, []);

  return (
    <div>
      <Seguradora props={names} /> //<<<<< state varible
    </div>
  );
};

我试过 useMemo、useRef 和三元运算符无济于事。 我不是专业程序员,而且我是 reactJS 新手,所以我可能对这些解决方法做错了

【问题讨论】:

  • 你的问题是什么?
  • names 的类型是什么?数组还是字符串?
  • 哦,names &gt; 0 永远是真的,你想要names.length &gt; 0
  • 我的问题可能是:如何在渲染组件之前设置变量值。现在发生的是组件被渲染并且我传递给它的变量为空。名称是一个对象数组。
  • names 在第一次渲染时不为空,因为您将它初始化为一个空数组[],它不为空。为什么你认为它是空的?你确定json.seguradora 里面有数据吗?养成使用console.log 来验证你的数据是否符合你期望的习惯,并养成阅读错误的习惯,不要忽视它们。

标签: javascript reactjs


【解决方案1】:

由于names 是一个数组,您可以检查该数组是否已填充以有条件地呈现您的组件,如下所示:

return (
    <div>
      { names.length > 0 ?  <Seguradora props={names} /> : null} 
    </div>
  );

【讨论】:

    【解决方案2】:

    由于获取数据是异步操作,因此获取的数据(在本例中为 names)在渲染子组件时将是未定义的。为避免这种情况,您需要检查 names 数组是否具有值,并且仅在其为真时才呈现子组件。

    import React, { useState, useEffect } from "react";
    import { useLocation } from "react-router-dom";
    import Seguradora from "../../components/seguradora/seguradora.component";
    
    const CorretorasShow = () => {
      const obj = useLocation();
      const [names, setNames] = useState([]);
    
      useEffect(() => {
        const url =
          "http://localhost:3001/corretoras/63338f415c502044e953d408" +
          obj.state._id;
    
        const fetchData = async () => {
          try {
            const response = await fetch(url);
            const json = await response.json();
            setNames(json.seguradora); // <<<<<< setState
          } catch (error) {
            console.log("error", error);
          }
        };
    
        fetchData();
      }, []);
    
      return (
        <div>
          { names.length !== 0 && <Seguradora props={names} /> }
        </div>
      );
    };
    

    【讨论】:

    • 非常感谢。有效。令人难以置信的是我找不到这么简单的解决方案。我发现的只是使用 useMemo、reducers 或解决方法的方法,这些方法并没有解决我的问题。应该对此进行投票,以便其他人可以看到它,因为这是反应的常见情况
    • 这个答案没有任何意义。 names 不应该是 useEffect 的依赖项。 useEffect 应该在依赖数组中有 [] 就像在原始问题中一样,以便它在组件加载时只触发一次。将 API 响应添加到 API 调用的依赖项没有意义,因为 API 调用不依赖于响应。您只是对@IgorFerreira 感到困惑,请删除此答案。
    • @AndyRay 我同意,但我无法删除答案,因为它已被接受,所以我将对其进行编辑
    • @AndyRay你对如何解决这个问题有什么建议吗? Jovana 的原始答案对我有用。但我同意我有点困惑,因为我是新手,我不觉得 useEffect 容易理解
    • @IgorFerreira我已经更新了我的答案,现在应该没问题
    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2017-11-01
    • 2021-04-28
    • 1970-01-01
    • 2021-01-02
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多