最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用 Vuex的入門教程

 更新時間:2022年02月28日 09:46:28   作者:前端不釋卷leo  
在vue中當我們管理數(shù)據(jù)的時候比較亂,我們要用到下面的這個庫,本文主要介紹了如何使用 Vuex的入門教程,具有一定的參考價值,感興趣的可以了解一下

前言

本人曾對 Vuex 作過詳細介紹,但是今天去回顧的時候發(fā)現(xiàn)文章思路有些繁瑣,不容易找到重點。于是,在下班前幾分鐘,我對其重新梳理了一遍。

tips:本文的案例均為Vue2版本。

一、基本概念

Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。

初識vuex

    vuex有什么用?

    比如, vue做了一個音樂app, 里面的播放組件, 這組件應該是在所有的頁面都有用到的.

    希望在所有的頁面都能控制播放器的 暫停/播放, 或者說都可以選擇是否 隨便播放/單曲循環(huán).

    這就涉及到了多組件之間的傳參,而且是非常復雜的傳參.這時候使用vuex是合適的.

二、項目場景

如果你的項目里有很多頁面(組件/視圖),頁面之間存在多級的嵌套關系,此時,如果這些頁面都需要共享一個狀態(tài)的時候,此時就會產生以下兩個問題:

  • 多個視圖依賴同一個狀態(tài)
  • 來自不同視圖的行為需要變更同一個狀態(tài)

解決方案(初版):

  • 對于第一個問題,假如是多級嵌套關系,你可以使用父子組件傳參進行解決,雖有些麻煩,但好在可以解決;對于兄弟組件或者關系更復雜組件之間,雖然可以通過各種各樣的辦法解決,可實在很不優(yōu)雅,而且等項目做大了,代碼量愈發(fā)巨大,實在令人心煩。
  • 對于第二個問題,你可以通過父子組件直接引用,或者通過事件來變更或者同步狀態(tài)的多份拷貝,但是這種模式很脆弱,使得代碼難以維護,而且同樣會讓代碼量劇增。

思路:

  • 把各個組件都需要依賴的同一個狀態(tài)抽取出來,全局統(tǒng)一管理。
  • 在這種模式下,任何組件都可以直接訪問到這個狀態(tài),或者當狀態(tài)發(fā)生改變時,所有的組件都相應更新。

此時,Vuex 就誕生了。 這就是它背后的基本思想,借鑒了 Flux、Redux。與其他模式不同的是,Vuex 是專門為 Vue 設計的狀態(tài)管理庫,以利用 Vue.js 的細粒度數(shù)據(jù)響應機制來進行高效的狀態(tài)更新。

三、如何使用

1、安裝

進入項目,鍵入以下命令:

npm install vuex --save

2、State 初始值

在 src 路徑下創(chuàng)建 store 文件夾,并在該文件夾下新增 index.js 文件:

import Vue from 'vue';
import Vuex from 'vuex';
?
Vue.use(Vuex);
?
const store = new Vuex.Store({
? ? state: {
? ? ? ? // 定義一個name,以供全局使用
? ? ? ? name: 'leo'
? ? }
});
?
export default store;

修改 main.js: 

import Vue from 'vue';
import App from './App';
import store from './store'; ? // 引入我們前面導出的store對象
?
Vue.config.productionTip = false;
?
new Vue({
? ? el: '#app',
? ? store, ? // 把store對象添加到vue實例上
? ? components: { App },
? ? template: '<App/>'
});

最后修改 App.vue:

<template>
? ? <div></div>
</template>
?
<script>
? ? export default {
? ? ? ? mounted() {
? ? ? ? ? ? // 使用this.$store.state.xxx可以直接訪問到倉庫中的狀態(tài)
? ? ? ? ? ? console.log(this.$store.state.name); ? // 'leo'
? ? ? ? }
? ? }
</script>

建議一:this.$store.state.xxx 放在計算屬性中,這樣可以讓你的代碼看起來更優(yōu)雅一些。 

export default {
? ? mounted() {
? ? ? ? console.log(this.getName); ? // 'leo'
? ? },
? ? computed:{
? ? ? ? getName() {
? ? ? ? ? ? return this.$store.state.name;
? ? ? ? }
? ? }
}

建議二:每次都寫 this.$store.state.xxx 讓你感到厭煩,造成代碼冗余,可以使用 mapState。

