• vuex---$store案例


    目录

    vuex流程图

    安装vuex

    搭建vuex环境

    一、使用vuex编写求和案例

    main.js

    src/store/index.js

    Count.vue

    效果图

    二、getters配置项

    三、引入mapState、mapGettes

        借助mapState生成计算属性,从state中读取数据

          方式一:对象写法

          方式二:数组写法

        借助mapGetters生成计算属性,从getters中读取数据

          方式一:对象写法

          方式二:

    四、mapActions与mapMutations

         借助mapMutations生成对应方法,

         借助mapActions生成对应方法,

    五、vuex模块化管理+namespace

    总结

    count.js

     person.js

     count.vue




    vuex流程图

     State理解为数据源,像极了我们之前学的data

    Actions似java中的业务逻辑层,对逻辑操作,然后向Mutations发送数据,在这个业务逻辑中也可以互相调用,如下图所示(连环处理)

           Mutations类似java中的数据层,只对数据进行操作,不对业务操作(比如数据加减乘除)

    安装vuex

    搭建vuex环境

       创建文件src/store/index.js

    1. // 该文件用于创建Vuex中最为核心的store
    2. import Vue from 'vue'
    3. // 引入Vuex
    4. import Vuex from 'vuex'
    5. // 使用vuex插件
    6. Vue.use(Vuex)
    7. // 准备actions——用于响应组件中的动作
    8. const actions={}
    9. //准备mutations——用于操作数据(state)
    10. const mutations={}
    11. //准备state——用于存储数据
    12. const state = {}
    13. // 创建store并暴露
    14. export default new Vuex.Store({
    15. // actions:actions,
    16. // mutations:mutations,
    17. // state:state
    18. // 当key和value重名的时候,可以简写
    19. actions,
    20. mutations,
    21. state
    22. })

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

    1. // 该文件是整个项目的入口文件
    2. // 引入vue,这个vue不能解析template配置项
    3. import Vue from 'vue'
    4. // 下面这个是引入完整版的vue。这个vue能解析template配置项
    5. // import Vue from 'vue/dis/vue'
    6. // 引入APP组件,它是所有组件的父组件
    7. import App from './App.vue'
    8. // 引入store
    9. import store from './store/index'
    10. // 关闭vue的生产提示
    11. Vue.config.productionTip = false
    12. // 创建vue实例对象---vm
    13. new Vue({
    14. el:'#app',
    15. render: h => h(App),
    16. store,
    17. // 全局事件总线
    18. beforeCreate(){
    19. Vue.prototype.$bus = this
    20. }
    21. })

    一、使用vuex编写求和案例

    main.js

    1. // 该文件是整个项目的入口文件
    2. // 引入vue,这个vue不能解析template配置项
    3. import Vue from 'vue'
    4. // 下面这个是引入完整版的vue。这个vue能解析template配置项
    5. // import Vue from 'vue/dis/vue'
    6. // 引入APP组件,它是所有组件的父组件
    7. import App from './App.vue'
    8. // 引入store
    9. import store from './store/index'
    10. // 关闭vue的生产提示
    11. Vue.config.productionTip = false
    12. // 创建vue实例对象---vm
    13. new Vue({
    14. el:'#app',
    15. render: h => h(App),
    16. store,
    17. // 全局事件总线
    18. beforeCreate(){
    19. Vue.prototype.$bus = this
    20. }
    21. })

    src/store/index.js

    1. // 该文件用于创建Vuex中最为核心的store
    2. import Vue from 'vue'
    3. // 引入Vuex
    4. import Vuex from 'vuex'
    5. // 使用vuex插件
    6. Vue.use(Vuex)
    7. // 准备actions——用于响应组件中的动作
    8. const actions={
    9. // // value是传入过来的参数
    10. // jia(context,value){
    11. // console.log('actions中的jia被调用了',context,value)
    12. // // 下面这个地方用大写的做个区分
    13. // context.commit('JIA',value)
    14. // },
    15. // jian(context,value){
    16. // console.log('actions中的jian被调用了',context,value)
    17. // // 下面这个地方用大写的做个区分
    18. // context.commit('JIAN',value)
    19. // },
    20. jiaOdd(context,value){
    21. console.log('actions中的jian被调用了',context,value)
    22. if(context.state.sum%2){
    23. context.commit('JIA',value)
    24. }
    25. },
    26. jiaWait(context,value){
    27. console.log('actions中的jiaWait被调用了',context,value)
    28. setTimeout(()=>{
    29. context.commit('JIA',value)
    30. },500)
    31. }
    32. }
    33. //准备mutations——用于操作数据(state)
    34. // 在这个地方不要写业务逻辑 就写数据
    35. const mutations={
    36. // 直接的帮我们操作sum
    37. JIA(state,value){
    38. console.log('mutations中的JIA被调用了',state,value)
    39. state.sum +=value
    40. },
    41. JIAN(state,value){
    42. console.log('mutations中的JIAN被调用了',state,value)
    43. state.sum -=value
    44. },
    45. }
    46. //准备state——用于存储数据
    47. const state = {
    48. sum:0 //当前的和
    49. }
    50. // 创建store并暴露
    51. export default new Vuex.Store({
    52. // actions:actions,
    53. // mutations:mutations,
    54. // state:state
    55. // 当key和value重名的时候,可以简写
    56. actions,
    57. mutations,
    58. state
    59. })

    Count.vue

    1. <template>
    2. <div>
    3. <h1>当前求和为:{{$store.state.sum}}h1>
    4. <select v-model="n">
    5. <option :value="1">1 option>
    6. <option :value="2">2option>
    7. <option :value="3">3 option>
    8. select>
    9. <button @click="increment">+button>
    10. <button @click="decrement">-button>
    11. <button @click="incrementOdd">当前求和为奇数再加button>
    12. <button @click="incrementWait">等一等再加button>
    13. div>
    14. template>
    15. <script>
    16. export default {
    17. name:'Count',
    18. data(){
    19. return{
    20. n:1, //用户选择的数字
    21. }
    22. },
    23. methods:{
    24. increment(){
    25. // $store在vc身上,所以要用this
    26. // this.$store.dispatch('jia',this.n) 如果没有逻辑我们直接commit和Mutations对话
    27. this.$store.commit('JIA',this.n)
    28. },
    29. decrement(){
    30. // this.$store.dispatch('jian',this.n)
    31. // 如果没有逻辑我们直接commit和Mutations对话
    32. this.$store.commit('JIAN',this.n)
    33. },
    34. incrementOdd(){
    35. this.$store.dispatch('jiaOdd',this.n)
    36. },
    37. incrementWait(){
    38. this.$store.dispatch('jiaWait',this.n)
    39. }
    40. }
    41. }
    42. script>
    43. <style scoped>
    44. button{
    45. margin-left:5px
    46. }
    47. style>

    效果图

    二、getters配置项

         这个地方像极了我们之前学的computed计算属性,其实这个地方用计算属性也可以实现,但是我们为什么不用计算属性呢?

       因为我们用计算属性的话只能在单一组件中使用,我们使用getters配置项,只要是此项目中的组件都可以调用

    1. // 准备将getters——用于将state中的数据进行加工
    2. const getters ={
    3. bigSum(state){
    4. return state.sum*10
    5. }
    6. }
    7. // 创建store并暴露
    8. export default new Vuex.Store({
    9. // actions:actions,
    10. // mutations:mutations,
    11. // state:state
    12. // 当key和value重名的时候,可以简写
    13. actions,
    14. mutations,
    15. state,
    16. getters,
    17. })

    其他组件调用

          <h3>当前求和放大十倍:{{$store.getters.bigSum}}h3>

    三、引入mapState、mapGettes

         依然是类似key:value的形式,key是在本组件中我们要使用的名字,value是index.js组件中我们定义的名字

        借助mapState生成计算属性,从state中读取数据

       我们发现在最上面的案例的时候,获取state中数据有点麻烦,需要打好几段代码,下面我们可以直接读取

          方式一:对象写法

    1. <h1>当前求和为:{{he}}h1>
    2. <h3>当前求和放大十倍:{{bigSum}}h3>
    3. <h3>我在{{xuexiao}}学习{{xueke}}h3>
      import {mapState} from 'vuex'
    1. // 靠程序员亲自写计算属性也能实现
    2. computed:{
    3. // ES6语法 下面这一堆是一个对象 这句话的含义:把下面中的每一组key:value依次取出放到下面,就相当于我们写了注释中的那三个方法
    4. ...mapState({'he':'sum','xuexiao':'school','xueke':'subject'}),
    5. // 下面三个从state中取数据
    6. // he(){
    7. // return yhis$store.state.sum
    8. // },
    9. // xuexiao(){
    10. // return this.$store.state.school
    11. // },
    12. // xueke(){
    13. // return this.$store.state.subject
    14. // },
    15. // 下面这个从getters中取数据
    16. bigSum(){
    17. return this.$store.getters.bigSum
    18. }
    19. },

         方式二:数组写法

    1. // 这个时候不能简写! 一定不要简写成sum,school,subject
    2. //...mapState({'sum':'sum','school':'school','subject':'subject'}),
    3. ...mapState(['sum','school','subject']),

        借助mapGetters生成计算属性,从getters中读取数据

      import {mapGetters} from 'vuex'

          方式一:对象写法

    1. <h1>当前求和为:{{sum}}h1>
    2. <h3>当前求和放大十倍:{{bigSum}}h3>
    3. <h3>我在{{school}}学习{{subject}}h3>
    1. // 下面这个从getters中取数据
    2. // bigSum(){
    3. // return this.$store.getters.bigSum
    4. // }
    5. ...mapGetters({bigSum:'bigSum'}),

        方式二:

              ...mapGetters(['bigSum'])

    四、mapActions与mapMutations

    备注:mapActions与mapMutations使用时,若需要传递参数,在模板中绑定事件时传递好参数,否则参数是事件对象

         借助mapMutations生成对应方法,

                   方法中会调用commit去联系Mutations

      import {mapMutations} from 'vuex'
    1. <button @click="increment(n)">+button>
    2. <button @click="decrement(n)">-button>
    1. methods:{
    2. // increment(){
    3. // // $store在vc身上,所以要用this
    4. // // this.$store.dispatch('jia',this.n) 如果没有逻辑我们直接commit和Mutations对话
    5. // this.$store.commit('JIA',this.n)
    6. // },
    7. // decrement(){
    8. // // this.$store.dispatch('jian',this.n)
    9. // // 如果没有逻辑我们直接commit和Mutations对话
    10. // this.$store.commit('JIAN',this.n)
    11. // },
    12. ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    13. }

         借助mapActions生成对应方法,

               生成的方法会调用dispatch去联系mutations

    1. <button @click="incrementOdd(n)">当前求和为奇数再加button>
    2. <button @click="incrementWait(n)">等一等再加button>
    1. // incrementOdd(){
    2. // this.$store.dispatch('jiaOdd',this.n)
    3. // },
    4. // incrementWait(){
    5. // this.$store.dispatch('jiaWait',this.n)
    6. // },
    7. ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'}),

    五、vuex模块化管理+namespace

    总结

    count.js

    1. // 求和功能相关的配置
    2. export default{
    3. // 命名空间 加上这个之后,我们下面的a才能够被map...识别
    4. namespaced:true,
    5. actions:{
    6. jiaOdd(context,value){
    7. console.log('actions中的jian被调用了',context,value)
    8. if(context.state.sum%2){
    9. context.commit('JIA',value)
    10. }
    11. },
    12. jiaWait(context,value){
    13. console.log('actions中的jiaWait被调用了',context,value)
    14. setTimeout(()=>{
    15. context.commit('JIA',value)
    16. },500)
    17. }
    18. },
    19. mutations:{
    20. // 直接的帮我们操作sum
    21. JIA(state,value){
    22. console.log('mutations中的JIA被调用了',state,value)
    23. state.sum +=value
    24. },
    25. JIAN(state,value){
    26. console.log('mutations中的JIAN被调用了',state,value)
    27. state.sum -=value
    28. },
    29. },
    30. state:{
    31. sum:0, //当前的和
    32. school:'尚硅谷',
    33. subject:'前端',
    34. },
    35. getters:{
    36. // 准备将getters——用于将state中的数据进行加工
    37. bigSum(state){
    38. return state.sum*10
    39. }
    40. },
    41. }

     person.js

    1. // 人员管理相关配置
    2. export default {
    3. namespaced:true,
    4. actions:{},
    5. mutations:{
    6. // 在这个地方value就是我们要加的那个对象
    7. ADD_PERSON(state,value){
    8. state.personList.unshift(value)
    9. }
    10. },
    11. state:{
    12. personList:[
    13. {id:'001',name:'张三'},
    14. ]
    15. },
    16. getters:{},
    17. }

     count.vue

    1. <script>
    2. import {mapGetters, mapState,mapMutations,mapActions} from 'vuex'
    3. export default {
    4. name:'Count',
    5. data(){
    6. return{
    7. n:1, //用户选择的数字
    8. }
    9. },
    10. methods:{
    11. ...mapMutations('a',{increment:'JIA',decrement:'JIAN'}),
    12. ...mapActions('a',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'}),
    13. },
    14. // 靠程序员亲自写计算属性也能实现
    15. computed:{
    16. // ...mapState(['sum','school','subject']),
    17. // ...mapState(['a','b']),如若这样写 我们编写页面需要不断的进行 .调用
    18. ...mapState('a',['sum','school','subject']),
    19. ...mapState('b',['personList']),
    20. ...mapGetters('a',['bigSum'])
    21. },
    22. }
    23. script>
    24. <style scoped>
    25. button{
    26. margin-left:5px
    27. }
    28. style>

  • 相关阅读:
    计组--计算机系统概述
    数据结构02 队列及其应用【C++实现】
    torch其他层和联合使用
    openssl中SM2、SM3、SM4使用实例
    Mac下更新python
    【C++】多态 — 多态的原理 (下篇)
    【第十八篇】- Maven Eclipse
    STM32G0开发笔记-Platformio平台下使用libopencm3库
    canal rocketmq
    结构体的声明及其初始化
  • 原文地址:https://blog.csdn.net/weixin_51351637/article/details/126915799