1. 程式人生 > >vue--vuex詳解

vue--vuex詳解

  Vuex

    什麼是Vuex?

       官方說法:Vuex 是一個專為 Vue.js應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。

      個人理解:Vuex是用來管理元件之間通訊的一個外掛

    為什麼要用Vuex?

      我們知道元件之間是獨立的,元件之間想要實現通訊,我目前知道的就只有props選項,但這也僅限於父元件和子元件之間的通訊。如果兄弟元件之間想要實現通訊呢?嗯..,方法應該有。拋開怎麼實現的問題,試想一下,當做中大型專案時,面對一大堆元件之間的通訊,還有一大堆的邏輯程式碼,會不會很抓狂??那為何不把元件之間共享的資料給“拎”出來,在一定的規則下管理這些資料呢? 這就是Vuex的基本思想了。

    Vuex有什麼特性?

    怎麼使用Vuex?

      引入Vuex.js檔案 

      建立例項:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <
title>Document</title> </head> <script src="./js/vuex.js"></script> <script src="./js/vue2.0.js"></script> <body> <div id="app"> </div> </body> <script> Vue.use(Vuex);//在建立Vue例項之前 var myStore = new Vuex.Store({ state:{
//存放元件之間共享的資料 name:"jjk" }, mutations:{ //顯式的更改state裡的資料 }, getters:{ //獲取資料的方法 }, actions:{ // } }); new Vue({ el:"#app", data:{ name:"dk" }, store:myStore, mounted:function(){ console.log(this)//控制檯 } }) </script> </html>

  先解釋上面程式碼的意思:

    new Vuex.Store({}) 表示建立一個Vuex例項,通常情況下,他需要注入到Vue例項裡. Store是Vuex的一個核心方法,字面上理解為“倉庫”的意思。Vuex Store是響應式的,當Vue元件從store中讀取狀態(state選項)時,若store中的狀態發生更新時,他會及時的響應給其他的元件(類似雙向資料繫結) 而且不能直接改變store的狀態,改變狀態的唯一方法就是,顯式地提交更改(mutations選項)

  他有4個核心選項:state mutations  getters  actions   (下文會仔細分析)

  這是上面程式碼:

  那如何獲取到state的資料呢?

    一般會在元件的計算屬性(computed)獲取state的資料(因為,計算屬性會監控資料變化,一旦發生改變就會響應)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./js/vuex.js"></script>
<script src="./js/vue2.0.js"></script>
<body>
    <div id="app">
        <hello></hello>
    </div>
</body>
<script>
    Vue.use(Vuex);
   var myStore =  new Vuex.Store({
        state:{
            //存放元件之間共享的資料
            name:"jjk"
        },
         mutations:{
             //顯式的更改state裡的資料
         },
         getters:{
             //過濾state資料
         },
         actions:{
             //
         }
    });

    Vue.component('hello',{
        template:"<p>{{name}}</p>",
        computed: {
            name:function(){
                return this.$store.state.name
            }
        },
         mounted:function(){
            console.log(this)
        }
    })
    new Vue({
        el:"#app",
        data:{
            name:"dk"
        },
        store:myStore,
        mounted:function(){
            console.log(this)
        }
    })
</script>
</html>

  在·chrome中顯示:

  

      state:用來存放元件之間共享的資料。他跟元件的data選項類似,只不過data選項是用來存放元件的私有資料。

      getters:有時候,我們需要對state的資料進行篩選,過濾。這些操作都是在元件的計算屬性進行的。如果多個元件需要用到篩選後的資料,那我們就必須到處重複寫該計算屬性函式;或者將其提取到一個公共的工具函式中,並將公共函式多處匯入 - 兩者都不太理想。如果把資料篩選完在傳到計算屬性裡就不用那麼麻煩了,getters就是幹這個的,你可以把getters看成是store的計算屬性。getters下的函式接收接收state作為第一個引數。那麼,元件是如何獲取經過getters過濾的資料呢? 過濾的資料會存放到$store.getters物件中。具體看一個例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./js/vuex.js"></script>
<script src="./js/vue2.0.js"></script>
<body>
    <div id="app">
        <hello></hello>
    </div>
