vuex 详解

1、vuex 是什么?

集中式存储管理应用的所有组件的状态(单独出来管理共用的状态,如:token的管理等,相当于一个全局对象),以相应的规则保证状态以一种可预测的方式发生变化(不能直接修改数据,需要通过特定的方法, this. store.commit() ),无法持久化存储。

vuex 和 Cookie,localstorage 的区别

Cookie: 采用键值对的方式存储( document.cookie = 键= 值; 键= 值),可以定义过期时间(document.cookie ="expires=有效期"),存储大小4k

localstorage: 使用方法进行键值对的方式存储(getItem(键,值)),永久存储,但是可以根据方法清除, 存储大小5m

方法 描述 实例
setItem() 将对应的名字和值传递进去存储 localStorage.setItem('users','我是user')
getItem() 名称作为参数,可以获取对应的值 localStorage.getItem('users')
removeItem() 名称作为参数,可以删除对应的数据 localStorage.removeItem('users')
clear() 可以删除所有存储的数据 localStorage.clear()

sessionstorage:跟 localstorage 方法一样,但是是单页面回话存储,跳转页面被清除,

vuex:相当于全局变量,刷新页面清除,想长久保持数据存在,只能使用Cookie和localstorage存储,然后再赋值回去
如:

 getters :{
       userName: (state,getters,rootState)=>{
          console.log(state.userId)
          let a =  (state.userId?state.userId:localStorage.getItem('users'))
          return a
       }
   },

2、vue 使用

state 唯一数据源

像我们vue的data

定义
const  state = {
    token: '我是token'
  }
const store = new Vuex.Store({
    state
})

直接使用
this.$store.state.token    ==   '我是token'

引入使用
import {mapState} from 'vuex'
computed: {
   ...mapState(['token'])//不取别名 this.token==  '我是token'
    ...mapState({
      userToken: 'token'//取别名,this.userToken ==  '我是token'
    })
  },

getter 计算属性

从 store 中的 state 中派生出一些状态

定义
const  state = {
    token: '我是token'
  }
const getter ={
 tokenName(state,getters)=>{
      return state.token + '的getter ' //在token后面加数据
 }
}
const store = new Vuex.Store({
    state,
    getter 
})

直接使用
this.$store.getter .tokenName    ==   '我是token的getter'

引入使用
import {mapGetters} from 'vuex'
computed: {
   ...mapGetters(['tokenName'])//不取别名 this.tokenName == '我是token的getter'
    ...mapGetters({
      userTokenName: 'tokenName'//取别名,this.userTokenName =='我是token的getter'
    })
  },

mutation 唯一store修改方法

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,mutation 必须同步执行

定义
const  state = {
    token: '我是token'
  }
const  mutation= {
    setToken(state,val){
       state.token = val
     }
  }
const store = new Vuex.Store({
    state,
    mutation
})

直接使用
this.$store.commit('setToken','白日梦')   // token ==  '白日梦'

引入使用
import {mapMutations} from 'vuex'
methods: {
   ...mapMutations(['setToken']) //不取别名 this.setToken('白日梦')  =>   token ==  '白日梦'
    ...mapMutations({
      setName: 'setToken'//取别名, this.setName('白日梦')  =>   token ==  '白日梦'
    })
  },

Action 提交的是 mutation

Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。

定义
const  state = {
    token: '我是token'
  }
const  mutation= {
    setToken(state,val){
       state.token = val
     }
  }
const  Action= {
    ActionToken({commit},val){
       commit('setToken',val)
     }
  }
const store = new Vuex.Store({
    state,
    mutation,
    Action
})

直接使用
this.$store.dispatch('ActionToken','白日梦')   // token ==  '白日梦'

引入使用
import {mapActions} from 'vuex'
methods: {
   ...mapActions(['ActionToken']) //不取别名 this.setToken('白日梦')  =>   token ==  '白日梦'
    ...mapActions({
      setName: 'ActionToken'//取别名, this.setName('白日梦')  =>   token ==  '白日梦'
    })
  },

modules 模块化

每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

当 namespaced: false 默认值为false ,除了state取值需要添加模块名称,别的不需要添加
const user = {
namespaced: false  ,
  state: () => ({ 
      name: '小青'
  }),
  getters: { 
    names(state){
      return  state.name + '青'
   }
 },
  mutations: { 
   setName(state,val){
      state.name = val
   }
},
  actions: { 
  setAcName({commit},val){
   commit('setName',val)
 }
},

}
const store = new Vuex.Store({
  modules: {user}
})

使用
this.$store.state.user.name == '小青'
this.$store.getters.names  == '小青青'
this.$store.commit('setName','小周')   //    name == '小周'
this.$store.dispatch('setAcName','小周')   //    name == '小周'
当 namespaced: true ,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。例如:
const user = {
namespaced: true ,
  state: () => ({ 
      name: '小青'
  }),
  getters: { 
    names(state){
      return  state.name + '青'
   }
 },
  mutations: { 
   setName(state,val){
      state.name = val
   }
},
  actions: { 
  setAcName({commit},val){
   commit('setName',val)
 }
},

}
const store = new Vuex.Store({
  modules: {user}
})

使用
this.$store.state.user.name == '小青'
this.$store.getters['user/names']  == '小青青'
this.$store.commit('user/setName','小周')   //    name == '小周'
this.$store.dispatch('user/setAcName','小周')   //    name == '小周'

Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则:

  • 应用层级的状态应该集中到单个 store 对象中。
  • 提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。
  • 异步逻辑都应该封装到 action 里面。
    只要你遵守以上规则,如何组织代码随你便

你可能感兴趣的:(vuex 详解)