zoukankan      html  css  js  c++  java
  • vue 之 vuex了解与使用

    vuex是一个专为vue.js应用程序开发的状态管理模式,并附带了更多以的概念和框架,需要对短期和长期效益进行权衡

    vuex的优点:方便的解决多组件的共享状态

      他是独立于组件而单独存在的,所有的组件都可以把它当做一座桥梁来进行通讯

      特点:

          响应式的,只要数据修改了 ,所有用到该数据的地方,自动更新(数据驱动)

         操作更简洁,逻辑清晰

    核心概念 

    (1) state 状态树

       vuex提出使用单一状态树,什么是单一状态树,英文名称是Single Source of Truth  也可以翻译为单一数据源

    (2) getters  携带 state参数

       类似于计算属性

    (3) mutations 状态更新  携带最多两个参数,第一个默认是state参数  (注意:不能写异步内容)

        修改state的值肯定是在mutations中进行,参数被称为是mutation的载荷(Payload)

    (4) actions  类似于mutation,

        是用来替代mutation进行异步操作的,可以解决mutation同步函数问题

    (5) modules

         1.因为使用单一状态树,也就意味着很多模块都会交给vuex来管理

         2.当应用变得非常复杂时,store对象就会变得相当臃肿

         3.为了解决该问题,vuex允许我们将store分割成模块,而每个模块拥有自己的state,mutations,actions,getters等

    操作案例

    注意点:

    getters:

    1.有一个默认参数 state 

    2.必须有一个返回值

    mutations:

    1.最多两个参数,第一个默认参数是 state

    2.在使用是,看是否有分模块,如果有模块,注意添加模块名

    3.通过commit 进行调用,通过在actions中context.commit 去调用

    扩展: 一个模块中提交另一个模块的mutation,加这个配置项 {root:true}

    store.commit('permission/setRoutes',[],{root:true})
    注意: [] 是传过去的参数, {root:true}不是参数,仅仅作为配置项

    actions:

    1.最多两个参数,第一个默认参数是 context

       非常注意点:这里是处理异步内容的,但是修改state的值,还是要在mutations中写,通过context.commit('mutationns中的方法名')

    2.通过dispatch进行调用

      add-item.vue

    <template>
      <div class="add">
        add内容
        <hr />
        姓名:{{ $store.state.Add.addObj.name }}
        <hr />
        年龄:{{ $store.state.Add.addObj.age }}
        <hr />
        列表信息:{{ $store.getters["Add/aList"] }}
        <hr />
        <button @click="addOne">加一岁</button>
        <button @click="addN">加N岁</button>
        <button @click="addOneAsync">异步加一岁</button>
      </div>
    </template>
    
    <script>
    export default {
      name: "",
      data() {
        return {};
      },
      components: {},
      methods: {
        addOne() {
          this.$store.commit("Add/addOne");
        },
        addN() {
          this.$store.commit("Add/addN", 10);
        },
        addOneAsync() {
          this.$store.dispatch("Add/addOneAsync");
        }
      }
    };
    </script>
    
    <style scoped>
    .add {
      border: 1px solid red;
    }
    </style>

    sub-item.vue

    <template>
      <div class="sub">
        sub内容
        <hr />
        姓名:{{ subObj.name }}
        <hr />
        年龄:{{ subObj.age }}
        <hr />
        数据列表:{{ sList }}
        <hr />
        <button @click="subOne">加一岁</button>
        <button @click="subN(10)">加N岁</button>
        <button @click="subOneAsync">异步加一岁</button>
      </div>
    </template>
    
    <script>
    import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
    export default {
      name: "",
      data() {
        return {};
      },
      computed: {
        ...mapState("Sub", ["subObj"]),
        ...mapGetters("Sub", ["sList"])
      },
      methods: {
        ...mapMutations("Sub", ["subOne", "subN"]),
        ...mapActions("Sub", ["subOneAsync"])
      },
      components: {}
    };
    </script>
    
    <style scoped>
    .sub {
      border: 1px solid blue;
    }
    </style>

    add.js

    export default {
      state: {
        addObj: {
          name: "add",
          age: 20
        },
        addList: [10, 20, 30, 40]
      },
      getters: {
        aList(state) {
          return state.addList.filter(item => item > 10);
        }
      },
      mutations: {
        addOne(state) {
          state.addObj.age += 1;
        },
        addN(state, n) {
          state.addObj.age += n;
        }
      },
      actions: {
        addOneAsync(context) {
          setTimeout(() => {
            context.commit("addOne");
          }, 2000);
        }
      },
      namespaced: true
    };

    sub.js

    export default {
      state: {
        subObj: {
          name: "sub",
          age: 30
        },
        subList: [100, 200, 300, 400]
      },
      getters: {
        sList(state) {
          return state.subList.filter(item => item > 100);
        }
      },
      mutations: {
        subOne(state) {
          state.subObj.age += 1;
        },
        subN(state, n) {
          state.subObj.age += n;
        }
      },
      actions: {
        subOneAsync(context) {
          setTimeout(() => {
            context.commit("subOne");
          }, 2000);
        }
      },
      namespaced: true
    };

    index.js

    /* 存放共享数据的仓库 
    1.导入vue 和 vuex 并注册
    2.创建空的仓库
    3.导出仓库
    4.挂载仓库
    */
    import Vue from "vue";
    import Vuex from "vuex";
    import Add from "@/store/modules/add.js";
    import Sub from "@/store/modules/sub.js";
    Vue.use(Vuex);
    
    //这里是全局
    const store = new Vuex.Store({
      //state状态(共享数据)节点,是一个对象
      state: {
        obj: {
          name: "张三",
          age: 18
        }
      },
      //mutations节点定义的是方法,这些方法是来修改state中的数据的,只能在mutations中修改
      mutations: {},
      /*actions节点中,这个节点中放的也是方法,这里面的方法是处理异步业务逻辑的
      actions中的方法,参数一是context
      action不能操作state中的数据,提交的是mutation,mutation修改state中的数据
      ---官网描述, action 提交的是mutation,而不是直接变更状态,action可以包含任意异步操作
      */
      actions: {},
      /* getters 基于state中数据派生新的数据 
       将getters理解组件中的计算属性,写法和计算属性一模一样(计算属性是一个函数,而且必须有返回值return)
      */
      getters: {},
      modules: {
        Add,
        Sub
      }
    
      //在仓库新增strict节点开启严格模式,辅助开发,但是上线阶段不开启严格模式,开启严格模式后会将state中的数据进行监听
      // strict: true,
    });
    
    export default store;

    app.vue

    <template>
      <div id="app">
        <h1>add内容区</h1>
        <hr />
        <add-item></add-item>
        <hr />
        <h1>sub内容区</h1>
        <sub-item></sub-item>
      </div>
    </template>
    <script>
    import AddItem from "@/components/add-item.vue";
    import SubItem from "@/components/sub-item.vue";
    export default {
      name: "app",
      components: {
        AddItem,
        SubItem
      }
    };
    </script>
    
    <style lang="less"></style>

    有部分内容可以参考  vuex 之 概念和作用解析  

  • 相关阅读:
    Linux命令-tail命令
    服务器重装ip未更改,ssh连不上(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED)
    Docker中Nginx部署go应用
    Django+gunicorn+nginx项目部署
    Django之 CVB&FVB
    Django之form校验&后台管理
    python argparse例子实践
    重新认识递归
    Django之数据库对象关系映射
    jenkins参数化构建&HTML报告
  • 原文地址:https://www.cnblogs.com/zmztya/p/14536840.html
Copyright © 2011-2022 走看看