</body>
<script>
    Vue.use(Vuex);
   var myStore =  new Vuex.Store({
        state:{
            //存放元件之間共享的資料
            name:"jjk",
            age:18
        },
         mutations:{
             //顯式的更改state裡的資料
         },
         getters:{
             getAge:function(state){
                 return state.age;
             }
         },
         actions:{
             //
         }
    });

    Vue.component('hello',{
        template:"<p>姓名:{{name}} 年齡:{{age}}</p>",
        computed: {
            name:function(){
                return this.$store.state.name
            },
            age:function(){
                return this.$store.getters.getAge
            }
        },
         mounted:function(){
            console.log(this)
        }
    })
    new Vue({
        el:"#app",
        data:{
            name:"dk"
        },
        store:myStore,
        mounted:function(){
            console.log(this)
        }
    })
</script>
</html>

    在chrome中顯示:

    mutations:前面講到的都是如何獲取state的資料,那如何把資料儲存到state中呢?在 Vuex store 中,實際改變 狀態(state) 的唯一方式是通過 提交(commit) 一個 mutation。  mutations下的函式接收state作為引數,接收一個叫做payload(載荷)的東東作為第二個引數,這個東東是用來記錄開發者使用該函式的一些資訊,比如說提交了什麼,提交的東西是用來幹什麼的,包含多個欄位,所以載荷一般是物件(其實這個東西跟git的commit很類似)還有一點需要注意:mutations方法必須是同步方法!   具體看例項:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./js/vuex.js"></script>
<script src="./js/vue2.0.js"></script>
<body>
    <div id="app">
        <hello></hello>
    </div>
</body>
<script>
    Vue.use(Vuex);
   var myStore =  new Vuex.Store({
        state:{
            //存放元件之間共享的資料
            name:"jjk",
            age:18,
            num:1
        },
         mutations:{
             //顯式的更改state裡的資料
             change:function(state,a){
                //  state.num++;
               console.log(state.num += a); 
               
             }
         },
         getters:{
             getAge:function(state){
                 return state.age;
             }
         },
         actions:{
             //
         }
    });

    Vue.component('hello',{
        template:"<p @click='changeNum'>姓名:{{name}} 年齡:{{age}} 次數:{{num}}</p>",
        computed: {
            name:function(){
                return this.$store.state.name
            },
            age:function(){
                return this.$store.getters.getAge
            },
            num:function(){
                return this.$store.state.num
            }
        },
         mounted:function(){
            console.log(this)
        },
        methods: {
            changeNum: function(){
                //在元件裡提交
                // this.num++;
                this.$store.commit('change',10)
            }
        },
        data:function(){
            return {
                // num:5
            }
        }
    })
    new Vue({
        el:"#app",
        data:{
            name:"dk"
        },
        store:myStore,
        mounted:function(){
            console.log(this)
        }
    })
</script>
</html>

  當點選p標籤前,chrome中顯示:

點選p標籤後:

  可以看出:更改state的資料並顯示在元件中,有幾個步驟:1. 在mutations選項裡,註冊函式 函式裡面裝邏輯程式碼。2.在元件裡,this.$store.commit('change',payload)  注意:提交的函式名要一一對應  3.觸發函式,state就會相應更改 4.在元件的計算屬性裡 this.$store.state 獲取你想要得到的資料

      actions:既然mutations只能處理同步函式,我大js全靠‘非同步回撥’吃飯,怎麼能沒有非同步,於是actions出現了...  

        actions和mutations的區別

          1.Actions 提交的是 mutations,而不是直接變更狀態。也就是說,actions會通過mutations,讓mutations幫他提交資料的變更。

          2.Action 可以包含任意非同步操作。ajax、setTimeout、setInterval不在話下

  再來看一下例項:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./js/vuex.js"></script>
<script src="./js/vue2.0.js"></script>
<body>
    <div id="app">
        <hello></hello>
    </div>
