VUE3.0,DAY58,vuex基础

vuex

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

求和案例

使用一个求和案例来分析,我们实现了四个按钮,按照不同的情况对当前的和进行累加。

<template>
  <div>
    <h1>当前求和为:{{ sum }}</h1>
    <select v-model.number="numbers">
      <!-- value前边加冒号,就会被当成js表达式处理,如果不加,value值就是字符串形式 -->
      <option :value="1">1</option>
      <option :value="2">2</option>
      <option :value="3">3</option>
    </select>
    <button @click="JiaFa">+</button>
    <button @click="JianFa">-</button>
    <button @click="JiShu">当前求和为奇数在加</button>
    <button @click="DengXia">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      numbers: 1, //用户选择的数字
      sum: 0, //当前的和
    };
  },
  methods: {
    JiaFa() {
      this.sum += this.numbers;
    },
    JianFa() {
      this.sum = this.sum - this.numbers;
    },
    JiShu() {
      if (this.sum % 2) {
        this.sum = this.sum + this.numbers;
      }
    },
    DengXia() {
      setTimeout(() => {
        this.sum = this.sum + this.numbers;
      }, 500);
    },
  },
};
</script>

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

输出效果如下
在这里插入图片描述

vuex工作原理

vuex由三个重要部分组成,如虚线框中画的,一个是Actions,一个是Mutations,一个是State。state本质是一个object对象,里边有很多东西,我们上边案例的sum值可以保存在这里。在vuecomponents里,即我们上边案例的Count,调一个API,叫Dispatch,是一个函数,调用的时候要传两个参数,一个是动作类型(是加法动作还减法动作),一个是数值(你要加多少?你要减多少?),然后到了Actions中,里边有很多key和value,对于上边案例来说,key:value就是JiaFa:function,function是一个函数,我们调用dispatch传过来的动作是JiaFa时,这就引起function起作用,就把传过来的数值进行接收应用,在这个function函数里边还需要自己去调用一个commit,表达用户要干什么,类似于提交,随后进入mutations,这里边也是key:value的形式,对于上边案例来说就是JiaFa:function的形式,然后此处的function包含了state和传递的数值。最后经过mutate(不用我们自己调用)就把state中的sum值更新了。随后render进行页面的渲染。
在这里插入图片描述

搭建vuex开发环境

安装vuex,在命令行窗口输入以下代码

npm i vuex

随后在main.js中进行引入和使用,其中的store是一个仓库核心管理着vuex

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false


//引入vuex
import vuex from 'vuex'
//引入store
import store from './store/index'
//使用插件
Vue.use(vuex)
//创建vm
new Vue({
	el: '#app',
	store:store,
	render: h => h(App),

})

随后在src文件夹下新建一个store的文件夹,里边在新建一个index.js的文件。每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。

//自建的main.js中代码
//该文件创建vuex中最为核心的store,为了管理vuex工作原理中的actions、mutations、state
//引入vue
import Vue from 'vue'
//引入vuex
import Vuex from 'vuex'

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

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

}

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

//使用插件
Vue.use(Vuex)
//创建store
const store = new Vuex.Store({
    // 传进去一些值,key:value形式
    actions: actions,
    mutations: mutations,
    state: state,
})
//暴露store
export default store

至此,我们的vm实例对象和vue组件实例对象都有了一个$store。

修改案例为vuex版本

第一步得把sum的和放在vuex中的state中管理。第二步调用dispatch,写一些要做的动作和数值,第三步在actions里边,写要执行的动作和数值,第四步在actions中的function函数中还要调用commit。第五步在mutation中写要执行的动作。第六步,自动更新state中的值。
其中自定义组件中的count.vue中的代码如下:

<template>
  <div>
    <h1>当前求和为:{{ this.$store.state.sum }}</h1>
    <select v-model.number="numbers">
      <!-- value前边加冒号,就会被当成js表达式处理,如果不加,value值就是字符串形式 -->
      <option :value="1">1</option>
      <option :value="2">2</option>
      <option :value="3">3</option>
    </select>
    <button @click="JiaFa">+</button>
    <button @click="JianFa">-</button>
    <button @click="JiShu">当前求和为奇数在加</button>
    <button @click="DengXia">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      numbers: 1, //用户选择的数字
    };
  },
  methods: {
    JiaFa() {
      //调用dispatch,因为$store在this指向的组件实例对象vc身上,dispatch又在store身上
      this.$store.dispatch("jia", this.numbers);
    },
    JianFa() {
      this.$store.dispatch("jian", this.numbers);
    },
    JiShu() {
      // if (this.$store.state.sum % 2) {
      //   this.$store.dispatch("jia", this.numbers);
      this.$store.dispatch("jiShu", this.numbers);
      // }
    },
    DengXia() {
      setTimeout(() => {
        this.$store.dispatch("jia", this.numbers);
      }, 500);
    },
  },
};
</script>

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

自己新建的index.js中的代码如下:

//该文件创建vuex中最为核心的store,为了管理vuex工作原理中的actions、mutations、state
//引入vue
import Vue from 'vue'
//引入vuex
import Vuex from 'vuex'

//准备actions,用于响应组件中的动作
const actions = {
    jia: function (miniStore, value) {
        miniStore.commit('jia', value)
    },
    jian: function (miniStore, value) {
        miniStore.commit('jian', value)
    },
    jiShu: function (miniStore, value) {
        //把判断和为奇数时在进行求和的逻辑写在这actions中
        if (miniStore.state.sum % 2) {
            miniStore.commit('jia', value)
        }
    },
}
//准备mutations,用于操作数据(state)
const mutations = {
    jia(state, value) {
        state.sum += value
    },
    jian(state, value) {
        state.sum -= value
    }
}

//准备state,用于存储数据
const state = {
    sum: 0, //当前的和
}

//使用插件
Vue.use(Vuex)
//创建store
const store = new Vuex.Store({
    // 传进去一些值,key:value形式
    actions: actions,
    mutations: mutations,
    state: state,
})
//暴露store
export default store

最后输出的效果如下
在这里插入图片描述

vuex开发者工具

打开vue调试工具,点击红框内的选项,就进入了vuex调试工具。(使用的是Google浏览器)
在这里插入图片描述
根据上述案例,我们点击+按钮,就会发现红框中记录了我们的操作,显示jia,这个字符在代码里我们是写在了mutations中的,所以也印证了工作原理图中,开发者工具是监控mutations的说法。
在这里插入图片描述
这个按钮类似于时间穿梭,绿色的背景框在哪就意味着页面显示到了哪一步,点击秒表按钮,绿色背景框就会跳转到当前的步骤中。
在这里插入图片描述
这个按钮是去除这一步。因为我们的案例是依赖于第一步,每一步都依赖前一步的计算,所以当去除第一步的时候,我们所有的步骤都消失了,只剩下base state(最基础的状态)。
在这里插入图片描述
合并当前步骤以及之前的步骤,全部归在base state中,不在单独显示。
在这里插入图片描述

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值