二十六、Vuex

一、基本概念介绍

  Vuex 解决不同组件的数据共享和数据持久化!就是H5中的 LocalStorageSessionStorage 的替代品!

注意:Vuex一般用于大项目,小项目等不用就不用。

(一)运行原理

在这里插入图片描述  如上图所示,Vuex的核心组件分为三个:

  1. State:存储所有的公用数据;
  2. Mutations:所有对 State 中数据的操作都由 Mutations 来执行,其他必须通过该组件才能操作 State 中数据;
  3. Actions:在改变公共数据时,若涉及到一些异步操作,那么需要通过 dispatch()方法来调用 Actions 中的方法,再由 Actions 中的方法调用 Mutations 中的方法,再由 Mutations 操作公共数据。

二、Vuex的使用

1、src目录下面新建一个vuex的文件夹
2、vuex 文件夹里面新建一个store.js
3、安装vuex
cnpm install vuex --save
4、在刚才创建的 store.js 引入vue 引入vuex 并且use vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

5、定义数据(store.js
/*1.state在vuex中用于存储数据*/
			var state={

			    count:1
			}
6、定义方法 mutations里面放的是方法,方法主要用于改变state里面的数据(store.js
		var mutations={

		    incCount(){

			++state.count;
		    }
		}
7、优点类似计算属性 , 改变state里面的count数据的时候会触发 getters里面的方法 获取新的值 (基本用不到)
		var getters= {
		   
		    computedCount: (state) => {
			return state.count*2
		    }
		}
8、 Action 基本没有用

Action 类似于 mutation,不同在于:

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

		var actions= {
		    incMutationsCount(context) {    /*因此你可以调用 context.commit 提交一个 mutation*/
		      
		      
			context.commit('incCount');    /*执行 mutations 里面的incCount方法 改变state里面的数据*/


		    }
		}
9.暴露
		const store = new Vuex.Store({
		    state,
		    mutations,
		    getters,
		    actions
		})
		
		export default store;
10.组建里面使用vuex:
(1)引入 store
import store from '../vuex/store.js';
(2)注册
			 export default{
				data(){
				    return {               
				       msg:'我是一个home组件',
					value1: null,
				     
				    }
				},
				//注册store
				store,
				methods:{
				    incCount(){
				    // 当逻辑不复杂时,可通过 commit() 调用 Mutations 中的方法
					this.$store.commit('incCount');   /*触发 state里面的数据*/
				    }

				}
			    }
(3)获取state里面的数据
this.$store.state.数据

//改变这种写法
import { mapState } from "vuex"

computed: {
        // 把 vuex 中的数据映射到 该组件的 computed 属性里
        ...mapState(['city'])
}
//使用 city
<div class="header-right">
    {{city}}
    <span class="iconfont arrow-icon">&#xe64a;</span>
</div> 
(4)触发 mutations 改变 state里面的数据
this.$store.commit('incCount');

//改变这种写法
<script>
.....
import { ....,mapMutations } from "vuex"
export default {
    ....
    methods: {
        handleCityClick (city) {
            // 当逻辑很简单时,可以直接调用 commit() 来改变数据
            // this.$store.commit('changeCity', city)
            this.changeCity(city)

            ....
        },
        // 把 vuex Mutations 中的changeCity()方法映射到 该组件的changeCity()方法里
        ...mapMutations(['changeCity'])
    },
    ....
}
</script>
(5)触发 actions里面的方法
this.$store.dispatch('incCount');
(6)获取 getters里面方法返回的的数据
{{this.$store.getters.computedCount}}  

三、完整案例

1.组件

<template>
    <div>
        ....
        <div 
        class="search-content" 
        ref="search"
        v-show="keyword"
        >
            <ul>
                <li 
                class="search-item border-bottom" 
                v-for="item of list" 
                :key="item.id"
                @click="handleCityClick(item.name)">
                {{item.name}}
                </li>
                <li class="search-item border-bottom" v-show="hasNoData">
                    没有找到匹配数据
                </li>
            </ul>
        </div>
    </div>
</template>
<script>
import { mapMutations } from "vuex"
....
export default {
    name: 'CitySearch',
    ........
    methods: {
        handleCityClick (city) {
            // 当需要异步操作时,可以调用 dispatch(),来通知 action 改变数据
            // this.$store.dispatch('changeCity', city)

            // 当逻辑很简单时,可以直接调用 commit() 来改变数据(PS:这也是一种写法)
            // this.$store.commit('changeCity', city)
            this.changeCity(city)

            //跳转回首页
            this.$router.push('/')
        },
        // 把 vuex Mutations 中的changeCity()方法映射到 该组件的changeCity()方法里
        ...mapMutations(['changeCity'])
    }
}
</script>
.....

2.store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    city: '北京'
  },
  mutations: {
    changeCity (state, city) {
      state.city = city
    }
  },
  actions: {
    changeCity (ctx, city) {
      ctx.commit('changeCity', city)
    }
  }
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值