【vue】利用计算属性解决filter无法使用this的问题

常见现象

项目中常常碰到,一个显示结果依赖另外一个显示结果的情况。

比如:A 的显示中有一个公司ID的字段 company_id ,但是实际显示的时候,需要显示公司名,company_name。那么常见的做法就是,在filter里面写个过滤器,将company_id转换为company_name

但是这个显示结果不尽人意,原因是vue在过滤器当中禁止this的使用,此处调用会导致代码报错。

普遍解决办法

那么有些一些做法是在methods定义一个转换方法,但是这种办法缺点在于严重依赖网络请求的先后顺序,此示例当中必须先请求company_name对于的接口,其次请求company_id对应的网络接口。此办法严重拖慢了网页的相应速度。

示例代码如下:

<template #company_id="text">{{companyName(text)}}</template>
data() {
    return {
      projectFormNameDisable: false,
      loadProjectSpinning: false,
      projectData: [],
      companyList: [],
    };
  },
mounted() {
    companylist().then(response => {
      this.companyList = response.data.data;
      this.loadPorjectData(); //依赖companylist网络请求
    });
},
methods: {
    companyName(company_id) {
      return this.companyList.filter(item => {
        return item.company_id == company_id;
      })[0].company_name;
    },
    loadPorjectData() {
      this.loadProjectSpinning = true;
      const params = this.page;
      projectList(params).then(response => {
        const data = response.data;
        this.projectData = data.data.list;
        this.loadProjectSpinning = false;
      });
    }
}

利用计算属性的特性解决

在实践中发现,可以利用计算属性解决这个问题,因为计算属性的刷新会监控内部依赖数据。这样就无需嵌套式的网络请求了。

示例代码如下:

<template #company_id="text">{{companyName(text)}}</template>
data() {
    return {
      projectFormNameDisable: false,
      loadProjectSpinning: false,
      projectData: [],
      companyList: [],
    };
  },
mounted() {
    this.loadPorjectData(); //不再依赖companylist网络请求
    companylist().then(response => {
      this.companyList = response.data.data;
    });
},
computed: {
    companyName() {
        // 在计算属性内返回一个匿名函数,来接收外不参数
      return function(company_id) {
        return this.companyList.filter(item => {
          return item.company_id == company_id;
        })[0].company_name;
      };
    },
methods: {
    loadPorjectData() {
      this.loadProjectSpinning = true;
      const params = this.page;
      projectList(params).then(response => {
        const data = response.data;
        this.projectData = data.data.list;
        this.loadProjectSpinning = false;
      });
    }
}

这样,就解决了,网络请求相互依赖的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值