• Vuex - 状态管理模式的配置和使用(state、mutations、getters)


    目录

    一、Vuex

    前言

    1.1、下载和配置 Vuex

    1.1.1、下载 Vuex

    1.1.2、配置 Vuex

    1.2、Vuex 的使用

    1.2.1、state 属性

    1.2.2、mutations 属性

    1.2.3、getters 属性

    1.3、实际开发应用

    1.3.1、Vuex 和 LocalStorage 实现动态维持登录状态


    一、Vuex


    前言

    Vuex 就是一个统一管理状态的工具. 

    以往如果需要将一个组件的中的数据分享到其他组件上,就需要使用 props ,并且只能单向传递,并且一旦修改某一个共享数据的状态,还需要通知其他组件更新,非常不便于操作.  有了 Vuex 之后,就相当于有了一个共享数据的中心,并且共享的数据是动态更新的.

    1.1、下载和配置 Vuex

    1.1.1、下载 Vuex

    输入如下指令安装(Vue2 适合的版本):

    npm install vuex@3.1.0 

    1.1.2、配置 Vuex

    a)在脚手架项目的 src 目录中创建 store 文件夹,里面创建 index.js 文件表示入口,配置以下内容:

    1. import Vue from "vue";
    2. import Vuex from "vuex"
    3. Vue.use(Vuex); //配置 vue 注册 vuex
    4. export default new Vuex.Store({
    5. });

    Ps;将来的共享数据状态,就是在 Vuex.Store 中配置的

    b)在 main.js 中注册状态管理

    1. import Vue from 'vue'
    2. import App from './App'
    3. import router from './router'
    4. //vuex
    5. import store from './store'
    6. Vue.prototype.$store = store;
    7. Vue.config.productionTip = false
    8. /* eslint-disable no-new */
    9. new Vue({
    10. el: '#app',
    11. router,
    12. store, //注册 vuex
    13. components: { App },
    14. template: ''
    15. })

    1.2、Vuex 的使用

    1.2.1、state 属性

    state 用来定义一系列共享数据.

    例如 有一个 count 数据,需要在多个组件中共享,操作如下:

    a)Vuex.Store 中定义 state

    1. export default new Vuex.Store({
    2. state: { //定义公共数据. 使用共享组件:this.$store.state.count
    3. count: 1
    4. }
    5. });

    b)在需要共享的组件中使用

    使用共享组件:this.$store.state.count 也可以简写为 $store.state.count

                

    人工管理列表 --- {{ this.$store.state.count }}

    1.2.2、mutations 属性

    mutations 用来定义对共享数据的修改方法.

    例如对 共享数据 count 进行 + 1 和 - 1.

    a)Vuex.Store 中定义 mutations

    1. export default new Vuex.Store({
    2. state: { //定义公共数据. 使用共享组件:this.$store.state.count 也可以简写为 $store.state.count
    3. count: 1
    4. },
    5. mutations: { //这里定义的方法,都有一个默认参数,这个参数就是在上面 state,通过 state 就可以拿到里面的参数
    6. incrCount(state) {
    7. state.count++;
    8. },
    9. decrCount(state) {
    10. state.count--;
    11. }
    12. }
    13. })

    b)在需要共享的组件中使用

    使用方式:this.$store.commit('方法名')

    1. 人工管理列表 --- {{ this.$store.state.count }}

    2. <button @click="incr()"> 点我增加共享数据中的 count button>
    3. -------------------------------------------------------
    4. methods: {
    5. incr() {
    6. this.$store.commit('incrCount');
    7. },

     

    1.2.3、getters 属性

    getters 用来写对共享数据进行计算的方法,相当于组件中的 computed .

    好处:效率高,只计算一次(计算结果缓存).

    a)Vuex.Store 中定义 getters

    1. export default new Vuex.Store({
    2. state: { //定义公共数据. 使用共享组件:this.$store.state.count 也可以简写为 $store.state.count
    3. count: 1
    4. },
    5. mutations: { //这里定义的方法,都有一个默认参数,这个参数就是在上面 state,通过 state 就可以拿到里面的参数
    6. incrCount(state) {
    7. state.count++;
    8. },
    9. decrCount(state) {
    10. state.count--;
    11. }
    12. },
    13. getters: { //用来定义对共享数据的一系列计算方法(这里定义的方法,都有一个默认参数,这个参数就是在上面 state,通过 state 就可以拿到里面的参数)
    14. countSqrt(state) {
    15. return state.count * state.count;
    16. }
    17. }
    18. })

    b)在需要共享的组件中使用

    使用方式:this.$store.getters.countSqrt

                <h1>人工管理列表 --- {{ this.$store.getters.countSqrt }}h1>

    1.3、实际开发应用

    1.3.1、Vuex 和 LocalStorage 实现动态维持登录状态

    先来看一下两者的区别:

    1. vuex存的是状态,存储在内存;localStorage是浏览器提供的接口,让你存的是接口,以文件的形式存到本地.
    2. vuex用于组件之间传值,localStorage主要用于页面间传值
    3. 当刷新页面时,vuex存储的值会丢失,localStorage不会

    localStorage可以代替vuex,对于不变的数据确实可以,但是当两个组件共同用以数据源,如果其中一个组件中的数据源改变,希望另一个组件响应变化,这时候就要选择用vuex。

    例如动态维持登录状态:

    Vuex 的 store 如下

    1. Vue.use(Vuex); //配置 vue 注册 vuex
    2. export default new Vuex.Store({
    3. //定义全局数据
    4. state: {
    5. //维持用户登录状态
    6. user: {
    7. id: localStorage.getItem("id"),
    8. username: localStorage.getItem("username"),
    9. isAdmin: localStorage.getItem("isAdmin"),
    10. state: localStorage.getItem("state") //0正常(默认) 1禁言
    11. }
    12. },
    13. mutations: {
    14. //更新登录状态
    15. login(state, user) {
    16. state.user.id = user.id;
    17. state.user.username = user.username;
    18. state.user.isAdmin = user.isAdmin;
    19. state.user.state = user.state;
    20. //保存到 localStorage 中, 防止刷新页面,丢失 vuex 数据
    21. localStorage.setItem("id", user.id);
    22. localStorage.setItem("username", user.username);
    23. localStorage.setItem("isAdmin", user.isAdmin);
    24. localStorage.setItem("state", user.state);
    25. },
    26. //删除所有登录状态
    27. logout(state) {
    28. state.user = {};
    29. localStorage.clear();
    30. }
    31. },
    32. });

     登录请求如下:

    1. /**
    2. * 登录
    3. */
    4. login() {
    5. //1.非空校验
    6. if (this.user.username == null || this.user.username == '') {
    7. Message.warning("用户名不能为空!");
    8. this.$refs.username.focus();//获取焦点(提升用户体验)
    9. return;
    10. }
    11. if (this.user.password == null || this.user.password == '') {
    12. Message.warning("密码不能为空!");
    13. this.$refs.password.focus();
    14. return;
    15. }
    16. //2.发送请求
    17. instance.post('/user/login', this.user).then(success => {
    18. if (success.data.code == 1000) { //这里根据后端定义状态码(1000 表示 "操作成功")
    19. //登录成功
    20. //1.将 Token 保存到 localStorage 中
    21. const token = success.data.data.token;
    22. localStorage.setItem("token", token);
    23. //2.将用户登录信息状态通过 vux 和 localStorage 进行保存
    24. this.$store.commit("login", success.data.data);
    25. //3.提示跳转
    26. Message.success("登录成功,为您跳转到主页~");
    27. this.$router.push({ name: "Index" });
    28. } else {
    29. //登录失败
    30. console.log(success.data.msg);//从后端得到失败的信息(前端在控制台看即可)
    31. Message.error("账号或密码错误,请重试!");
    32. }
    33. }).catch(error => {
    34. Message.error("服务器异常,请稍后重试!");
    35. console.log(error);
    36. });
    37. }

     

  • 相关阅读:
    基于稳态视觉诱发电位和注意力脑电的混合脑机接口系统
    如何安装JetPack?
    Visual Assist 代码辅助检查和重构
    根据多个乱序经纬度计算多边形顶点顺序并绘制到指定地图上
    vue3组件小结table案例经典!
    基于JavaSwing开发单位固定资产登记管理系统 毕业设计 课程设计 大作业
    linux ping IP地址与telnet 测试IP端口
    为什么 Go 语言 struct 要使用 tags
    深度学习入门(二十三)卷积神经网络——图像卷积
    [python 刷题] 981 Time Based Key-Value Store
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/133938922