<script>
import { mapState } from 'vuex'; ? // 從vuex中導入mapState
export default {
? ? mounted() {
? ? ? ? console.log(this.name); ? // 'leo'
? ? },
? ? computed: {
? ? ? ? ...mapState(['name']) ? // 經(jīng)過解構后,自動就添加到了計算屬性中,此時就可以直接像訪問計算屬性一樣訪問它
? ? }
}
</script>

你甚至可以給它取別名:

...mapState({ userName: 'name' }) ? // 賦別名的話,這里接收對象,而不是數(shù)組

3、Getters 修飾值

設想一個場景,你已經(jīng)將 store 中的 name 展示到頁面上了,而且是很多頁面都展示了,此時客戶要求在每個 name 前都加上“hello”。

最容易想到的辦法就是去每個用到 name 的頁面一個一個加上“hello”,顯然這種方式并不友好,原因如下:

第一,假如你在A、B、C三個頁面都用到了 name,那么你要在這A、B、C三個頁面都修改一遍,多個頁面你就要加很多遍這個方法,造成代碼冗余,很不好。

第二,假如下次客戶讓你把“hello”改成“greet”的時候,你又得把三個頁面(甚至更多)都改一遍,這時候你是拿石頭砸自己的腳。

吸取上面的教訓,我們有一個新的思路:直接在 store 中對 name 進行一些操作或者加工,從源頭解決問題!這時候,Getter 閃亮登場! 

首先,在 store 對象中增加 getters 屬性:

const store = new Vuex.Store({
? ? state: {
? ? ? ? name: 'leo'
? ? },
? ? // 在store對象中增加getters屬性
? ? getters: {
? ? ? ? getMessage(state) { ? // 獲取修飾后的name,第一個參數(shù)state為必要參數(shù),必須寫在形參上
? ? ? ? ? ? return `hello ${state.name}`;
? ? ? ? }
? ? }
});

在組件中使用:

export default {
? ? mounted() {
? ? ? ? console.log(this.$store.state.name);
? ? ? ? console.log(this.$store.getters.getMessage); ? // 注意不是$store.state了,而是$store.getters
? ? }
}

建議使用 mapGetters:

<script>
import { mapState, mapGetters } from 'vuex';
export default {
? ? mounted() {
? ? ? ? console.log(this.name); ? // 'leo'
? ? ? ? console.log(this.getMessage); ? // 'hello leo'?
? ? },
? ? computed: {
? ? ? ? ...mapState(['name']),
? ? ? ? ...mapGetters(['getMessage'])
? ? },
}
</script>

你也可以給它取別名: 

...mapGetters({ greetMsg: 'getMessage' }) ? // 賦別名的話,這里接收對象,而不是數(shù)組

4、Mutations 修改值

說到修改值,有的人可能會想到這樣寫:

this.$store.state.xxx = XXX;

首先,這是一種錯誤的寫法。為什么說是錯誤的寫法?因為這個 store 倉庫比較奇怪,你可以隨便拿,但是你不能隨便改,舉個例子:

假如你打開朋友圈,看到你的好友發(fā)了條動態(tài),但是動態(tài)里有個錯別字,你要怎么辦呢?你可以幫他改掉嗎?當然不可以!我們只能通知他本人去修改,因為是別人的朋友圈,你是無權操作的,只有他自己才能操作。同理,在 Vuex 中,我們不能直接修改倉庫里的值,必須用 Vuex 自帶的方法去修改。這個時候,Mutation 閃亮登場!

首先,修改 store/index.js:

const store = new Vuex.Store({
? ? state: {
? ? ? ? name: 'leo',
? ? ? ? number: 0,
? ? },
? ? mutations: { ? // 增加nutations屬性
? ? ? ? setNumber(state) { ? // 增加一個mutations的方法,方法的作用是讓number從0變成5,state是必須默認參數(shù)
? ? ? ? ? ? state.number = 5;
? ? ? ? }
? ? }
});

然后,修改 App.vue:

<script>
export default {
? ? mounted() {
? ? ? ? console.log(this.$store.state.number); ? // 舊值,0
? ? ? ? this.$store.commit('setNumber');
? ? ? ? console.log(this.$store.state.number); ? // 新值,5
? ? },
}
</script>

如果我們想傳動態(tài)參數(shù)怎么辦?

首先,修改 store/index.js:

const store = new Vuex.Store({
? ? state: {
? ? ? ? name: 'leo',
? ? ? ? number: 0,
? ? },
? ? mutations: {
? ? ? ? setNumber(state, num) { ? // 增加一個帶參數(shù)的mutations方法
? ? ? ? ? ? state.number = num;
? ? ? ? },
? ? },
});

