Изменение данных AsyncStorage Item REACT NATIVE - PullRequest
0 голосов
/ 10 апреля 2020

Я создаю корзину в приложении Android. Я застреваю при удалении товаров из корзины. Моя система проста. Когда кто-то что-то добавляет в корзину: один объект сначала сохраняется в AsyncStorage. Затем в моем компоненте корзины я также получаю элемент с AsyncStorage. Этот товар называется «корзина».

В просмотрах моей корзины у меня есть изображение, цена и количество каждого товара. Две кнопки позволяют пользователю изменять количество каждого элемента. Но я застреваю с удалением элемента. Я использую слайс, чтобы заставить элемент исчезнуть, но он просто исчезает из моего компонента корзины, а элемент все еще находится в AsyncStorage, поэтому каждый раз, когда я обновляю sh компонент корзины, элементы, которые были удалены с помощью фрагмента, снова появляются с функцией GetItem.

Итак, я пытаюсь удалить объект из AsyncStorage и из моего компонента корзины. Это моя корзина предметов AssyncStorage:

onClickAddCart(data){

    const itemcart = {
      food: data,
      quantity:  1,
      price: data.price
    }

    AsyncStorage.getItem('cart').then((datacart)=>{
        if (datacart !== null) {
          // We have data!!
          const cart = JSON.parse(datacart)
          cart.push(itemcart)
          AsyncStorage.setItem('cart',JSON.stringify(cart));
        }
        else{
          const cart  = []
          cart.push(itemcart)
          AsyncStorage.setItem('cart',JSON.stringify(cart));
        }
        alert("Add Cart")
      })
      .catch((err)=>{
        alert(err)
      })
  }

}

Это мой товар

componentDidMount(){
AsyncStorage.getItem('cart').then((cart)=>{
  if (cart !== null) {
    const cartfood = JSON.parse(cart)
    this.setState({dataCart:cartfood})
  }
})
.catch((err)=>{
  alert(err)
})

}

Это моя система корзины

onChangeQuat(i, type){
        const cart = this.state.dataCart
        let cant = cart[i].quantity;

        if(type){
            cant = cant + 1
            cart[i].quantity = cant
            this.setState({
                dataCart:cart
            })
        }
        else if (type == false&&cant>=2){
            cant = cant -1
            cart[i].quantity = cant
            this.setState({
                dataCart:cart
            })
        }
        else if (type==false&&cant==1){
            AsyncStorage.setItem(cart, JSON.stringify({quantity: null }));
            cart.splice(i,1)
            this.setState({
                dataCart:cart
            })
        }
    }

Ошибка, которую я получаю: «Вы пытаетесь установить ключ '0' со значением ..." количество ": 1 ... для объекта, который должен быть неизменным и был замороженная.

1 Ответ

0 голосов
/ 10 апреля 2020

Вы можете использовать комбинацию AsyncStorage.setItem () и AsyncStorage.mergeItem () для обновления корзины элементами корзины.

removeCartItem = async (index) => {
    try {
        const cart = await AsyncStorage.getItem('cart');
        let cartItems = JSON.parse(cart);
        const updatedCartItems = cartItems.filter(function (e, itemIndex) { return itemIndex !== index });

        await AsyncStorage.setItem('cart', JSON.stringify(updatedCartItems));
        await AsyncStorage.mergeItem('cart', JSON.stringify(updatedCartItems));

    } catch (error) {
        console.log('error: ', error);
    }
};
...