中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue唯一可以更改vuex實例中state數據狀態的屬性對象Mutation的講解

發布時間:2020-10-24 04:12:10 來源:腳本之家 閱讀:186 作者:muzidigbig 欄目:web開發

更改 Vuex 的 store 中的狀態的唯一方法是提交 mutation。

Vuex 中的 mutation 非常類似于事件:

每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調函數 (handler)。這個回調函數就是我們實際進行狀態更改的地方,并且它會接受 state 作為第一個參數。mutation 必須是同步函數。

不帶載荷(只改變數據的狀態)

接前面幾篇文章的例子,這里我們修改商品價格減半。

store.js

  mutations: {
    //商品價格減半;更改這個數據狀態必須將這個數據源state傳遞過來
    goodsPriceHalve: state => {
      let goodsPriceHalve = state.goodsList.map(currentValue => {
        return {
          name: currentValue.name,
          price: currentValue.price/2
        }
      })
      state.goodsList = goodsPriceHalve;
    }
  }

page5.vue

要喚醒一個 mutation handler,你需要以相應的 type(事件) 調用 store.commit 方法。

<template>
  <div>
    <h3>我是第三個頁面</h3>
    <!-- 直接在HTML標簽中使用 -->
    <div>{{$store.state.goodsList}}</div>
    <br>
    <router-link to='/page6'>更改商品名字</router-link>
    <br>
    <button @click="handleGoodsHavle">商品價格減半</button>
    <ul class="ul_list">
      <li v-for="item in goodsListHalv">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">價格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
      /*
      // mutations不能通過直接賦值的形式改變state的數據狀態
      goodsListHalv: this.$store.state.goodsList,
      */
      // goodsListHalv: []
    }
   },
   /*
  //  mutations不能通過鉤子函數的形式進行賦值
   mounted(){
     this.goodsListHalv = this.$store.state.goodsList
  },
  */
  // 通過計算屬性的方式,是完美的
   computed: {
     goodsListHalv(){
       return this.$store.state.goodsList;
     }
   },
   methods: {
     handleGoodsHavle: function(){
       //這里只通過事件改變數據的狀態
        this.$store.commit('goodsPriceHalve')
     }
   }
  }
</script>

效果圖

Vue唯一可以更改vuex實例中state數據狀態的屬性對象Mutation的講解

提交載荷(Payload)(改變數據狀態的同時傳遞參數)

參數:字符串/對象

這里修改商品名字。

store.js

  // 通過組件上的事件,通過this.$store.commit('mutations中的函數','需要從組件上傳遞給 mutation中這個函數的參數')
  mutations: {
    // 統一修改商品的名稱;changeName(state,payload)參數1 state:數據源,參數2 payload:接收的參數
    changeName: (state,payload) => {
      var changeName = state.goodsList.map(currentValue => {
        return {
          name: payload,//接收參數
          price: currentValue.price/2
        }
      })
      state.goodsList = changeName;
    }
  }

這里的載荷payload可以是一個對象/字符串。

page6.vue

<template>
  <div>
    <h3>我是第四個頁面</h3>
    <div>
      <input type="text" placeholder="請輸入商品的新名字" v-model="inpValue">
      <button @click="changeGoodsName()">商品價格減半</button>
    </div>
    <router-link to='/page7'>action</router-link>
    <ul class="ul_list">
      <li v-for="item in goodsListHalv">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">價格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
      inpValue:'',
    }
   },
   computed: {
     goodsListHalv(){
       return this.$store.state.goodsList;
     }
   },
   methods: {
    //  通過 click事件觸發methods中的函數,進而改變store.js中數據的狀態
     changeGoodsName: function(){
        // this.$store.commit('需要操作mutations中的函數名','從這個組件傳遞給第一個參數的參數')
        this.$store.commit('changeName',this.inpValue)
     }
   }
  }
</script>

這里的載荷payload就是輸入框的值。

效果圖

Vue唯一可以更改vuex實例中state數據狀態的屬性對象Mutation的講解

代碼執行過程

上面的Mutation執行過程是:按鈕點擊–>執行組件中按鈕點擊事件方法–>執行$store.commit('vuex中mutatioms對象中對應的函數名',需要傳遞的參數)–>執行mutations里面對應的方法–>修改state里面對應的數據–>頁面渲染。

Mutation 需遵守 Vue 的響應規則

既然 Vuex 的 store 中的狀態是響應式的,那么當我們變更狀態時,監視狀態的 Vue 組件也會自動更新。這也意味著 Vuex 中的 mutation 也需要與使用 Vue 一樣遵守一些注意事項:

最好提前在你的 store 中初始化好所有所需屬性。當需要在對象上添加新屬性時,你應該使用 Vue.set(obj, 'newProp', 123), 或者以新對象替換老對象。例如,利用 stage-3 的對象展開運算符我們可以這樣寫:

state.obj = { ...state.obj, newProp: 123 }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中阳县| 礼泉县| 龙山县| 凤冈县| 昌都县| 平昌县| 桃江县| 界首市| 怀安县| 泸定县| 金秀| 通江县| 武乡县| 商南县| 柳河县| 边坝县| 尼勒克县| 靖江市| 富民县| 正宁县| 黄陵县| 陵水| 富平县| 彭阳县| 陵川县| 广州市| 资溪县| 高邮市| 调兵山市| 尼勒克县| 萨迦县| 胶州市| 蛟河市| 伊吾县| 济宁市| 陆川县| 信丰县| 正定县| 越西县| 峨边| 淅川县|