相應地,修改 App.vue:

<script>
export default {
? ? mounted() {
? ? ? ? console.log(this.$store.state.number); ? // 舊值,0
? ? ? ? this.$store.commit('setNumber', 666);
? ? ? ? console.log(this.$store.state.number); ? // 新值,666
? ? },
}
</script>

上面的這種傳參的方式雖然可以達到目的,但是并不推薦。建議傳遞一個對象,看起來更美觀,對象的名字你可以隨意命名,一般命名為 payload:

mutations: {
? ? setNumber(state, payload) { ? // 增加一個帶參數(shù)的mutations方法,并且官方建議payload為一個對象
? ? ? ? state.number = payload.number;
? ? },
},

相應地,修改 App.vue:

<script>
export default {
? ? mounted() {
? ? ? ? console.log(this.$store.state.number); ? // 舊值,0
? ? ? ? this.$store.commit('setNumber', { number: 666 }); ?// 調用的時候需要傳遞一個對象
? ? ? ? console.log(this.$store.state.number); ? // 新值,666
? ? },
}
</script>

建議使用 mapMutations:

<script>
import { mapMutations } from 'vuex';
export default {
? ? mounted() {
? ? ? ? this.setNumber({ number: 666 });
? ? },
? ? methods: { ? // 注意,mapMutations是解構到methods里面的,而不是計算屬性了
? ? ? ? ...mapMutations(['setNumber'])
? ? }
}
</script>

你也可以給它取別名: 

methods:{
? ? ...mapMutations({ changeNumber: 'setNumber' }) ? // 賦別名的話,這里接收對象,而不是數(shù)組
}

注意:Mutations 里面的函數(shù)必須是同步操作,不能包含異步操作。

Mutations 只能進行同步操作,所以,我們馬上開始下一節(jié),看看使用 Actions 進行異步操作的時候應該注意什么!

5、Actions 異步修改值

Vuex 不希望你將異步操作放在 Mutations 中,所以就給你設置了一個區(qū)域,讓你進行異步操作,這就是 Actions。

首先,修改 store/index.js:

const store = new Vuex.Store({
? ? state: {
? ? ? ? name: 'leo',
? ? ? ? number: 0,
? ? },
? ? mutations: {
? ? ? ? setNumber(state, payload) {
? ? ? ? ? ? state.number = payload.number;
? ? ? ? },
? ? },
? ? actions: { ? // 增加actions屬性
? ? ? ? setNum(content) { ? // 增加setNum方法,默認第一個參數(shù)是content,其值是復制的一份store
? ? ? ? ? ? return new Promise(resolve => { ?// 模擬異步操作,1秒后修改number為666
? ? ? ? ? ? ? ? setTimeout(() => {
? ? ? ? ? ? ? ? ? ? content.commit('setNumber', { number: 666 });
? ? ? ? ? ? ? ? ? ? resolve();
? ? ? ? ? ? ? ? }, 1000);
? ? ? ? ? ? });
? ? ? ? }
? ? }
});

然后,修改 App.vue:

async mounted() {
? ? console.log(this.$store.state.number); ? // 舊值,0
? ? await this.$store.dispatch('setNum'); ? // 等待異步操作完成
? ? console.log(this.$store.state.number); ? // 新值,666
}

其實 action 就是去提交 mutation 的。異步操作都在 action 中消化了,最后再去提交 mutation。 

當然,你也可以進行動態(tài)傳參。

首先,修改 store/index.js:

actions: {
? ? setNum(content, payload) { ? // 增加payload參數(shù)
? ? ? ? return new Promise(resolve => {
? ? ? ? ? ? setTimeout(() => {
? ? ? ? ? ? ? ? content.commit('setNumber', { number: payload.number });
? ? ? ? ? ? ? ? resolve();
? ? ? ? ? ? }, 1000);
? ? ? ? });
? ? },
}

相應地,修改 App.vue:

async mounted() {
? ? console.log(this.$store.state.number); ? // 舊值,0
? ? await this.$store.dispatch('setNum', { number: 888 });
? ? console.log(this.$store.state.number); ? // 新值,888
}

建議使用 mapActions:

<script>
import { mapActions } from 'vuex';
export default {
? ? methods: {
? ? ? ? ...mapActions(['setNum']), ? // 解構到methods中
? ? },
? ? async mounted() {
? ? ? ? await this.setNum({ number: 888 }); ?// 直接調用即可
? ? }
}
</script>

你也可以給它取別名:

