亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法將 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 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號