Vuex中如何getters动态获取state的值

目录
  • Vuex getters动态获取state的值
    • 案例
    • 说明
  • Vuex state值更改但是getters未更新
    • 实现效果

Vuex getters动态获取state的值

在做项目时,getters里有很多冗余代码,但是仔细一看可以根据参数来解决,于是决定使用传参来进行获取,减少代码冗余。

案例

需求:在getters里能够根据值动态获取到people的元素。经过多次尝试,最终得到下面的代码。

state.js代码如下:

export default {
  people: [
    {
      name: 'zs',
      age: 14
    },
    {
      name: 'ss',
      age: 24
    },
    {
      name: 'gh',
      age: 34
    }
  ]
}

getters.js代码如下:

const getters = {
// 根据index获取state.person[index]
  getPerson: function (state) {
    // console.log(state)
    return function (index) {
      return state.people[index]
    }
  },
  // 获取state.person[0]
  getPerson1: function (state) {
    // console.log('getPerson1:', state.people[0])
    // console.log(typeof getters.getPerson) return function
    // console.log(getters.getPerson(state)(1))  注: state不传过去的话,getPerson()找不到state
    return getters.getPerson(state)(1) // 成功获取state.person[0]
  },
  getPerson2: function (state) {
    return getters.getPerson(state)(2) // 成功获取到state.person[1]
  }
}
export default getters

说明

因为项目中数据还要响应式,因此我使用setInterval方法来模拟是否会实时更新,事实证明可以,因此可以推荐用这种方法。

Vuex state值更改但是getters未更新

实现效果

选择一种交通工具则出现对应的席别列表。

state:

 seatList: {},//初始席别

最后state结果:

seatList: {
  '1':[{
  code:"101",
  name:'经济舱'
  },{
  code:"102",
  name:'公务舱'
  }],
  '2':[{
    code:"201",
    name:'商务座'
  },
  ...
  ]
},

getters:

seatListItem:(state)=>(key)=>{
    let list=state.common.seatList;
    return list[key]?list[key]:[]
  },

mutations:

SET_SEAT_LIST: (state,data) => {
      state.seatList = null;//问题出现在此处,对象要先置为null再赋值就可
      state.seatList= data;
    },

template:

<!-- 席别-->
          <el-select v-if="scope.row.vehicleCode&&seatListItem(scope.row.vehicleCode)" placeholder="" size="small"
                     class="selectWidth"
                     @change="handleChangeSeatType($event,scope.$index,receiptTableArr)"
                     v-model="scope.row.seatName"
                     :disabled="types == 'look'||!scope.row.vehicleCode"
                     v-bind:class="[types == 'look'?'numberStyleLocck':'','clearCursor']">
            <el-option
              v-for="(item,itenIndex) in seatListItem(scope.row.vehicleCode)"
              :label="item.value"
              :value="item"
              :key="itenIndex"
            ></el-option>
          </el-select>

computed:

computed: {
      ...mapState({
        vehicleList: state => state.vehicleList,//交通工具
        seatList: state => state.seatList,//席别
      }),
      ...mapGetters(['seatListItem'])
    },

methods:

getVehicleList(other){
      getVehicleSeatList({
        type:'JT',
        other
      }).then((res)=>{
        if(res.data.code==200){
          const data = res.data.data;
          let seatList= this.$store.state.seatList;
              if(!seatList[other]){
                seatList[other]=data
              }
              this.$store.commit('SET_SEAT_LIST', seatList, params.other);
        } else {
          this.$message.warning('获取交通工具席别失败');
          return false
        }
      })
    },

