我希望在状态变量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组件保留在屏幕上.这是我的BoxComponent code美元.

推荐答案

目前,每次状态更新时,都会执行boxMarkup个函数.所以每次只有一个if条件被执行,并且只有1项从boxMarkup函数返回.

为了修复它,您应该声明一个包含所有元素的新状态,然后在您的data每次更新时在boxMarkup函数中更新它:

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>
);

Update:个 在data.length === 1中,由于您try 使用data.Height、data.width、data.color,因此遇到了键错误.相反,您应该使用data[0].Height、data[0].width、data[0].color.

Reactjs相关问答推荐

阻止在ShadCN和React中的FormLabel中添加 colored颜色

为什么Next.js 14无法解析页面路由路径?

在react.js的条形图中获取错误&unfined是不可迭代的

For循环中的元素在Reaction中丢失挂钩

利用OVERPASS API端点计算某建筑的表面积

Redux Provider Stuck甚至彻底遵循了文档

在Reaction常量函数中未更新状态变量

在Reaction中单击并显示子组件延迟/动画

一键MUI导出

在数组对象内的数组上进行映射

如何在MUI x图表条形图上放置圆角?

使用 MUI 菜单时添加新 html 元素时布局意外滚动跳转

React-router-dom的链接不改变路由(ReactRouter6)

从ReactDataGridtry 将数据传递给父组件

Material UI v5.11 - Prop sx 在响应式中写了两次

页面加载时不显示数组中的数据

在 Remix 中使用 chartjs 和 react-chartjs-2 会出现错误react-chartjs-2未在您的 node_modules 中找到

哪个 PrivateRouter 实现更好:高阶组件还是替换?

Cypress 中的 process.env 空对象

Map 函数只返回 Array 中的图像