Vuex的简单使用及原理分析 | Vuex 的引入及其使用场景介绍

转载:https://mp.weixin.qq.com/s/iLDlpwom6ZmBNZzMGvAa9g

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

const store = new Vuex.Store({
  state:{
    count:0
  }
})

在这里插入图片描述

<template>       
    <div> state的数据:{{ $store.state.count }}</div>  
<template>
<script>
// 安装完 vuex 会在组件中注入一个 $store 的变量
created() {   
console.log(this.$store.state.count);
}
</script>

在这里插入图片描述

<template>       
    <div> state的数据:{{ count }}</div>
<template>
<script>
// 把state中数据,定义在组件内的计算属性中  
   computed: {    
     count () {      
return this.$store.state.count   
      }  
    }
</script>

在这里插入图片描述

<template>    
    <div> state的数据:{{ count }}</div>  
<template>
import {mapState} from 'vuex'
export default{
  computed:{
     ...mapState(['count'])
  }
}

在这里插入图片描述

const store = new Vuex.Store({ 
state: {    
count: [1,2,3,4,5,6,7,8,9,10]
},  
getters: {    
// getters函数的第一个参数是 state    
// 必须要有返回值     
  getCount:  state =>  state.list.filter(item => item > 5)  
  }
})

在这里插入图片描述

<template>    
   <div>     
<div> state的数据:{{ getCount }}</div>
   </div>
<template>
<script>  
 // 把state中数据,定义在组件内的计算属性中  
   computed: {    
     getCount () {      
       return this.$store.getters.getCount   
      }  
    }
</script>

在这里插入图片描述

import {mapGetters} from 'vuex'
export default{
computed:{
    ...mapGetters(['getCount'])
  }
}

在这里插入图片描述

const store = new Vuex.Store({
state:{
count:0
},
  mutations:{
  //   接受 state作为第一个参数
    mutationCount(state){
      state.count ++ ;
}
  //  向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)
    addCount (state, payload) {
state.count += payload.data
}
}
 })

在这里插入图片描述

methods:{
  changeCount(){
    this.$store.commit('mutationCount')
  }
}

在这里插入图片描述

import {mapMutations} from 'vuex'
export default{
  methods:{
    ...mapMutations(['mutationCount'])
  }
}

在这里插入图片描述

mutations: {
  someMutation (state) {
    setTimeout(() => {
      state.count++
    },1000)
  }
}

在这里插入图片描述

const store = new Vuex.Store({
state:{
count:0
},
   mutations:{
mutationCount(state,payload){
state.count = payload;
}
   },
   actions:{
     actionCount(context,payload){
       setTimeout(()=>{
         context.commit('mutationCount',payload.count)
       },1000)
     }
   }
})

在这里插入图片描述

methods:{
  changeCountAsync(){
     this.$store.dispatch('actionCount',res)
  }
}

在这里插入图片描述

import {mapActions} from 'vuex'
export default{
methods:{
     ...mapActions(['actionCount'])
   }
 }

在这里插入图片描述

// 假设 getData() 和 getOtherData() 返回的是 Promise
actions: {
async actionA ({ commit }) {
    commit('gotData', await getData())
  },
async actionB ({ dispatch, commit }) {
await dispatch('actionA') // 等待 actionA 完成
    commit('gotOtherData', await getOtherData())
  }
}

在这里插入图片描述

const moduleA = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... },
getters: { ... }
}

const moduleB = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... }
}

const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

在这里插入图片描述

const moduleA = {
state: () => ({
count: 0
}),
mutations: {
increment (state) {
// 这里的 `state` 对象是模块的局部状态
state.count++
}
},

getters: {
doubleCount (state) {
return state.count * 2
}
}
}

在这里插入图片描述

const moduleA = {
// ...
getters: {
sumWithRootCount (state, getters, rootState) {
return state.count + rootState.count
                }
          }
}

在这里插入图片描述

const store = new Vuex.Store({
modules: {
account: {
namespaced: true,
// 模块内容(module assets)
state: () => ({ ... }), // 模块内的状态已经是嵌套的了,使用 `namespaced` 属性不会对其产生影响
getters: {
isAdmin () { ... } // -> getters['account/isAdmin']
},
actions: {
login () { ... } // -> dispatch('account/login')
},
mutations: {
login () { ... } // -> commit('account/login')
},

// 嵌套模块
modules: {
// 继承父模块的命名空间
myPage: {
state: () => ({ ... }),
getters: {
profile () { ... } // -> getters['account/profile']
}
},

// 进一步嵌套命名空间
posts: {
namespaced: true,

state: () => ({ ... }),
getters: {
popular () { ... } // -> getters['account/posts/popular']
            }
          }
        }
      }
    }
})

在这里插入图片描述

npm install vuex --save

在这里插入图片描述

import {createStore} from 'vuex';
export default createStore({})

在这里插入图片描述

import {createApp} from 'vue';
import App from './App.vue';

import {store} from './store';
createApp(App).use(store).mount('#app);

在这里插入图片描述

// src/store.js
export function install (_Vue) {
  if (Vue && _Vue === Vue) {
    return
  }
  Vue = _Vue
  applyMixin(Vue)//在所有组件的beforeCreate注入了设置this.$store这样的一个对象,
  //在任意组件中执行this.$store都能找到store对象
}

在这里插入图片描述

// src/store.js
function resetStoreVM (store, state, hot) {
// 省略无关代码
  Vue.config.silent = true
//本质:将我们传入的state作为一个隐藏的vue组件的data
//也就是说,我们的commit操作,本质上其实是修改这个组件的data
  store._vm = new Vue({
    data: {
      $$state: state
    },
    computed
  })
}
//this.$store._vm.$data.$$state===this.$store.state

在这里插入图片描述
在这里插入图片描述

Vuex 的引入及其使用场景介绍

转载: https://mp.weixin.qq.com/s/2V0Mv6flZvjr6SxrUmxOpQ

在这里插入图片描述

注:新版本的安装命令为:npm i vuex@next -S 。

在这里插入图片描述
在这里插入图片描述

npm view vuex versions --json

在这里插入图片描述

npm i vuex@3.6.2 -S

在这里插入图片描述

npm install

在这里插入图片描述

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = {};
const getters = {};
const mutations = {};
const store = new Vuex.Store({
    state,
    getters,
    mutations,
});
export default store;

在这里插入图片描述
在这里插入图片描述

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = {
    _defaultMap: '', //默认底图
};
const getters = {
    _getDefaultMap() {
        return state._defaultMap;
    },
};
const mutations = {
    _setDefaultMap(state, value) {
        state._defaultMap = value;
    },
};
const store = new Vuex.Store({
    state,
    getters,
    mutations,
});
export default store;

在这里插入图片描述

this.$store.commit('_setDefaultMap', map);

在这里插入图片描述

const map = this.$store.getters._getDefaultMap;

在这里插入图片描述

<div v-show="this.$store.getters._getDefaultVisible"></div>

在这里插入图片描述

const currentVisible = this.$store.getters._getDefaultVisible;
this.$store.commit('_setDefaultVisible', !currentVisible);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值