状态更新不影响视图

代码错误

我正在做一个基本的反应项目,在那里我有对象和数组的反应状态,我想在这里完成的是我想将对象推送到images数组,我想在组件中呈现它,所以到目前为止,我在谷歌上搜索了一些方法来完成它,array.concat并且array.push我尝试了这两种方法,它正在更新状态,但它不会影响组件

下面是我试过的代码

const [proClrData, setProClrData] = useState([
  { color: "black", price: "", qty: "", images: [] },
  { color: "white", price: "", qty: "", images: [] },
  { color: "red", price: "", qty: "", images: [] }
]);
const addImages = (key) => {
  var obj = { src: "", imgdata: "" };
  proClrData[key].images = proClrData[key].images.concat(obj);
  console.log(proClrData);
 };

下面是组件代码

 {proClrData.length >= 1 &&
    proClrData?.map((clr, key) => {
      return (
        <div key={key}>
          <p className="pt-3 ">{clr.color}</p>
          <div className="form-group">
            <input
              label="Price"
              name="price"
              value={clr?.price}
              type="number"
              fullWidth
              required
            />
          </div>
          <div className="form-group pt-3">
            <input
              label="Quantity"
              name="qty"
              value={clr?.qty}
              type="number"
              fullWidth
              required
            />
          </div>
          <div className="text-end pt-3">
            <button
              variant="contained"
              color="primary"
              onClick={() => addImages(key)}
            >
              Add Images
            </button>
          </div>
          {clr?.images?.map((img, imgkey) => {
            return (
              <div className="form-group pt-3" key={imgkey}>
                <input
                  label="Image"
                  name="images"
                  value=""
                  accept="image/*"
                  type="file"
                  fullWidth
                  required
                />
              </div>
            );
          })}
        </div>
      );
    })}

这是工作代码的codeSandbox

德鲁里斯

问题

您正在改变状态对象,然后根本不更新状态。

const addImages = (key) => {
  var obj = { src: "", imgdata: "" };
  proClrData[key].images = proClrData[key].images.concat(obj); // mutation!!
  console.log(proClrData);
};

解决方案

使用您希望处于状态的新图像数据将状态更新排入队列。使用功能状态更新从之前的状态进行更新。proClrData数组进行浅拷贝,对于匹配的元素,也进行浅拷贝,使其成为新的对象引用,然后对嵌套images数组进行浅拷贝,追加新对象。

const [proClrData, setProClrData] = useState([
  { color: "black", price: "", qty: "", images: [] },
  { color: "white", price: "", qty: "", images: [] },
  { color: "red", price: "", qty: "", images: [] }
]);

const addImages = (key) => {
  const obj = { src: "", imgdata: "" };
  setProClrData(data => data.map((el, i) => i === key ? {
    ...el,
    images: [...el.images, obj],
  } : el));
};

由于 React 状态更新是异步处理的,因此您需要将控制台日志移动到一个useEffect钩子中,以在状态更新记录状态在下一次渲染时可用

useEffect(() => {
  console.log(proClrData);
}, [proClrData]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

React-redux状态为更新,但我不影响视图

当状态更新不影响UI时,防止“未包装在act(...)中”的玩笑警告

调度的动作不影响Redux存储的状态

AfterViewInit 内的属性绑定不影响视图

输入选中状态不影响css选择器

状态设置方法不影响主要对象-ReactJS

变异函数不影响状态变量

使状态栏透明而不影响导航栏

在不影响视图的情况下更改变量

在不影响性能的情况下批量更新nodejs

当值未更改时,MySQL在更新时不影响行

我必须更新特定的字段而不影响其他字段

更新密钥而不影响嵌套字典中密钥的值

用于循环更新字典值但不影响输出

TypeORM 更新特定列时,保存而不影响 UpdateDateColumn

更新数据库不影响不同情况

如何仅隐藏/显示使用状态的特定组件而不影响使用相同状态的其他组件?

如何在不影响样式的情况下在视图中渲染视图

如何设置视图的Alpha而不影响其子视图及其文本?

CSS不影响PHP

JavaScript不影响div

在React中,如果状态不影响渲染,是否可以跳过setState之后的重新渲染?

ES6反应状态更改不影响渲染内联if子句

Angular JS-指向调用函数上的键绑定,但不影响Ng-Show状态

更改 HTTP 标头中的状态代码而不影响 Yii 1 Restful API 中的返回数据

我应该对所有不影响渲染的变量使用状态吗?

如何在不影响实际状态的情况下过滤减速器中的数组对象

检查软件更新,并在不影响数据库的情况下更新软件

Android Ripple:其他应用如何使它们的波纹如此透明而不影响视图的原始颜色