Vuex中的Getters

Vuex中的Getters

一、 使用场景
  • 有时候,我们需要从store中获取(派生)一些state变异后的状态,比如下面的Store中:
  • 问题:获取学生年龄大于20的个数。
const store = new Vuex.Store({
  state: {
    counter: 1000,
    students: [
      {id: 110, name: 'cyz', age: 18},
      {id: 111, name: 'kobe', age: 23},
      {id: 112, name: 'james', age: 30},
      {id: 113, name: 'curry', age: 10}
    ]
  }
})
  • 可以使用计算属性:利用filter()函数过滤数据
computed: {
    more20stu() {
      return this.$store.state.students.filter(s => s.age > 20)
    }
  }
  • 如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数然后在多处导入它——无论哪种方式都不是很理想。
二、Getters的基本使用
  • Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
  • Getter 接受 state 作为其第一个参数:
const store = new Vuex.Store({
  state: {
    counter: 1000,
    students: [
      {id: 110, name: 'cyz', age: 18},
      {id: 111, name: 'kobe', age: 23},
      {id: 112, name: 'james', age: 30},
      {id: 113, name: 'curry', age: 10}
    ]
  },
  getters: {
    more20stu(state) {
      return state.students.filter(s => s.age > 20)
    }
 }
})
三、Getters通过属性和方法访问(作为参数、传递参数)
  • 通过属性访问
    • Getter 会暴露为 store.getters 对象,你可以以属性的形式访问这些值:
      Getter 也可以接受其他 getter 作为第二个参数:
    • 如果我们已经有了一个获取所有年龄大于20岁学生列表的getters, 那么我们可以通过属性访问其他getters,比如年龄大于20岁的学生个数
const store = new Vuex.Store({
  state: {
    counter: 1000,
    students: [
      {id: 110, name: 'cyz', age: 18},
      {id: 111, name: 'kobe', age: 23},
      {id: 112, name: 'james', age: 30},
      {id: 113, name: 'curry', age: 10}
    ]
  },
  getters: {
    more20stu(state) {
      return state.students.filter(s => s.age > 20)
    },
    more20stuLength(state, getters) {
      return getters.more20stu.length
    },
  }
})
  • 通过方法访问
    • 你也可以通过让 getter 返回一个函数,来实现给 getter 传参。在你对 store 里的数组进行查询时非常有用。
    • 比如上面的案例中,我们希望根据传入的年龄参数获取学生信息
<h2>{{$store.getters.moreAgestu(20)}}</h2>
const store = new Vuex.Store({
  state: {
    counter: 1000,
    students: [
      {id: 110, name: 'cyz', age: 18},
      {id: 111, name: 'kobe', age: 23},
      {id: 112, name: 'james', age: 30},
      {id: 113, name: 'curry', age: 10}
    ]
  },
  getters: {
    more20stu(state) {
      return state.students.filter(s => s.age > 20)
    },
    more20stuLength(state, getters) {
      return getters.more20stu.length
    },
    moreAgestu(state) {
      // return function (age) {
      //   return state.students.filter(s => s.age > age)
      // }
      return age => {
        return state.students.filter(s => s.age > age)
      }
    }
  }
})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值