为了账号安全,请及时绑定邮箱和手机立即绑定

无法将 React 组件推送到数组中

无法将 React 组件推送到数组中

烙印99 2022-10-13 10:43:28
我在使用 React 将组件推送到数组时遇到问题,代码如下:import React, { useState } from 'react';import NewPageSidebar from '../NewPageSidebar/NewPageSidebar';import NewPageContent from '../NewPageContent/NewPageContent';import TextBlock from '../TextBlock/TextBlock';const NewPage = () => {    const [blocks, setBlocks] = useState([]);    const textButtonHandler = () => {        const key = blocks.length;        let array = blocks;        array.push(<TextBlock key={key} />);        setBlocks(array);        // This works        // setBlocks(<TextBlock key={key} />);    };    const imageButtonHandler = () => {    };    const spacingButtonHandler = () => {    };    return (        <div className="d-flex">            <NewPageSidebar                textButtonHandler={textButtonHandler}                imageButtonHandler={imageButtonHandler}                spacingButtonHandler={spacingButtonHandler}            />            <NewPageContent blocks={blocks} />        </div>    );};export default NewPage;出于某种原因,设置数组直接setBlocks(<TextBlock key={key} />);有效,但推送无效。我在这里做错了什么?
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

这里的问题不在于组件未能添加到阵列中。问题在于它的添加方式。


根据文档。你不应该直接改变状态。由于状态是一个变异操作,因此状态正在发生变异,因此重新渲染可能不起作用。


始终创建一个新数组,然后将旧部分和新部分合并在一起。


const textButtonHandler = () => {

    const key = blocks.length;

    // This should work

    setBlocks([...blocks, <TextBlock key={key} />]);

    // Code below should also work, because concat does not mutate original state

    // const array = blocks;

    // array.concat(<TextBlock key={key} />);

    // setBlocks(array);

};


查看完整回答
反对 回复 2022-10-13
?
九州编程

TA贡献1785条经验 获得超4个赞

React 状态管理使用shallow comparison。基于比较,它更新状态并重新渲染组件。如果引用相同,则不会进行渲染。


let array = blocks; //It create reference to array block.

//即使我们将元素推入数组,我们也不会改变状态块


array.push(<TextBlock key={key} />);  // still array and block having same reference


setBlocks(array); // this will passed the same array reference

由于参考相同,因此没有突变。因此,没有状态更新,因此没有重新渲染。


要使其工作,请进行以下更改。


改为setBlocks(array);使用setBlocks([...array]);


或者


let array = [...blocks];


查看完整回答
反对 回复 2022-10-13
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号