冇事来学系--Vue2.0中vuex(下)

简介: 配置getters对象

配置getters对象

// 与state平级,配置getters对象
const getters = {
  bigSum(state){    // getters对象里设置一个处理函数,state作为形参
    return state.sum*10     // 通过return返回处理后的数据
  }
}
// 在组件中通过vc上的$store中的getters对象,可以获取到处理后的数据
// $store.getters.bigSum就是上面处理后的数据

vuex中的mapState与mapGetters

一个问题:在模板中使用这些数据的时候,都要从vc上的store中的state或者getters中获取,所以模板中会出现大量store中的state或者getters中获取,所以模板中会出现大量storestategettersstore.state,我们可以通过计算属性computed来解决

{{$store.state.sum}}
{{$store.state.school}}
{{$store.state.student}}
// 用计算属性将上面的代码简化
computed: {
  sum(){
    return $store.state.sum
  },
  school(){
    return $store.state.school
  },
  student(){
    return $store.state.student
  }
}
// 这样模板中就可以写的简单一些
{{sum}}
{{school}}
{{student}}

但是,在计算属性computed节点中也很繁琐,这里就可以采用mapState对计算属性进行简化了

mapState方法:用于帮助我们映射state中的数据为计算属性

// 知识回顾---扩展运算符
// 扩展运算符就是在数组/对象的前面加三个点,相当于把数组/对象拆分成了以逗号分隔的参数序列
let obj = {x: 100, y: 200}
let obj1 = {
  a: 1,
  ...obj,
  b: 2
}
// 上面的代码中,会将obj的一组组key: value拆出来放到obj1中

使用mapState方法

<script>
  // 在组件中引入mapState和mapGetters
  import {mapState, mapGetters} from 'vuex'
  export default{
    name: '',
    data(){},
    computed: {
    // 使用mapState方法生成计算属性(对象写法)
    ...mapState({sum: 'sum', schoool: 'school', student: 'student'})
    // 使用mapState方法生成计算属性(数组写法)
    // 当计算属性名 和 data中要获取的数据名字相同时,就可以使用数组形式的写法
    ...mapState(['sum', 'school', 'student'])  
    }
    // mapState({sum: 'sum', schoool: 'school', student: 'student'})
    // 直接使用mapState函数,里面的参数以键值对的形式,传入属性名和state中对应的数据
    // mapState处理的结果是一个对象,里面包含了与传入的属性名 对应的函数
    // 由于computed节点是一个对象,又包裹mapState处理结果的对象,这就造成语法的错误
    // 所以要使用扩展运算符,把mapState返回的对象拆分成参数序列才能放到computed中
  } 
</script>

mapGetters与mapState的使用方法一致


Vuex中的mapActions与mapMutations

与mapState类似,mapMutations是对methods节点内方法的简写

mapMutations用于生成methods节点中的方法,生成的方法中会自动调用commit,提交处理函数到mutations对象

<template>
  <div class="containor">
    <select v-model.number="number">    <!-- 将获取的数据强制转换为number数值型 -->
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="increment(number)">点我+1</button>
    <button @click="decrement(number)">点我-1</button>
    <!-- 使用mapMutations生成事件回调函数,则必须在绑定事件函数的时候传入参数 -->
  </div>
</template>
<script>
  // 在组件中引入mapMutations和mapActions
  import {mapMutations, mapActions} from 'vuex'
   export default{
    name: '',
    data(){
      return {
        number: 1
      }
    },
    methods: {
      // 组件绕过了dispatch给Actions的过程,直接commit给Mutations
      increment(){      
        this.$store.commit('increment', this.number)
      },
      decrement(){      
        this.$store.commit('decrement', this.number)
      }
      // 使用mapMutations生成methods节点中的方法(对象写法)
      // mapMutations函数的形参传入一个对象,key、value分别是methods节点下注册的方法名和提交给mutations对象的方法名
      ...mapMutations({increment: 'increment', decrement: 'decrement'})
     // 注意这种写法没有传递数据this.number,所以要在绑定事件函数的时候传入参数
     // 使用mapMutations生成methods节点中的方法(数组写法)
     // 当methods节点下注册的方法名和提交给mutations对象的方法名一致时,可以用数组简写
     ...mapMutations(['increment', 'decrement'])
    }
   }
</script>

mapActions的用法与mapMutations的用法一致

使用mapActions生成methods节点中的方法,生成的方法会自动调用dispatch,派遣处理函数到actions对象

methods: {
  incrementOdd(){
    this.$store.dispatch('incrementOdd',this.number)
  },
  incrementWait(){
    this.$store.dispatch('incrementWait',this.number)  
  },
  ...mapActions({incrementOdd: 'incrementOdd', incrementWait: 'incrementWait'})
  // 使用mapAcions生成methods节点中的方法(数组写法)
  // 当methods节点下注册的方法名和dispatch派遣给actions对象的方法名一致时,可以用数组简写
  ...mapActions(['increment', 'decrement'])
}
// 同理,在绑定事件的时候得把参数写上,因为mapActions生成methods方法时没有传递this.number
<button @click="incrementOdd(number)">奇数时点我+1</button>
<button @click="incrementWait(number)">点我1s后再+1</button>


目录
相关文章
|
存储 JavaScript 前端开发
冇事来学系--Vue2.0中vuex(上)
专门在Vue中实现集中式状态 (数据) 管理的一个Vue插件,对vue中多个组件的共享状态进行集中式的管理(读/写) ,适用于任意组件之间的通信
162 0
|
JavaScript 容器
冇事来学系--Vue2.0中VueComponent(组件)
组件的本质 组件的本质就是一个 构造函数 f VueComponent (options) { this._init(options); } ,是Vue.extend( )生成的 当我们使用组件时,写了组件的标签,Vue解析时就会创建该组件的实例对象,即Vue帮我们执行了这一句代码 new VueComponent(options) (options就是我们写的data、methods、computed等数据) 每次调用Vue.extend( )时,返回的都是一个全新的VueComponent
272 0
|
JavaScript 开发者
冇事来学系--Vue2.0中自定义指令
什么是自定义指令 vue官方提供了v-text、v-for、v-if、v-model等指令,此外vue还允许开发者自定义指令
96 0
|
JavaScript
冇事来学系--Vue2.0中自定义事件
定义 一种组件之间通信的方式,适用于子传父
78 0
|
JavaScript
冇事来学系--Vue2.0事件绑定
事件绑定指令 v-on事件绑定指令,用于为DOM元素绑定事件监听 语法格式 --> v-on: 事件名称="事件处理函数名称" 若需要传递参数,则在事件处理函数名称后面加个括号( ),在括号内写入参数
99 0
|
存储 前端开发 JavaScript
冇事来学系--Vue2.0中路由Router
路由的概念与原理 路由(router),就是对应关系。即 Hash地址(锚点链接) 与 组件 之间的对应关系 注意:锚点链接的特点-->不会刷新页面,但是会产生浏览历史
178 0
|
开发者
冇事来学系--Vue2.0侦听器
watch侦听器允许开发者监视数据的变化,从而针对数据的变化做出特定的操作
86 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中vue-cli使用
单页面应用程序(Single Page Application) 一个web网站只有一个HTML页面,所有的功能与交互都在这一个页面上完成
105 0
|
JavaScript
|
JavaScript 前端开发
冇事来学系--Vue2.0中讲讲生命周期吧
生命周期(Life Cycle) 是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行 。是vue在关键时刻帮我们调用的一些特殊名字的函数。 生命周期函数中的this指向的是vm或组件实例对象
150 0