前端学习

VueX-状态管理(十二)

2020-05-21  本文已影响0人  小二哥很二

1、vuex的作用:
vuex是一个专为 Vue.js 应用程序开发的状态管理模式,使用也是创建一个全局对象
2、vuex和其它的全局对象的不同:
1)Vuex的状态存储是响应式,状态的改变需要在路由组件的方法中commit→this.$store.commit('addstudent', stu )
2)commit的是mutations,所有的状态都存放在state中
3、组件文件获取state对象状态:
$store.state.xxx
4、Mutation:
1)mutation里只能存在同步操作的代码
2)每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler),并且state作为该回调函数的第一个默认参数,额外的参数成为:载荷(payload)
3)可以将mutation的事件类型定义成常量存放在另一个js文件中

  mutations: {
    // 方法,默认会有一个参数state,就是上面的state
    // 写在这里的方法,需要在要调用此方法的路由里this.$store.commit
    increment(state) {
      state.counter++;
    },
    // 将mutations事件类型定义成常量,那我们方法就可以这么定义,官方文档建议这么写
    [DECREMENT](state) {
      state.counter--;
    }

5、Getter:
1)在state派生出来的一些状态,在其它组件中不需要commit,直接调用:$store.getters.xxx
2)Getter默认参数state,如需要传入其它参数,那么只能让getter本身返回另一个函数

index.js
getters: {
    // 1.这里的函数也是默认要写一个参数state,其它组件调用的时候不用commit
    more20stu(state) {
      // 箭头函数,当代码行只有一行得时候,可以写到一行,不写return
      // 获取年龄大于20岁的students
      return state.students.filter(s => s.age > 20)
    }

App.vue
<h2>年龄大于20的人:{{$store.getters.more20stu}}</h2>

6、Actions
1)Actions提交的是mutation,而不是直接更改状态。index.js:

actions: {
    // 当需要异步处理的死后,就用actions,默认参数context:上下文
    updateinfo(context,job) {
      setTimeout(()=>{
        context.commit('updatastus',job)
      },1500)
    }
  }

2)Actions处理的是异步函数
3)默认参数context:上下文的意思
4)在组件中使用,通过 store.dispatch 方法触发。App.vue:

updatastu(jober){
     // this.$store.commit('updatastus',jober)
     this.$store.dispatch('updateinfo',jober)
}

5)结合异步处理promise使用:

updateinfo(context,job) {
   return new Promise(resolve => {
     setTimeout(()=>{
       // 这里的updatastus是mutation里的
       context.commit('updatastus',job)
       resolve('updateinfo异步处理完毕')
     },1500)
   }).then(res =>{
     console.log(res)
   })
}

7、Modules
1)由于官方建议只new 一个Vuex,这样会造成state拥挤,所以有了modules
2)modules里可以定义自己的state,mutations,actions,getters
3)获取模块里的state状态:<h2>{{$store.state.a.name}}</h2>

index.js
// 2.1 抽离modules里的state
const moduleA = {
  state:{
    name:'李莉'
  },
  mutations:{
    upname(state,name2){
      state.name = name2
    }
  },
  actions:{},
}
export default new Vuex.Store({
    modules: {
    a:moduleA
    }
})

4)mutations和getters的操作一样,不受影响
5)modules里的getters允许传入第三个参数:rootState,为了调用主Vuex里的state

index.js
const moduleA = {
  state:{
    name:'李莉'
  },
  mutations:{
    upname(state,name2){
      state.name = name2
    }
  },
  getters:{
    fullname1(state){
      return state.name + '111'
    },
    fullname2(state,getters){
      return getters.fullname1 + '222'
    },
    fullname3(state,getters,rootState){
      return getters.fullname2 + rootState.counter
    }
  },
  actions:{},
}
export default new Vuex.Store({
    modules: {
    a:moduleA
    }
})

8、整体代码架构

import Vue from 'vue'
import Vuex from 'vuex'
import {DECREMENT} from "./mutations-types";

// 1.安装插件 => vuex是项目开发时使用的状态管理工具
Vue.use(Vuex)

// 2.创建对象并导出
export default new Vuex.Store({
  // state保存状态,可以添加多个状态
  state: {
    counter: 5,
    // 由于是响应式,所以数据改变,所有的数据都会变,但是只局限与已经在store中初始化所需的属性
    // 如果在往students通过方法添加一个对象,那么在浏览器上是不会被渲染出来的!!!!
    // 可以用splice,或者set来修改students里的对象内容
    students:[
      {id:110, name:'lisa',age:10},
      {id:120, name:'lucy',age:24},
      {id:130, name:'jenkins',age:30},
      {id:140, name:'golf',age:18},
    ],
    info:{name:'Lily',age:16,work:'nurse'}
  },
  mutations: {
    // 方法,默认会有一个参数state,就是上面的state
    // 写在这里的方法,需要在要调用此方法的路由里this.$store.commit
    increment(state) {
      state.counter++;
    },
    // 将mutations事件类型定义成常量,那我们方法就可以这么定义,官方文档建议这么写
    [DECREMENT](state) {
      state.counter--;
    },
    // 指定加多少次,同步操作的时候放这里,异步的时候放actions
    incrementCount(state, counte) {
      state.counter += counte;
    },
    // mutations的第二种提交方式
    incrementcount2(state, payload) {
      state.counter += payload.count
    },
    // 增加学生信息,往students数组里添加一个对象信息
    addstudent(state, user){
      state.students.push(user);
    },
    // 响应式增加students的对象
    updatastus(state, job) {
      // Vue.set(),修改数组,就传num,修改对象,就传key
      // Vue.set(state.info,'work',job)
      // 删除对象元素的响应式写法
      // Vue.delete(state.info, age)
      state.info.work=job
    }
  },
  actions: {
    // 当需要异步处理的死后,就用actions,默认参数context:上下文
    updateinfo(context,job) {
      setTimeout(()=>{
        context.commit('updatastus',job)
      },1500)
    }
  },
  modules: {
  },
  // getters默认是不能传递参数的,如果希望传递参数,那么只能让getters本身返回另一个函数
  getters: {
    // 1.这里的函数也是默认要写一个参数state,其它组件调用的时候不用commit
    more20stu(state) {
      // 箭头函数,当代码行只有一行得时候,可以写到一行,不写return
      // 获取年龄大于20岁的students
      return state.students.filter(s => s.age > 20)
    },
    // 2.getters可以链式传递,比如现在需要获得年龄大于20的学生个数
    more20stulength(state, getters) {
      return getters.more20stu.length
    },
    // 3.动态获取,大于参数age的学生
    moreagestu(state) {
      // return function (age) {
      //     return state.students.filter(s => s.age > age)
      // }
      return age => state.students.filter(s => s.age > age)
    },
    // 4.也可以都用箭头函数写,stuById为组件里要调用的方法名
    stuById: state => {
      return id => state.students.filter(s => s.id===id)
    }
  }
})

9、vuex-store文件及的目录结构
目录结构,代码抽离,使其代码更简洁,维护更方便:将modules,actions,getters,mutations抽离

store目录结构
上一篇下一篇

猜你喜欢

热点阅读