亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Vue中的計算屬性不計算

Vue中的計算屬性不計算

冉冉說 2022-12-29 16:24:10
我有一個用 Vue 構建的電子商務應用程序 (SPA),下面是商店的快照state: {    cart: [],    totalItems: {      count: 0    }},getters: {    totalItems(){      if(window.localStorage.totalItems){        return JSON.parse(window.localStorage.totalItems)      }      else{        let totalItems = { count: 0}        return totalItems      }    }},mutations: {    setCart(state, cart){      state.cart = cart      window.localStorage.cart = JSON.stringify(cart)    },    setTotalItems(state, totalItems){      state.totalItems = totalItems      window.localStorage.totalItems = JSON.stringify(totalItems)    }},actions: {    addToCart({ commit, getters }, productId){      let cart = getters.cart      let totalItems = getters.totalItems      if(cart.length == 0){        cart.push({id: productId, quantity: 1})        totalItems.count++      }      else if(cart.find(({ id }) => id == productId)){        let item = cart.find(({ id }) => id == productId)        item.quantity++        totalItems.count++      }      else{        cart.push({id: productId, quantity: 1})        totalItems.count++       }       commit('setCart', cart)       commit('setTotalItems', totalItems)    },    setTotalItems({ commit }, totalItems){      commit('setTotalItems', totalItems)    }}在我的 App.vue 文件中如下 -<template>  <v-app>    <v-app-bar      app      color="red"      dark    >      <v-btn text to="/">Vue Shop</v-btn>      <v-spacer></v-spacer>      <v-btn text to="/cart">        <v-badge v-if="totalItems.count" :content="totalItems.count"><v-icon>mdi-cart</v-icon></v-badge>      </v-btn>    </v-app-bar>    <v-main>      <router-view></router-view>    </v-main>  </v-app></template><script></script>當我加載網站時,我可以看到計算屬性正在計算。但是,當我單擊下面顯示的 Home.vue 文件上的“添加到”按鈕時,它應該調用 addToCart 方法依次從商店調度 addToCart 操作我在哪里計算 totalItems 并使用 setTotalItems 突變設置值我面臨的問題是,當我單擊“添加到”按鈕時,我可以看到 totalItems 的值在 localStorage 中更新,但它沒有反映在 v-app-bar 組件中。只有當我導航到另一個頁面然后返回主頁時,它才會這樣做。當我通過將值存儲在狀態而不是 localStorage 中來實現時,它會正確反映,而無需導航到其他頁面。有沒有辦法在仍然使用 localStorage 而不是商店的同時實現這一目標
查看完整描述

1 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

問題本地存儲不是反應性的,因此您的吸氣劑永遠不會重新評估。


解決方案 您可以重寫您的 getter,以便它僅在狀態尚未初始化時從本地存儲中檢索值。隨后的調用應該直接訪問該狀態,因為您正在更改您的增變器中的狀態,這將觸發對您的 getter 的重新評估,從而觸發您的計算屬性:


getters: {

    totalItems(state){

      if(state.totalItems.count < 0){

        return JSON.parse(window.localStorage.totalItems || '{count: 0}')

      }


      return state.totalItems;

    }

},

然后您可以初始化您的countwith -1,因此 getter 的第一次評估將查看本地存儲。


通過在你的 getter 中引用這個totalItems屬性,vue 知道只要這個屬性改變就重新評估這個 getter。


這里的缺點是,在第一次更改計數之前,您的 getter 和您的狀態不會同步。


您可能還可以通過調用 localStorage 來初始化您的狀態,然后從 getter 中刪除它。


state: {

   totalItems: {

      count: JSON.parse(window.localStorage.totalItems || '{count: 0}')

   }

},

getters: {

    totalItems(state){

      return state.totalItems;

    }

},

好處:你的狀態和吸氣劑是同步的,但這也會讓你的吸氣劑變得多余。


查看完整回答
反對 回復 2022-12-29
  • 1 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號