如何在Vuejs组件中应用过滤器?

时间:2016-02-08 09:28:31

标签: javascript vue.js

如果我有一个简单的过滤器,请说:

Vue.filter('foo', function (value) {
    return value.replace(/foo/g, 'bar');
});

一个简单的组件:

Vue.component('example', {
    props: {
        msg: String,
    },
});

在标记内:

<example inline-template :msg="My foo is full of foo drinks!">
    {{ msg }}
</example>

我可以简单地应用过滤器:

<example inline-template :msg="My foo is full of foo drinks!">
    {{ msg | foo }}
</example>

我可以在模板中轻松应用过滤器,但是我想将该逻辑移回组件中。

它不是需要成为过滤器,但基本上是为数据字段创建getter和setter的方法。

类似的东西:

Vue.component('example', {
    props: {
        msg: {
            type: String,
            getValue: function(value) {
                return value.replace(/foo/g, 'bar');
            },
        }
    },
});

3 个答案:

答案 0 :(得分:10)

它有点隐藏,我不确定它是否有记录,但有一个Github issue on how to use filters in components

要使用getter和setter,computed properties是完美的:

Vue.component('example', {
    props: {
        msg: {
            type: String,
        }
    },
    computed: {
        useMsg: {
            get: function() {
                return this.$options.filters.foo(this.msg);
            },
            set: function(val) {
                // Do something with the val here...
                this.msg = val;
            },
        },
    }
});

以及相应的标记:

<example inline-template :msg="My foo is full of foo drinks!">
    {{ useMsg }}
</example>

答案 1 :(得分:0)

过滤器只能具有组件的范围(与指令或转换相同)。你需要注册它的组件级别。你在VueJS docs上有一个很好的例子

var Child = Vue.extend({ /* ... */ })

var Parent = Vue.extend({
  template: '...',
  components: {
    // <my-component> will only be available in Parent's template
    'my-component': Child
  }
})

希望这会有所帮助。可在以下网址找到相关信息:http://vuejs.org/guide/components.html#Local_Registration

答案 2 :(得分:0)

您可以将本地过滤器添加到每个组件:

filters: {
  filterName: function (value) {
    // some logic
    var result = ....
    // 
    return result;
  }
}

调用该过滤器:

<div> {{ value | filterName }} </div>