filters访问methods中的方法,methods中使用过滤器的方法

博客介绍了Vue中methods与filters相互调用的方法。在methods中使用过滤器,可采用全局过滤器或设置当前组件的方法;filters访问methods时,因全局和局部filters无法获取this,需在template模板传参this,且传的是Vue实例的代理对象,若要获Vue实例需调用_self方法。
一、methods中使用过滤器的方法

1.一种方法是采用全局过滤器
设置全局的filter的方法

Vue.filter(‘name’,function (val) {})

在methods中使用全局的filter:

Vue.filters['filterName'] (val)

2.设置当前组件的方法

filter: {
  functionName (val) {
  // logic process
  }
}

在methods中使用局部的filter:

this.$options.filters['filterName'] (val)

例子:

Vue.filter('capitalize', function (value) {
  if (!value) return ''
  value = value.toString()
  return value.charAt(0).toUpperCase() + value.slice(1)
})

new Vue({
  methods:{
  	someMethod(){
  		const someValue = 'hello'
  	  	console.log(this.$options.filters['capitalize'](someValue)) // Hello 
  	}
  }
  // ...
})
二、filters访问methods中的方法

全局filters和本地filters是为了避免命名冲突和全局污染。全局filters和局部filters都无法获取this,如想获取,需要采用变通的方法,即在外面传参,在调用过滤器的地方(template模板里面),把this传进去。譬如:

<detail-item label="员工状态" :value="modelDetail.employeeStatus|employeeStatusFilter(this)"></detail-item>

这样就需要改一下过滤器的定义,譬如:

employeeStatusFilter(value, that) { // that接受传参this
      // some code
},

还有一点需要注意,通过在template html传参this,并不是Vue实例,而是Vue实例的代理对象,参见下图:
在这里插入图片描述
如果要想获得Vue实例,需要调用_self方法,即:

const _this = that._self // _this即为Vue实例

然后,我们就可以调用methods、data中的方法和属性了,即:

employeeStatusFilter(value, that) {
      const _this = that._self
      return _this.pickLabel(_this.employeeStatusOptions, value) //pickLabel为methods中的一个方法
},

参考文章:https://blog.youkuaiyun.com/fredricen/article/details/107165890

Vue2的methods调用filters有以下几种方式: - **通用方法**:使用`this.$options.filters[filter](...args)`,这是一种简单实用的方法,其中`filter`是过滤器名称,`...args`是传递给过滤器的参数 [^1]。 - **对象属性访问的两种形式**:可以采用对象名.方法名或者对象名['方法名']的形式调用过滤器。例如在组件内,在methods使用filters过滤器可以这样写: ```javascript methods: { let light = 0; let trafficLight = this.$options.filters.statusType(light); // 对象名.方法名 let trafficLight1 = this.$options.filters['statusType'](light); // 对象名.['方法名'] }, filters: { statusType(value) { switch (value) { case 1: return '红灯'; case 2: return '绿灯'; case 3: return '黄灯'; } } } ``` 这里展示了使用对象属性两种不同访问方式调用过滤器的示例 [^2]。 - **特定方法示例**:在具体的方法使用过滤器,如在`methods`的`caseBoardClick`方法调用`filters`中的`getHandleNameFilter`过滤器: ```javascript filters: { getHandleNameFilter(val) { let arrayData = { 1: '打开', 2: '编辑', 3: '删除' }; return arrayData[val]; } }, methods: { caseBoardClick(id) { console.log('点击了caseBoard', this.$options.filters['getHandleNameFilter'](id)); } } ``` [^3] - **全局和局部过滤器调用**:使用全局的filter可以通过`Vue.filters['filterName'] (val)`;使用局部的filter则使用`this.$options.filters['filterName'] (val)`,这里的`filterName`是过滤器名称,`val`是传递给过滤器的值 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值