美文网首页
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 详解

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