Ios React Native-处于未正确更新状态的对象数组
我真的觉得我快疯了。所以我做了一个购物类的应用,添加到购物车等 我对每个项目都有额外的评论,用户可以输入他们想要的任何文本。输入的“onChangeText”的状态是正确的,我用控制台检查了它。但是,当我想保存它时(在编辑购物车之后),尽管console.log有意义,并且显示了正确的状态等,Ios React Native-处于未正确更新状态的对象数组,ios,reactjs,react-native,state,Ios,Reactjs,React Native,State,我真的觉得我快疯了。所以我做了一个购物类的应用,添加到购物车等 我对每个项目都有额外的评论,用户可以输入他们想要的任何文本。输入的“onChangeText”的状态是正确的,我用控制台检查了它。但是,当我想保存它时(在编辑购物车之后),尽管console.log有意义,并且显示了正确的状态等,选项成功更改,但是注释没有。这是非常奇怪的,因为除了注释之外,其他所有cart数组对象都发生了变化。代码如下: saveItemCart() { var index = this.state.car
选项
成功更改,但是注释
没有。这是非常奇怪的,因为除了注释之外,其他所有cart数组对象都发生了变化。代码如下:
saveItemCart() {
var index = this.state.cartItems.indexOf(x => x.date === this.state.dateAdded);
let cartItemsArray = this.state.cartItems;
temp = { 'catNumber': this.state.catNumber, 'itemNumber': this.state.itemNumber, 'quantity': this.state.itemQuantity, 'options': this.state.selectedOptions, 'date': this.state.dateAdded, 'comments': this.state.commentsText};
cartItemsArray[index] = temp;
this.setState({ cartItems: cartItemsArray }, () => {
this.updateTotal();
this.setState({ selectedOptions: [], checked: [] })
})
}
声明:
state = {
ModalItemShown: false,
ModalCartShown: false,
ModalEditShown: false,
isShowToast: false,
isShowToastError: false,
rest_id: this.props.route.params['restaurantid'],
menuData: this.getMenu(),
catNumber: 1,
itemNumber: 1,
dateAdded: null,
commentsText: "",
cartItems: [],
checked: [],
selectedOptions: [],
total: 0,
itemQuantity: 1,
}
输入(渲染内部):
this.setState({commentsText:text},()=>{console.log(this.state.commentsText)}/>
{
让我的=这个;
这个.showtoos(真的);
setTimeout(函数(){my.showtoos(false)},1000);
这个.saveItemCart();
this.hideModalEdit(false);
}}
>拯救
问题在于编辑购物车模式(即页面)的输入。如果用户在将注释添加到购物车之前先放置注释,那么当用户打开编辑模式时,注释是正确的。如果我在“编辑”中更改它并单击“保存”,然后再次选中,则它将不起作用
更新总计:
updateTotal() {
var cartArrayLen = this.state.cartItems.length;
var i;
var j;
var total = 0;
var cart = this.state.cartItems;
for (i = 0; i < cartArrayLen; i++) {
var catNum = cart[i]["catNumber"];
var itemNum = cart[i]["itemNumber"];
var q = cart[i]["quantity"];
var itemPrice = this.state.menuData[catNum - 1][catNum.toString()]["itemsarray"][itemNum]["price"];
itemPrice = Number(itemPrice.replace(/[^0-9.-]+/g, ""));
total = total + (itemPrice * q);
var allItemOptions = this.state.menuData[catNum - 1][catNum.toString()]["itemsarray"][itemNum].options;
var k;
for (k = 0; k < cart[i].options.length; k++) {
var title = cart[i].options[k]["title"];
var index_onmenu = allItemOptions.findIndex(x => x.title === title);
var option_price;
if (Array.isArray(cart[i].options[k].indexes)) {
for (j = 0; j < cart[i].options[k].indexes.length; j++) {
var price_index = cart[i].options[k].indexes[j];
option_price = allItemOptions[index_onmenu].price[price_index]
total = total + Number(option_price) * q
}
} else {
j = cart[i].options[k].indexes
option_price = allItemOptions[index_onmenu].price[j]
total = total + Number(option_price) * q
}
}
};
console.log("New Total: " + total);
this.setState({ total: total }, () => {
this.setState({ itemQuantity: 1 })
})
}
updateTotal(){
var cartArrayLen=this.state.carttItems.length;
var i;
var j;
var合计=0;
var cart=this.state.cartItems;
对于(i=0;ix.title==title);
var期权价格;
if(Array.isArray(购物车[i]。选项[k]。索引)){
对于(j=0;j{
this.setState({itemQuantity:1})
})
}
我不知道您在哪里定义了temp
变量,但假设它是在某个地方定义的,我认为问题在于如何更新cartItems数组。让我通过在代码中添加一些注释来解释:
saveItemCart(){
var index=this.state.cartItems.indexOf(x=>x.date==this.state.dateAdded);
让cartItemsArray=this.state.cartItems;//-->这里您只是从状态复制数组引用
temp={'catNumber':this.state.catNumber,'itemNumber':this.state.itemNumber,'quantity':this.state.itemQuantity,'options':this.state.selectedOptions,'date':this.state.dateAdded,'comments':this.state.commentsText};
cartItemsArray[索引]=温度;
这个.setState({cartItems:cartItemsArray},()=>{/-->然后您只需更新保留相同引用的数组的内容
this.updateTotal();
this.setState({selectedOptions:[],checked:[]})
})
}
尝试创建一个新数组,以便react-shallow比较算法可以跟踪状态更改,如下所示:
this.setState({cartItems:Array.from(cartItemsArray)},/*您的回调*/);
或
this.setState({cartItems:[…cartItemsArray]},/*您的回调*/);
希望有帮助 我不知道您在哪里定义了
temp
变量,但假设它是在某个地方定义的,我认为问题在于如何更新cartItems数组。让我通过在代码中添加一些注释来解释:
saveItemCart(){
var index=this.state.cartItems.indexOf(x=>x.date==this.state.dateAdded);
让cartItemsArray=this.state.cartItems;//-->这里您只是从状态复制数组引用
temp={'catNumber':this.state.catNumber,'itemNumber':this.state.itemNumber,'quantity':this.state.itemQuantity,'options':this.state.selectedOptions,'date':this.state.dateAdded,'comments':this.state.commentsText};
cartItemsArray[索引]=温度;
这个.setState({cartItems:cartItemsArray},()=>{/-->然后您只需更新保留相同引用的数组的内容
this.updateTotal();
this.setState({selectedOptions:[],checked:[]})
})
}
尝试创建一个新数组,以便react-shallow比较算法可以跟踪状态更改,如下所示:
this.setState({cartItems:Array.from(cartItemsArray)},/*您的回调*/);
或
this.setState({cartItems:[…cartItemsArray]},/*您的回调*/);
希望有帮助 请添加updateTotal()代码。@Rajan我将其添加到帖子:)请添加updateTotal()代码。@Rajan我将其添加到帖子:)嘿,谢谢。但不幸的是,这不起作用。声明了Temp,但奇怪的是,两个Temp变量都是正确的。cartItemsArray是正确的。这是在设定状态,电动汽车
updateTotal() {
var cartArrayLen = this.state.cartItems.length;
var i;
var j;
var total = 0;
var cart = this.state.cartItems;
for (i = 0; i < cartArrayLen; i++) {
var catNum = cart[i]["catNumber"];
var itemNum = cart[i]["itemNumber"];
var q = cart[i]["quantity"];
var itemPrice = this.state.menuData[catNum - 1][catNum.toString()]["itemsarray"][itemNum]["price"];
itemPrice = Number(itemPrice.replace(/[^0-9.-]+/g, ""));
total = total + (itemPrice * q);
var allItemOptions = this.state.menuData[catNum - 1][catNum.toString()]["itemsarray"][itemNum].options;
var k;
for (k = 0; k < cart[i].options.length; k++) {
var title = cart[i].options[k]["title"];
var index_onmenu = allItemOptions.findIndex(x => x.title === title);
var option_price;
if (Array.isArray(cart[i].options[k].indexes)) {
for (j = 0; j < cart[i].options[k].indexes.length; j++) {
var price_index = cart[i].options[k].indexes[j];
option_price = allItemOptions[index_onmenu].price[price_index]
total = total + Number(option_price) * q
}
} else {
j = cart[i].options[k].indexes
option_price = allItemOptions[index_onmenu].price[j]
total = total + Number(option_price) * q
}
}
};
console.log("New Total: " + total);
this.setState({ total: total }, () => {
this.setState({ itemQuantity: 1 })
})
}