vuex

vuex  vue 专用 状态管理模式  采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生改变。

1,状态 :本质上就是一个变量,赋予不同的值就是不同的状态,管理状态实际上就是管理一堆变量。

2,响应式 ,vuex 跟全局变量不同,修改了vuex 的某个状态,依赖这个状态的试图都会发生改变。

(二)vuex 的五个核心概念

1,state  定义状态(变量),辅导函数mapState

2, Getter 获取状态(变量的值),同时可以对状态进行处理,辅助函数mapGetters.

3, Mutation 修改状态 (修改变量的值)

4,action 触发 mutation函数 ,从而修改状态,支持异步

5,module 当状态很多时,把状态分开管理。

安装 vuex

1,npm i vuex

vuex 配置

在根目录新建 /store/index.js

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex);

const config = {

    // 定义状态

    state: {

        isLogin: false

    },

    // getters

    getters: {

        // isLogin:(state) =>{

        //    return state.isLogin;

        // },

        // 等同上面的写法

        isLogin: state => state.isLogin

    },

    // 修改state里面的变量

    mutations: {

        // state指向上面的state,payload是调用muation时传过来的参数

        updateLogin(state, payload) {

            state.isLogin = payload;

        }

    },

    // action行为

    actions: {

    },

    // module

    modules: {

    }

}

export default new Vuex.Store(config);

在main.js 导入 并挂载到Vue 实例上

import Vue from 'vue'

import App from './App.vue'

import store from './store/index'

Vue.config.productionTip = false

new Vue({

  store,

  render: h => h(App),

}).$mount('#app')

四,获取在vuex 定义的状态

1,通过this.$store.state.XXX 来取,具体使用

created() {

    console.log(this.$store.state.isLogin);

    console.log(this.$store.state.firstName);

}

// 通常我们会定义计算属性来取值,比如

computed: {

    // 自定义计算属性

    isLogin() {

      // 获取vuex的isLogin的值

      return this.$store.state.isLogin

    }

}

2,通过辅助函数 mapState 来获取

data() {

    return {

      addr: '广西'

    };

  },

computed: mapState({

    // 取state里count的值

    count: 'count',

// 取state里count的值,用countAlias变量接收

    countAlias: 'count',

    // 为了能够使用 `this` 获取局部状态,必须使用常规函数

    fullName(state) {

      return this.addr + state.firstName + state.lastName;

    }

  })


// 如果需要定义其它的计算属性,就按照下面的写法

computed: {

    // 其他的计算属性

    total() {

        return 500

    },

    ...mapState({

          // 取state里count的值

            count: 'count',

            // 取state里count的值,用countAlias变量接收

            countAlias: 'count',

            // 为了能够使用 `this` 获取局部状态,必须使用常规函数

            fullName(state) {

              return this.addr + state.firstName + state.lastName;

            }

      })

}

3,通过 getters 和mapGetters 来取

// 定义一个用来获取fullName的getter

  getters: {

        fullName(state) {

            return state.firstName + state.lastName;

        }

    },

// 通过mapGetters

import {mapGetters} from 'vuex';

computed: {

    fullName() {

        return this.$store.getters.fullName;

    }

}

5,修改state 中的状态

1,定义 state 和 mutation

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({

    state: {

        name: "没名字",

        count: 1

    },

    getters: {

    },

    // 修改state里的值必须通过mutation来修改

    mutations: {

        /**

        * 定义一个修改name的mutation

        * state是上面的定义的state

        * payload是新的数据

        */

        updateName(state, payload) {

            state.name = payload;

        }

    }

})

2,在需要的时候调用mutation 进行修改state里的name状态。

```

// 第一个参数是mutation的名字,第二参数是要修改成的数据

this.$store.commit('updateName','老胡');

```

综合例子:通过Vuex实现加减

1,vuex 里配置state 和 mutation

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({

    state: {

        count: 0

    },

    mutations: {

        addOne(state, payload) {

            state.count = state.count + 1;

        },

        minusOne(state, payload) {

            if (state.count > 0) {

                state.count = state.count - 1;

            }

        }

    }

})

