【问题标题】:How to react the changes on localstorage by using computed property如何使用计算属性对本地存储的更改做出反应
【发布时间】:2020-08-27 03:13:31
【问题描述】:

我正在使用组合 API 从本地存储中获取数据。

我正在将一个数组保存到本地存储中并从数组中添加/删除。

export function useCart() {
  const addToCart = (item) => {
    // eslint-disable-next-line no-debugger
    basketItem = JSON.parse(localStorage.getItem("basketArray")) || [];
    var newItem = {
      id: item.id,
      image: item.image,
      price: item.price,
      rating: item.rating,
      title: item.title,
    };
    basketItem.push(newItem);

    localStorage.setItem("basketArray", JSON.stringify(basketItem));
  };

我希望组件中的数组计数在新项目添加到本地存储中的数组时更新

我将计算属性用作:

import { computed } from "@vue/composition-api";
import { useCart } from "../../js/ShoppingCart";
// import Sidebar from "./Sidebar";
export default {
  setup() {
    const { basketItem } = useCart();

    let basketLength = computed(
      () => JSON.parse(localStorage.getItem("basketArray"))?.length
    );

    return { basketLength, basketItem };
  },
  name: "Navbar",
  components: {},
};

length 未按预期更改。它只在第一次加载,其他情况保持不变。

目标是让值对本地存储更改做出反应,同时将值设为computed()

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    localStorage 是一种磁盘存储解决方案,它不会神奇地响应。如果您希望 basketItems 具有反应性。声明为ref

    import { ref } from '@vue/composition-api'
    
    export function useCart() {
      const basketItems = ref([])
      const addToCart = (item) => {
        // eslint-disable-next-line no-debugger
        basketItems.value = JSON.parse(localStorage.getItem("basketArray")) || [];
        var newItem = {
          id: item.id,
          image: item.image,
          price: item.price,
          rating: item.rating,
          title: item.title,
        };
        basketItems.value.push(newItem);
    
        localStorage.setItem("basketArray", JSON.stringify(basketItems.value));
     };
     // remember to return basketItems here
     return { basketItems, addToCart }
    }
    

    然后在组件设置中:

    setup() {
      const { basketItems, addToCart } = useCart();
      const basketLength = computed(() => basketItems.value.length);
      return { basketItems, basketLength, addToCart }
    }
    

    basketItemsbasketLength 在这里都应该是响应式的,您可以通过 addToCart 方法将项目添加到汽车。

    【讨论】:

    • 这是否会使系统对在所有设备、浏览器选项卡中更改或删除的 cart 项目作出反应?最终,我想将本地存储移动到后端的一些数据库中。在这种情况下,可能的解决方法是什么?
    • 我认为它不会在设备和标签之间产生反应。它意味着在会话中是被动的。如果你想跨设备/标签进行响应,你需要一个带有订阅 api 的数据库。也许是 firebase 或类似的东西。
    • 当我将const basketItems = ref([]); basketItems.value = JSON.parse(localStorage.getItem("basketArray")) || []; 移到useCart() 之外以合并以在初始加载时从本地存储加载项目时,我遇到了一些问题。 basketLength 的计数为零,但 basketItems 中有正确的项目。
    • localStorage.setItem("basketArray", JSON.stringify(basketItems)); 应更改为存储basketItems.value
    • 是的。抱歉错过了那部分:)
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2021-08-14
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多