Vue 项目数据动态过滤实践

这个问题是在下在做一个Vue项目中遇到的实际场景,这里记录一下我遇到问题之后的思考和最后怎么解决的(记性不好 -。-),过程中会涉及到一些Vue的源码,如果不太了解的话可以瞅瞅 Vue源码阅读系列文章~

问题是这样的:页面从后台拿到的数据是由0、1之类的key,而这个key代表的value比如0代表女、1代表男的对应关系是要从另外一个数据字典接口拿到的;类似于这样的Api:

{
  "SEX_TYPE": [
    { "paramValue": 0, "paramDesc": "女" },
    { "paramValue": 1, "paramDesc": "男" }
  ]
}

那么如果view拿到的是0,就要从字典中找到它的描述女并且显示出来;下面故事开始了

1. 思考

有人说,这不是过滤器 filter 要做的事么,直接filter不就行了,然而问题是这个filter是要等待异步的数据字典接口返回之后才能拿到,如果在component编译的时候这个filter没有找到,那么就会导致错误影响之后的渲染(白屏并报undefined错);

我想到的解决方法有两个,一是接口变为同步,在beforeCreate或created钩子中同步地获取数据字典接口,保证在 $mount的时候可以拿到注册好的filter,保证时序,但是这样会阻塞挂载,延长白屏时间,因此不推介;二是把filter的注册变为异步,在获取filter之后通知 render watcher 更新自己,这样可以利用vue自己的响应式化更新视图,不会阻塞渲染,因此在下初步采用了这个方法。

2. 实现

2.1 使用根组件的filters

因为filter属于 asset_types ,关于在Vue实例中asset_types的访问有以下几个结论;具体代码实践可以参考: Codepen - filter test

1.asset_types包括filters、components、directives,以下所有的asset_types都自行替换成前面几项
2.子组件中的asset_types访问不到父组件中的asset_types,但是可以访问到全局注册的挂载在 r o o t . root. root.options.asset_types.__proto__上的asset_types,这里对应源码
src/core/util/options.js
3.全局注册Vue.asset_types,比如Vue.filters注册的asset_types会挂载到根实例(其他实例的 r o o t ) 的 root)的 root)options.asset_types.__proto__上,并被以后所有创建的Vue实例继承,也就是说,以后所有创建的Vue实例都可以访问到
4.组件的slot的作用域仅限于它被定义的地方,也就是它被定义的组件中,访问不到父组件的asset_types,但是可以访问到全局定义的asset_types
5.同理,因为main.js中的new Vue()实例是根实例,它中注册的asset_types会被挂载在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值