Ios React Native-处于未正确更新状态的对象数组

Ios React Native-处于未正确更新状态的对象数组,ios,reactjs,react-native,state,Ios,Reactjs,React Native,State,我真的觉得我快疯了。所以我做了一个购物类的应用,添加到购物车等 我对每个项目都有额外的评论,用户可以输入他们想要的任何文本。输入的“onChangeText”的状态是正确的,我用控制台检查了它。但是,当我想保存它时(在编辑购物车之后),尽管console.log有意义,并且显示了正确的状态等,选项成功更改,但是注释没有。这是非常奇怪的,因为除了注释之外,其他所有cart数组对象都发生了变化。代码如下: saveItemCart() { var index = this.state.car

我真的觉得我快疯了。所以我做了一个购物类的应用,添加到购物车等

我对每个项目都有额外的评论,用户可以输入他们想要的任何文本。输入的“onChangeText”的状态是正确的,我用控制台检查了它。但是,当我想保存它时(在编辑购物车之后),尽管console.log有意义,并且显示了正确的状态等,
选项
成功更改,但是
注释
没有。这是非常奇怪的,因为除了注释之外,其他所有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 })
        })
    }