当Reactjs中的状态更改时,呈现新组件而不替换旧组件

oyt4ldly  于 2022-11-29  发布在  React
关注(0)|答案(1)|浏览(179)

当状态变量data中有数据时,我想渲染Box组件。当状态更新时(在后台从服务器获取数据),我想用新数据渲染另一个Box组件,并在每次状态改变时继续添加Box组件。
问题是每次状态改变时,整个组件都会被新的Box组件替换。
这是一个概述,我实际上想做什么,而不是重复代码-〉只是一个例子。

//box component
function Box(props){
    return(
        <div style={{ "height": props.height, "width": props.width, "backgroundColor": props.color }}></div>
    );
}

function boxMarkup(){

    if(data.length == 0){
        return "";
    }

    if(data.length == 1){
        return(
            <div className="col-1">
                <Box height={data.height + "px"} width={data.width + "px"} color={data.color} />
            </div>
        );
    }

    if(data.length == 2){
        return(
            <div className="col-2">
                {
                    data.map(item => <Box key={item.id} height={item.height + "px"} width={item.width + "px"} color={item.color} />)
                }
            </div>
        );
    }

    if(data.length == 4){
        return(
            <div className="col-4">
                {
                    data.map(item => <Box key={item.id} height={item.height + "px"} width={item.width + "px"} color={item.color} />)
                }
            </div>
        );
    }
}

//return component markup
return(
    <div>
        <EmailSent message={emailSentMessage.message} />
        {boxMarkup()}
    </div>
);

所以基本上我想用新的数据渲染一个新的Box组件,同时在屏幕上保留旧的Box组件。

xfb7svmp

xfb7svmp1#

目前,每次状态更新时,都会执行boxMarkup函数。因此,每次只执行一个if条件,并且boxMarkup函数只返回一个项目。
为了解决这个问题,你应该声明一个新的状态来保存你所有的元素,然后在你的boxMarkup函数中更新它,每次你的data被更新:

const [boxItems, setBoxItems] = useState([]);

useEffect(() => {
  boxMarkup();
}, [data]);

function boxMarkup(){
  const newBox = data.length == 0 ? "" : data.length === 3 ? null :
    (
      <div className=`col-${data.length}`>
        data.map(item => (
          <Box height={item.height + "px"} width={item.height + "px"} color={item.color} />
        )
      </div>
    );
  setBoxItems([...boxItems, newBox]);
}

最后呈现UI:

return(
    <div>
        <EmailSent message={emailSentMessage.message} />
        {boxItems}
    </div>
);

更新:您在data.length === 1时遇到键错误,因为您尝试使用data.height,data.width,data. color。您应该改用data[0].height,data[0].width,data[0]. color。

相关问题