美文网首页
vuex 详解

vuex 详解

作者: 醉青风 | 来源:发表于2021-08-27 14:13 被阅读0次

1、vuex 是什么?

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

    参考:Vuex详解。 1. Vuex及其作用 Vuex:是一个专为 Vue.js应用程序开发的状态管理模式。它采用...

  • vuex使用记录

    副标题:vuex使用详解、vue使用全局变量、vue使用 store 这篇博客主要记录了 vuex的使用方法,简单...

  • Vuex详解

    Vuex是什么 状态管理模式,将所有组件需要共享的变量全部存储在一个对象里,然后将这个对象放在顶层组件中供其他组件...

  • vuex详解

    在vue中我们通过vuex来管理状态,该值一但被修改,所有引用该值的地方都会自动更新项目的src文件下的store...

  • VUEX 详解

    为什么使用vuex 在中大型应用中,应用的各个组件间需要进行数据传递,使用传统方式繁琐且不可控 Vuex 为所有组...

  • vuex详解

    一、什么是vuex ? 答: 通俗的来说,我们可以把全局需要用到的数据【例如: 数据 a】放在vuex中,同理,v...

  • 详解VUEX

    安装vuex 安装完之后新建一个store.js文件

  • vuex 详解

    1、vuex 是什么? 集中式存储管理应用的所有组件的状态(单独出来管理共用的状态,如:token的管理等,相当于...

  • VUE知识点总结

    一、生命周期详解(八个钩子函数) 二、vuex状态管理 Vuex 是一个专为 Vue.js 应用程序开发的状态管理...

  • vuex的详解

    技术胖的vuex详解,说的很详细易懂,收藏了,觉得还是记录一下 http://jspang.com/2017/05...

网友评论

      本文标题:vuex 详解

      本文链接:https://www.haomeiwen.com/subject/tbhmiltx.html