javascript - 从状态中另一个项目的内容设置状态
问题描述
我试图将 setState oforder
设置为catalog
仅当它的内容时true
,我想我需要创建一个函数,如果状态发生order
变化,则始终监听。
这是我的状态
constructor(props) {
super(props)
this.state = {
catalog: [
{
photo: 'https://via.placeholder.com/164x168',
title: 'FirstItem',
description: 'Fugiat nulla incididunt laborum et esse adipisicing esse aliquip.',
size_m: { size: 'M', price: 5000, id: 'FTM', selectedIndicator: '', isSelected: false },
size_l: { size: 'L', price: 8000, id: 'FTL', selectedIndicator: '', isSelected: false },
size_xl: { size: 'XL', price: 10000, id: 'FTXL', selectedIndicator: '', isSelected: false },
},
{
photo: 'https://via.placeholder.com/164x168',
title: 'SecondItem',
description: 'Fugiat nulla incididunt laborum et esse adipisicing esse aliquip.',
size_m: { size: 'M', price: 5000, id: 'SCRM', selectedIndicator: '', isSelected: false },
size_l: { size: 'L', price: 8000, id: 'SCRL', selectedIndicator: '', isSelected: false },
size_xl: { size: 'XL', price: 10000, id: 'SCXL', selectedIndicator: '', isSelected: false },
},
],
order: []
}
}
示例:如果size_m
第一项和size_l
第二项catalog
更改isSelected
为true
,order
则状态应更新为
order: [
{
size_m: { size: 'M', price: 5000, id: 'FTM', selectedIndicator: '', isSelected: true },
size_l: { size: 'L', price: 8000, id: 'SCRL', selectedIndicator: '', isSelected: true }
}
]
这是我的处理函数
setOrder = () => {
const { catalog } = this.state
let catalogOrder = []
catalog.map(item => {
if(item.size_m.isSelected) {
catalogOrder = [item]
}
return this.setState({order: catalogOrder})
})
}
解决方案
将您的处理程序函数更改为这样的东西。使用forEach
代替map
,将setState
调用从回调中取出,并return
从最后一行删除:
setOrder = () => {
const { catalog } = this.state
let catalogOrder = []
catalog.forEach(item => {
if(item.size_m.isSelected) {
catalogOrder.push(item)
}
})
this.setState({order: catalogOrder})
}
该map
方法将原始数组中元素的修改映射到一个新数组上——例如,你想将数组中的每个数字乘以 3——我认为这不是你想要做的。在 MDN 中阅读更多信息map
。
编辑 1:以上内容并不能完全解决您的问题,因为您的代码目前只检查中等大小。我认为实现您想要做的事情的一种方法是在每个catalog
项目下创建一个新属性,以跟踪所选大小,例如:
this.state = {
catalog: [
{
photo: 'https://via.placeholder.com/164x168',
title: 'FirstItem',
description: 'Fugiat nulla incididunt laborum et esse adipisicing esse aliquip.',
selectedSize: '', // this can hold whatever object or reference you need
...
},
...
]
...
}
编辑 2:要适当地触发setOrder
处理程序,请查看这篇文章以观察状态的变化componentDidUpdate()
推荐阅读
- java - WAR 不会在 WildFly 上部署 - 没有错误
- javascript - 如何使用 ngFor 遍历 JSON 嵌套对象
- ruby-on-rails - 我的 Rails 控制器中的这条访问代码行是什么?
- c++ - 用作成员构造函数参数的函数的求值顺序
- php - PHP WordPress 错误 - 可捕获的致命错误:WP_Term 类的对象无法转换为字符串
- php - Laravel - 使用 Eloquent 查询缓存关系表的结果
- javascript - ReactJS,上下文 API)读取另一个组件的状态而不作为道具传递给它?
- c - memcpy 和 memset 与分配和初始化的历史
- excel - 自动化时“无法获取 Workbooks 类的 Open 属性”
- django - 重命名 django-filters 中的字段名称以进行显示