index.vue的配置

<template>

        <div>

            <button@click="minus">-</button>

             <span>{{count}}</span>

             <button@click="add">+</button>

         </div>

</template>

<script>

import { mapState } from "vuex";

export default { 

      computed: mapState({ 

       count: "count"

 }), 

 methods: { 

    add() { 

        this.$store.commit("addOne");

     }, 

 minus() { 

          this.$store.commit("minusOne"); 

      } 

   }

};

</script>

6,vuex本地持久化

当刷新页面,项目重新加载,vuex会重置,所有状态回到初始状态,使用vuex-persistedstate 可以避免这种情况。 

1,安装 vuex-persistedstate

npm i vuex-persistedstate

2,在vuex中,添加plugins

import createPersistedState from 'vuex-persistedstate'

plugins: [createPersistedState()],

具体例子

import Vue from 'vue';

import Vuex from 'vuex';

import createPersistedState from 'vuex-persistedstate'

// 导入模块

import login from './module/login'

import my from './module/my'

Vue.use(Vuex);

export default new Vuex({

    plugins: [createPersistedState()],

    // 模块

    modules: {

      login,

      my

    },

    state: {

        isLogin: false,

        username: '',

        token: ''

    },

    getters: {

        isLogin: state => state.isLogin,

        token: state => state.token,

        username: state => state.username

    },

    mutations: {

        updateLogin(state, payload) {

            state.isLogin = payload;

        },

        updateToken(state, payload) {

            state.token = payload;

        },

        updateUsername(state, payload) {

            state.username = payload;

        }

    },

    actions: {

      LoginAction({commit}, payload) {

        commit('updateLogin',payload)

      },

      TokenAction({commit}, payload) {

        commit('updateToken',payload)

      },

      UsernameAction({commit}, payload) {

        commit('updateUsername',payload)

      },

    }

})

7,modules的使用

1,配置模块的vuex

export default {

    state: {

        cartNum: 10

    },

    getters: {

    },

    mutations: {

        updateCartNum(state, payload) {

            state.cartNum = payload;

        }

    },

    actions: {

    }

}

2,获取状态

<template>

  <div>{{cartNum}}</div>

</template>

<script>

import { mapState } from "vuex";

export default {

  computed: mapState({

    cartNum(state) {

      return state.cart.cartNum;

    }

  })

};

</script>

3,修改状态

this.$store.commit("updateCartNum",200);

八) acion

Action 类似于 mutation,都是用来修改vuex的状态, 不同在于:

Action 提交的是 mutation,而不是直接变更状态。

Action 可以包含任意异步操作。

1,配置action

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({

    state: {

        num: 10

    },

    mutations: {

        updateNum(state, payload) {

            state.num = payload;

        }

    },

    actions: {

        /**

        * 修改num的action

        * @param {*} ctx 可以拿到一个类似store的实例

        * @param {*} payload 修改的数据

        */

        updateNum(ctx, payload) {

            setTimeout(() => {

                ctx.commit('updateNum', payload);

            }, 3000)

        }

    }

})

2,派发action,在需要的地方,调用以下方法

this.$store.dispatch("updateNum",500);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,527评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,687评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,640评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,957评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,682评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,011评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,009评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,183评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,714评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,435评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,665评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,148评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,838评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,251评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,588评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,379评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,627评论 2 380

推荐阅读更多精彩内容

  • 目录 组件化 组件通信 状态管理 Vuex 是什么 Vuex 有什么特点 Vuex 解决了什么问题 什么类型的数据...
    前端小华子阅读 2,007评论 0 16
  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应...
    白水螺丝阅读 4,682评论 7 61
  • Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
    萧玄辞阅读 3,133评论 0 6
  • Vuex Vuex是一个专门为Vue.js应用所设计的集中式状态管理架构,它借鉴了Flux和Redux的设计思想,...
    JunChow520阅读 1,578评论 2 0
  • 1 在职场中混,需要掌握一些技术。不过,同样的一套技术,并不是人人都适用。 有这样一个笑话:长相普通的小芳和长相靓...
    阿褒阅读 756评论 28 17