...mapActions({ changeNumber: 'setNum' }) ? // 賦別名的話,這里接收對象,而不是數(shù)組

tips:在 actions 里面,方法的形參可以直接將 commit 解構出來,方便后續(xù)操作。 

actions: {
? ? setNum({ commit }) { ? // 直接將content結構掉,解構出commit,下面就可以直接調用了
? ? ? ? return new Promise(resolve => {
? ? ? ? ? ? setTimeout(() => {
? ? ? ? ? ? ? ? commit('xxx'); ?// 直接調用
? ? ? ? ? ? ? ? resolve();
? ? ? ? ? ? }, 1000);
? ? ? ? });
? ? },
},

四、總結

下班前這幾分鐘,你知道了如何使用 Vuex。你會安裝它,配置它,讀取 state 的值,甚至修飾讀(Getters),然后你會修改里面的值(Mutations),如果有異步操作并且需要修改 state,那你就要使用 Actions。

一張神奇的圖。

五、建議

何時使用 Vuex ?

這個問題因人而異,如果你不需要開發(fā)大型的單頁應用,此時你完全沒有必要使用 Vuex,比如你的頁面就兩三個,使用 Vuex 后增加的文件比你現(xiàn)在的頁面還要多,完全沒這個必要。

假如你的項目達到了中大型應用的規(guī)模,此時你很可能會考慮如何更好地在組件外部對狀態(tài)進行統(tǒng)一管理,甚至會分模塊(Vuex 中的 module,不展開),它將會是一個不錯的選擇。

到此這篇關于如何使用 Vuex的入門教程的文章就介紹到這了,更多相關Vuex 入門教程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 記錄vue做微信自定義分享的一些問題

    記錄vue做微信自定義分享的一些問題

    這篇文章主要介紹了記錄vue做微信自定義分享的一些問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Vue多布局模式實現(xiàn)方法詳細講解

    Vue多布局模式實現(xiàn)方法詳細講解

    這篇文章主要介紹了Vue多布局模式實現(xiàn)方法,多布局模式可以根據(jù)用戶角色所在場景切換頁面布局,是非常常見的基礎功能,感興趣的同學可以參考下文
    2023-05-05
  • Vue中使用debugger在瀏覽器中不起作用的問題及解決

    Vue中使用debugger在瀏覽器中不起作用的問題及解決

    這篇文章主要介紹了Vue中使用debugger在瀏覽器中不起作用的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue鍵盤事件用法總結

    Vue鍵盤事件用法總結

    本篇文章主要介紹了Vue鍵盤事件用法總結,詳細的介紹了各種鍵盤事件的用法,有興趣的可以了解一下
    2017-04-04
  • elementui中el-input回車搜索實現(xiàn)示例

    elementui中el-input回車搜索實現(xiàn)示例

    這篇文章主要介紹了elementui中el-input回車搜索實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Vue-CLI 3.X 部署項目至生產服務器的方法

    Vue-CLI 3.X 部署項目至生產服務器的方法

    這篇文章主要介紹了Vue-CLI 3.X 部署項目至生產服務器的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • vue實現(xiàn)圖片滑動驗證

    vue實現(xiàn)圖片滑動驗證

    這篇文章主要為大家詳細介紹了vue實現(xiàn)圖片滑動驗證,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入探索VueJS Scoped CSS 實現(xiàn)原理

    深入探索VueJS Scoped CSS 實現(xiàn)原理

    這篇文章主要介紹了深入探索VueJS Scoped CSS 實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • vue中關于click.stop的用法

    vue中關于click.stop的用法

    這篇文章主要介紹了vue中關于click.stop的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue模仿實現(xiàn)京東商品大圖放大鏡效果

    Vue模仿實現(xiàn)京東商品大圖放大鏡效果

    這篇文章主要為大家介紹了Vue實現(xiàn)京東網(wǎng)站商品放大鏡效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

响水县| 宣城市| 夹江县| 隆回县| 鄂伦春自治旗| 盐边县| 安阳县| 红河县| 柯坪县| 嘉峪关市| 龙泉市| 乌兰察布市| 临洮县| 甘孜县| 稻城县| 十堰市| 宝清县| 楚雄市| 增城市| 深泽县| 神农架林区| 民权县| 中超| 简阳市| 章丘市| 玉田县| 安吉县| 荆州市| 科技| 运城市| 桦川县| 衡阳市| 来凤县| 新化县| 文登市| 咸丰县| 孟州市| 福清市| 含山县| 靖宇县| 客服|