Vuex的学习

在学习前我总会想几个问题

 

为什么学?

学它有什么便利性?

如何去学好?

根据这几个问号让我们来进行对Vuex的学习吧~

目录

 Vuex相关概念

Vuex的定义

何时使用Vuex

搭建Vuex环境

Vue与Vuex的使用对比

使用Vue版案例

使用Vuex版案例

总结


在学习Vuex之前我们学习了全局事件总线(前情回顾:兄弟组件之间传递参数可以用全局事件总线),当B、C、D这几个组件想用A组件里的数据我们可以用全局事件总线来解决,如下图理解:

 然后我们就发现A组件中的数据就像“共享单车”一般能让B、C、D这几个组件都可以使用,所以我们就研究出了Vuex,如下图理解:

 Vuex相关概念

Vuex的定义

在Vue中实现集中式状态(状态可以理解为数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

何时使用Vuex

  • 多个组件依赖于同一状态
  • 来自不同组件的行为需要变更同一状态

搭建Vuex环境

所需文件如下图:

 分析环境中的相关组成:

//store文件夹里的index.js是用于创建Vuex中最为核心的store

import Vuex from 'vuex'     //引入Vuex

const actions ={ }              //准备actions--用于响应组件中的动作

const mutations ={ }          //用于操作数据(state)

const state={ }                   //用于存储数据

Step1: 在安装vuex的时候需要注意版本问题否则也是无法使用的。

npm install vuex@3.0

 Step2:创建文件:src/store/index.js

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备state对象——保存具体的数据
const state = {}

//创建并暴露store
export default new Vuex.Store({
	actions,
	mutations,
	state
})

Step3: 在main.js中创建vm时传入store配置项

......
//引入store
import store from './store'
......

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
	store
})

Vue与Vuex的使用对比

使用Vue版案例

文件位置如图所示:

Count.vue中代码:

Count.vue中来放整个页面的结构框架以及当点击(事件)后就能产生的计算求和效果


<template>
 <div>
    <h1>当前求和为:{{sum}}</h1>
    <select v-model="n">
      <option :value="1">1</option>
      <option :value="2">2</option>
      <option :value="3">3</option>
    </select>
    <!-- 绑定点击事件利用一个回调函数 -->
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
    <button @click="incrementOdd">当前求和为奇数再加</button>
    <button @click="incrementWait">等一等再加</button>
</div>
</template>

<script> 
export default {
    name:'Count',
    data(){
      return{
        n:1,
        sum:0
      }
    },
    methods:{
      increment(){
        this.sum+=this.n
      },
      decrement(){
       // console.log(this);this指的是什么
       this.sum-=this.n
      },
      incrementOdd(){
        if(this.sum%2){
          this.sum+=this.n
        }
      },
      incrementWait(){
        setTimeout(()=>{
        // 函数体
         this.sum+=this.n
        },500)
      }
    }
}
</script>

<style scoped>
    button{
      margin: 10px;
    }
</style>

 main.js中的代码:

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'

//创建vm
new Vue({
    el: '#app',
    render: h => h(App)
})

App.vue中的代码:

<template>
	<div>
   <count/>
  </div>
</template>

<script>
import Count from './components/Count.vue'
	export default {
		name:'App',
		components:{Count}
	}
</script>
 

使用Vuex版案例

使用Vuex的意义:就是共享一个数据。如下图理解:

当用Vuex来写代码 ,如图展示所需文件:

 Count.vue中的代码:

<template>
	<div>
		<h1>当前求和为:{{$store.state.sum}}</h1>
		<select v-model.number="n">
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
		</select>
		<button @click="increment">+</button>
		<button @click="decrement">-</button>
		<button @click="incrementOdd">当前求和为奇数再加</button>
		<button @click="incrementWait">等一等再加</button>
	</div>
</template>

<script>
	export default {
		name:'Count',
		data() {
			return {
				n:1, //用户选择的数字
			}
		},
		methods: {
			increment(){
				this.$store.commit('JIA',this.n)
			},
			decrement(){
				this.$store.commit('JIAN',this.n)
			},
			incrementOdd(){
				this.$store.dispatch('jiaOdd',this.n)
			},
			incrementWait(){
				this.$store.dispatch('jiaWait',this.n)
			},
		},
		mounted() {
			console.log('Count',this)
		},
	}
</script>

<style >
	button{
		margin-left: 5px;
	}
</style>

Store文件夹中的index.js中的代码:

//该文件用于创建Vuex中最为核心的store
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'

//应用Vuex插件
Vue.use(Vuex)

//准备actions——用于响应组件中的动作
const actions = {
        jiaOdd(context, value) {
            console.log('actions中的jiaOdd被调用了')
            if (context.state.sum % 2) {
                context.commit('JIA', value)
            }
        },
        jiaWait(context, value) {
            console.log('actions中的jiaWait被调用了')
            setTimeout(() => {
                context.commit('JIA', value)
            }, 500)
        }
    }
    //准备mutations——用于操作数据(state)
const mutations = {
        JIA(state, value) {
            console.log('mutations中的JIA被调用了')
            state.sum += value
        },
        JIAN(state, value) {
            console.log('mutations中的JIAN被调用了')
            state.sum -= value
        }
    }
    //准备state——用于存储数据,比如当前求和的sum
const state = {
    sum: 0 //当前的和
}

//创建并暴露store
export default new Vuex.Store({
    actions,
    mutations,
    state,
})

main.js中的代码:

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入插件
import vueResource from 'vue-resource'
// 引入vuex
import Vuex from 'vuex'
//引入store
import store from './store'

//关闭Vue的生产提示
Vue.config.productionTip = false
    //使用插件
Vue.use(vueResource)
Vue.use(Vuex)


//创建vm
new Vue({
    el: '#app',
    render: h => h(App),
    store,
    beforeCreate() {
        Vue.prototype.$bus = this
    }
})

App.vue中的代码:

<template>
	<div>
		<Count/>
	</div>
</template>

<script>
	import Count from './components/Count'
	export default {
		name:'App',
		components:{Count},
		mounted() {
			console.log('App',this)
		},
	}
</script>

总结

以上内容就是对于VueX的认识并且与Vue的对比使用。

 ~ENDING~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值