最后发现,在mutations中要先将state设置为空然后再赋值,否则不更新。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vuex通过getters访问数据为undefined问题及解决

    目录 getters访问数据为undefined问题 写一个类似例子 vuex getters(组件mounted调用)使用注意 逻辑 解决方案 getters访问数据为undefined问题 本篇文章可能对你的帮助不大, 只是个人开发中的一些记录.不同的业务和应用场景可能问题不同. 在通过 uni-app 开发商城时,用户快捷登录之后,服务器返回一个 token 数据,我将其同步到 vuex module下的 user 模块中. 然后从登录页返回到用户页,并发起 http 请求,获取用户的个人

  • 记一次vuex的mapGetters无效原因及解决

    目录 vuex的mapGetters无效原因 vuex mapGetters语法报错(Unexpected token) 解决方案 vuex的mapGetters无效原因 报错是(error during evaluation),见下图. 代码大概是下面这样, import store from './store.js' computed: { ...mapGetters('project', [ 'isOpenSupplyNeed', ]), a(){ return store.getters

  • VueX mapGetters获取Modules中的Getters方式

    目录 VueX mapGetters获取Modules的Getters mapGetters的使用及简单实现原理 项目中的mapGetters mapGetters简单实现原理 VueX mapGetters获取Modules的Getters 注明 : permission 是你要获取的Modules中的哪一个 (permission 即是 模块名);         ...mapGetters("permission",[             'ReturnRoutes'    

  • vuex中...mapstate和...mapgetters的区别及说明

    目录 ...mapstate和...mapgetters的区别 …mapstate …mapGetters vuex mapState mapGetters用法及多个module下用法 一.mapState 二.mapGetters 三.mapActions.mapMutations ...mapstate和...mapgetters的区别 …mapstate 当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余.为了解决这个问题,我们可以使用 mapState 辅助函数帮

  • vuex中getters的基本用法解读

    目录 getters的基本用法解读 一.getter 定义 二.使用方法 三.mapGetters辅助函数 四.getters注意事项 getters的两种调用方法 方法一 方法二 getters的基本用法解读 一.getter 定义 Vuex允许我们在store中定义"getter" ,用于对state中存储的数据进行过滤操作. 就像vue生命周期中的computed一样,getter的返回值 会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算 二.使用方法 1.通

  • Vuex中如何getters动态获取state的值

    目录 Vuex getters动态获取state的值 案例 说明 Vuex state值更改但是getters未更新 实现效果 Vuex getters动态获取state的值 在做项目时,getters里有很多冗余代码,但是仔细一看可以根据参数来解决,于是决定使用传参来进行获取,减少代码冗余. 案例 需求:在getters里能够根据值动态获取到people的元素.经过多次尝试,最终得到下面的代码. state.js代码如下: export default { people: [ { name:

  • vuex分模块后,实现获取state的值

    问题:vuex分模块后,一个模块如何拿到其他模块的state值,调其他模块的方法? 思路: 1.通过命名空间取值--this.$store.state.car.list // OK 2.通过定义该属性的getter方法,因方法全局注册,不存在命名空间,可以通过this直接调用. this.$store.state.car.carGetter 我在car模块中自己的定义了state, getters, this.$store.state.car.list可以拿到值. 但是,this.$store.

  • JS中通过url动态获取图片大小的方法小结(两种方法)

    很多时候再项目中,我们往往需要先获取图片的大小再加载图片,但是某些特定场景,如用过cocos2d-js的人都知道,在它那里只能按比例缩放大小,是无法设置指定大小的图片的,这就是cocos2d-js 的坑了,我们必须先获取图片大小,计算比例再对图片进行缩放. 查阅资料,我总结了两种通过url获取图片大小的方法: 1.预加载获取图片大小 var imgLoad = function (url, callback) { var img = new Image(); img.src = url; if

  • C#高性能动态获取对象属性值的步骤

    动态获取对象的性能值,这个在开发过程中经常会遇到,这里我们探讨一下何如高性能的获取属性值.为了对比测试,我们定义一个类People public class People { public string Name { get; set; } } 然后通过直接代码调用方式来取1千万次看要花多少时间: private static void Directly() { People people = new People { Name = "Wayne" }; Stopwatch stopw

  • react如何获取state的值并更新使用

    目录 react获取state值并更新使用 在视图层处理 在model层处理 react中state基本使用 有状态组件和无状态组件 state的基本使用 setState修改状态 从JSX中抽离事件处理程序 事件绑定this指向 react获取state值并更新使用 react获取state的值并且修改分为两种情况: 在视图层处理 //在 state 中饭设置初始值 state={       name:'',       age:''  } //通过 控制一个事件触发然后setState 去

  • Python中执行存储过程及获取存储过程返回值的方法

    本文实例讲述了Python中执行存储过程及获取存储过程返回值的方法.分享给大家供大家参考,具体如下: 在Pathon中如何执行存储过程呢?可以使用如下方法: 存储过程定义基本如下: ALTER procedure [dbo]. [mysp] @Station varchar ( 50), @SN varchar ( 50), @Info varchar ( 500) output , @Msg varchar ( 500) output 1. 使用adodbapi from adodbapi i

  • 在django中实现choices字段获取对应字段值

    我就废话不多说了,大家还是直接看代码吧~ class Area(models.Model): Area_Level = ( (0, u'全国'), (1, u'省.直辖市'), (2, u'市.直辖市区'), (3, u'区.县等'), ) areaname = models.CharField(max_length=30,unique=True, verbose_name='区域名称') code = models.CharField(max_length=20,blank=True, def

  • react中(含hooks)同步获取state值的方式

    目录 react(含hooks)同步获取state值 环境 代码示例 异步写成同步的方法 react hooks常用方法 1.useState 2.useEffect 3.useContext上下文传值 4.useReducer 5.useMemo 6.useRef react(含hooks)同步获取state值 环境 "dependencies": {     "babel-plugin-transform-decorators-legacy": "^1

  • 利用sender的Parent获取GridView中的当前行(获取gridview的值)

    获取GridView当行有好几个方法: 1 加RowCommand事件中,判断请求的发出按钮控件名,根据传递的参数来获取当前行中我们需要的参数.2 GridView设置datakeynames方式. 以上方法实现不再累赘. 今天给大家介绍一种最方便,也最满足日常思维的好办法:采用控件事件的sender的Parent来获取cell对象,再取cell的上级对象,也就是row对象了.简单吧! 示例如下:在第三列中放了一个模板列,放入了一个CheckBox,想法是在选中时,设置第四列Lable状态标识为

  • Vuex中mutations和actions的区别及说明

    目录 mutation Mutation 必须是同步函数 Action 在实际开发的store文件中 总结 mutation 我们知道,在使用vuex对项目状态进行管理时,只能使用commit来提交mutation对store中的状态进行更改 Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler).这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数: const

随机推荐