</body>
<script>
    Vue.use(Vuex);
   var myStore =  new Vuex.Store({
        state:{
            //存放元件之間共享的資料
            name:"jjk",
            age:18,
            num:1
        },
         mutations:{
             //顯式的更改state裡的資料
             change:function(state,a){
                //  state.num++;
               console.log(state.num += a); 
               
             },
             changeAsync:function(state,a){
                 console.log(state.num +=a);
             }
         },
         getters:{
             getAge:function(state){
                 return state.age;
             }
         },
         actions:{
        //設定延時 add:
function(context,value){ setTimeout(function(){
           //提交事件 context.commit(
'changeAsync',value); },1000) } } }); Vue.component('hello',{ template:` <div> <p @click='changeNum'>姓名:{{name}} 年齡:{{age}} 次數:{{num}}</p> <button @click='changeNumAnsyc'>change</button> </div>`, computed: { name:function(){ return this.$store.state.name }, age:function(){ return this.$store.getters.getAge }, num:function(){ return this.$store.state.num } }, mounted:function(){ console.log(this) }, methods: { changeNum: function(){ //在元件裡提交 // this.num++; this.$store.commit('change',10) },
        //在元件裡派發事件 當點選按鈕時,changeNumAnsyc觸發-->actions裡的add函式被觸發-->mutations裡的
changeAsync函式觸發

changeNumAnsyc:
function(){ this.$store.dispatch('add', 5); } }, data:function(){ return { // num:5 } } }) new Vue({ el:"#app", data:{ name:"dk" }, store:myStore, mounted:function(){ console.log(this) } }) </script> </html>

    點選按鈕一秒後,chrome中顯示:

  

    先整明白 context dispatch是什麼東西:

        context:context是與 store 例項具有相同方法和屬性的物件。可以通過context.statecontext.getters來獲取 state 和 getters。

        dispatch:翻譯為‘派發、派遣’的意思,觸發事件時,dispatch就會通知actions(跟commit一樣一樣的)引數跟commit也是一樣的。

    action的大體流程:

      1.在actions選項裡新增函式(非同步)並提交到對應的函式(在mutation選項裡)中  context.commit('changeAsync',value);

actions:{
             add:function(context,value){
                 setTimeout(function(){
                    context.commit('changeAsync',value);
                 },1000)
                 
             }
         }

     2. 在元件裡: changeNumAnsyc:function(){this.$store.dispatch('add', 5);}  將dispatch“指向”actions選項裡的函式

     3. 在mutations選項裡,要有對應的函式 changeAsync:function(state,a){console.log(state.num +=a);}

    總結

    各個型別的 API各司其職,mutation 只管存,你給我(dispatch)我就存;action只管中間處理,處理完我就給你,你怎麼存我不管;Getter 我只管取,我不改的。 action放在了 methods 裡面,說明我們應該把它當成函式來用(講道理,鉤子函式也應該可以的) mutation是寫在store裡面的,這說明,它就是個半成品,中間量,我們不應該在外面去操作它。getter寫在了 computed 裡面,這說明雖然 getter我們寫的是函式,但是我們應該把它當成計算屬性來用。

    對Vuex的瞭解就先到這了,細節以後在補充。。。。。待續

相關推薦

vue--vuex

  Vuex     什麼是Vuex?        官方說法:Vuex 是一個專為 Vue.js應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。       個人理解:Vuex是用來管理元件之間通訊的一個外掛     為什麼要用Vuex

VueVue生命周期

pda -a clas 文本 con 存在 操作 ef6 註意 Vue實例的生命周期全過程(圖) (這裏的紅邊圓角矩形內的都是對應的Vue實例的鉤子函數) 在beforeCreate和created鉤子函數間的生命周期 在beforeC

VueVue組件系統

最終 文件 type html中 emit 監聽 做了 駝峰命名 操作 Vue渲染的兩大基礎方式 new 一個Vue的實例 這個我們一般會使用在掛載根節點這一初始化操作上: new Vue({ el: ‘#app‘ }) 註冊組件並使用 通過

關於Vue.use()

寫上 -c global 新建 code 多人 直接 XML 加載 關於Vue.use()詳解 問題 相信很多人在用Vue使用別人的組件時,會用到 Vue.use() 。例如:Vue.use(VueRouter)、Vue.use(MintUI)。但是用 axios時,就不

Vuex

可維護 語法 接收數據 大量 流程圖 fault 基礎 單獨 裏的 為什麽要單獨增加Vuex? 因為Vuex裏面涉及很多概念性的東西,一時之間弄不懂,當時我在項目中集成Vuex時查了很多資料,踩了不少的坑。如果剛開始接觸Vuex,你肯定會從官方文檔看起,官方給的例子,就是

Vue-multiselectVue.js選擇框解決方案)

type 選擇框 this width port app mount 分享圖片 his github地址:https://github.com/shentao/vue-multiselect 以下代碼,可以直接建一個html文件,運行看到效果: 運行效果: &

Vue Router

公司統一技術框架,選型Vue,Vue全家桶也便成為接下來的學習使用技術框架之一了。接下來一起學習Vue Router。 Vue Router介紹 Vue Router是vue.js官方的路由管理器。它和vue.js的核心深度整合,讓構建單頁面應用變得易如反掌。它主要包含的功能有:

Vue 指令

程式碼塊放上來後,程式碼縮排有點問題,還請諒解,將就看看就好。 1. v-if & v-else &v-show 條件判斷 <!DOCTYPE html> <html> <head> <title>v-if

react router @4 和 vue路由 (二)react-router @4用法

  完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html   2、react-router @4用法   a、大概目錄        不需要像vue那樣麻煩的用到

react router @4 和 vue路由 (一)vue路由基礎和使用

完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 1、vue路由基礎和使用   a、大概目錄            我這裡建了一個router資料夾,資料夾下有index.html

react router @4 和 vue路由 (七)react路由守衛

完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html   12、react路由守衛?   a、在之前的版本中,React Router 也提供了類似的 onEnter 鉤子,但在 React Router 4.0 版

react router @4 和 vue路由 (六)vue怎麼通過路由傳參?

完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 8、vue怎麼通過路由傳參?   a、萬用字元傳引數 //在定義路由的時候 { path: '/describe/:id', name: 'Desc

Vue元件的基礎與高階用法

構建元件 元件基礎 一個元件由 template、data、computed、methods等選項組成。需要注意: template 的 DOM 結構必須有根元素 data 必須是函式,資料通過 return 返回出去 // 示例:定義一個元件 MyCompon

vue-cli

1.何為vue-cli 簡單來說就是Vue搭建的架子 2.安裝 全域性安裝vue-cli npm isntall -g vue-cli 3.初始化建立專案 vue init <template-name> <p

前端三大框架Vue框架

Vue框架誕生於2014年,其作者為中國人——尤雨溪,也是新人最容易入手的框架之一,不同於React和Angular,其中文文件也便於大家閱讀和學習。Vue用於構建互動式的Web介面的庫,是一個構建資料驅動的Web介面漸進式框架,該框架遵循CMD規範,並且提供的設計模式為MV

前端框架vue.js

Vue.js 是一個JavaScriptMVVM庫,是一套構建使用者介面的漸進式框架。 摘要 2016年最火的前端框架當屬Vue.js了,很多使用過vue的程式設計師這樣評價它,“vue.js兼具angular.js和react.js的優點,並剔除了它們的缺點”。授予了

Vue例項

Vue例項初始化的選項配置物件詳解 前面我們已經用了很多次 new Vue({…})的程式碼,而且Vue初始化的選項都已經用了data、methods、el、computedd等,估計您看到這裡時,應該已經都明白了他們的作用,我們就詳細講解一下他們的使用情況。

Vue-CLI3

tcs dev 新版本 是什麽 準備 分享 pack git webpack vue-cli3快速開始 node 安裝,略。 webpack 安裝webpack npm install webpack webpack-cli -g 查看版本 webpack -v

七. Vue Router

#### 1. 認識路由 ##### 1.1 路由概念 **路由是什麼?** 路由是一個網路工程裡面的術語。 路由(routing)就是通過互聯的網路把資訊從源地址傳輸到目的地址的活動 --- 維基百科 **路由器提供了兩種機制:路由和轉送** 路由是決定資料包從來源到目的地的路徑 轉送將輸入端

九. Vuex

#### 1. 理解Vuex ##### 1.1 Vuex功能 **官方解釋** Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用 集中式儲存 管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 也整合到 Vue 的官方除錯工具 `devtools