【问题标题】:useState with arrays not rerendering数组不重新渲染的 useState
【发布时间】:2021-11-18 14:43:17
【问题描述】:

我在使用带有数组的 useState 钩子时遇到问题。我检查了stackoverflow上的各种资源,但无法修复它。

我的基本代码 sn-p 看起来像:

const [users, setUsers] = useState([]);

  function addNewContact(user) {
    const newUsers = [...users,user];
    console.log(newUsers);
    setUsers(newUsers);
  }
<CardContainer users={users}></CardContainer>
class CardContainer extends Component {

    constructor(props) {
        super(props);
        console.log("this -> ");
        console.log(this.props.users);
        this.state = {
            users: this.props.users
        }
    }

    render() {
        //console.log(this.state.users)
        return (
            <div class="row row-cols-1 row-cols-md-2 g-4">
                {
                    this.state.users.map(user => {
                        return <Card id={user.phone} title={user.name} email={user.email} phone={user.phone}></Card>
                    })
                }
            </div>
        )
    }

}

export default CardContainer;

我能够在控制台中看到更新的数组,但使用它的组件不会再次呈现。谁能帮我解决这个问题。

【问题讨论】:

  • 我们需要查看卡片容器的代码。我们需要一个完全可重现的代码示例来使用
  • 添加卡片容器组件
  • 我会为 CardContainer 使用一个函数组件。
  • 不一定能解决问题,但是,重要的是:首先,您需要确保有要渲染的内容,其次您需要提供 key 属性到映射的 &lt;Card /&gt; 组件,即this.state?.users?.map(user =&gt; {return &lt;Card key={user.phone} id ={user.phone}..
  • 我故意使用基于类来理解基于类的组件

标签: reactjs react-hooks


【解决方案1】:

问题是由于您将道具存储在子组件的状态中,该状态是在组件初始化时分配的,并且组件初始化/构造函数只运行一个,直到重新安装。之后,每当父组件的状态发生变化时,子组件都不会重新渲染,因为它使用自己的状态进行映射。

下面的代码只在组件初始化时运行一次。

this.state = {
   users: this.props.users
}

在子组件中,你可以直接使用props,子组件总是会在父组件发生变化时重新渲染。您可以直接从 this.props.users.map 这样的道具映射数组,而不是 this.state.users.map。这样,组件将在父组件的状态更改时重新渲染。

【讨论】:

  • 非常感谢。这解决了问题并且有意义!
  • 太好了……
【解决方案2】:

正如@Junaid 所说,constructor 在组件安装之前只被调用一次。如果确实需要在子组件内部单独设置状态,那么可以使用componentDidUpdate(prevProps)react生命周期方法。确保比较以前和当前的道具,以避免重新渲染的无限循环。

componentDidUpdate(prevProps) {
  if (this.props.users !== prevProps.users) {
    this.setState({ users: this.props.users });
  }
};

【讨论】:

  • 我不会那样做,用 props 制作状态来重新绘制组件是浪费!尤其是在没有进行计算的情况下,即使这样也可以为此类计算创建一些变量。
  • 能否请您帮我看看适合使用 componentDidUpdate 的情况?
  • 是的,这是完全正确的,我完全同意接受的答案。但这只是为了在其他一些情况下有用的知识。假设您需要调用 api 端点以根据 props 或状态更改获取一些数据。然后你可以在这种情况下使用它。了解更多信息。请访问reactjs.org/docs/react-component.html#componentdidupdate
  • 非常感谢 :)
猜你喜欢
  • 2020-01-13
  • 1970-01-01
  • 2021-03-24
  • 2021-03-10
  • 2022-01-04
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多