Vue.js カスタム フィルター

高洛峰
高洛峰オリジナル
2016-11-23 17:21:281404ブラウズ

フィルターは本質的に関数です。その機能は、ユーザーがデータを入力した後、それを処理してデータ結果を返すことができることです。


Vue.js は、AngularJS のフィルター構文に似ています。接続するにはパイプ文字 (|) を使用します。コード例は次のとおりです。

{{'abc' | uppercase}}    'abc' => 'ABC'

Vue.js の組み込みフィルターの大文字は次のとおりです。ここでは文字列を変換するために使用されます。 内のすべての文字が大文字に変換されます。


Vue.js は、上記の例の二重中括弧式に加えて、バインディング命令の式の後にフィルターを追加することもできます。コード例は次のとおりです。 => HELLO WORLD!

Vue 2.x では、フィルタは口ひげバインディングでのみ使用できます。ディレクティブ バインディングで同じ動作を実現するには、計算されたプロパティを使用する必要があります。

フィルターは直列に接続できます:

<div id="app">
    <span v-text="message | uppercase"></span>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;hello world!&#39;
        }
    })
</script>

ここで例を確認できます:

{{ message | filterA | filterB }}

小文字フィルター: データを小文字に変換する

大文字化フィルターフィルター: 最初の文字を大文字に変更します

// 'ABCDE' -> 'abcde' -> 'Abcde'


フィルターは、フィルター名に続くパラメーターを受け入れることができます。スペース。コード例は次のとおりです。

<div id="app">
    <h1>{{&#39;ABCDE&#39; |lowercase | capitalize }}</h1>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;&#39;
        }
    })
</script>

フィルター関数は常に式の値を最初のパラメーターとして受け取り、引用符のないパラメーターは文字列として扱われます。文字列はデータ属性名として扱われます。

ここでのメッセージは最初のパラメーターとして使用され、文字列 arg1 は 2 番目のパラメーターとして使用され、式 arg2 の値は計算後に 3 番目のパラメーターとしてフィルターに渡されます。同時に、Vue.js フィルターはチェーン呼び出しをサポートし、前のフィルターの出力を次のフィルターの入力として使用できます

組み込みフィルター

1.大文字と小文字の 3 つのフィルタが英語の文字の処理に使用されます。注: これら 3 つのフィルターは英語の文字列にのみ使用されます

1-1、capitalize

capitalize フィルターは式の最初の文字を大文字に変換するために使用されます

{{ message | filterA(&#39;arg1&#39;, arg2) }}

1-2大文字フィルターは、式内のすべての文字を大文字に変換するために使用されます。これは、 v-for とともに使用する場合など、フィルター処理された配列を処理して返すために使用されます。

注: これら 3 つのフィルターによって処理される式の値は配列である必要があります。そうでない場合、プログラムはエラーを報告します

2-1、limitBy

limitBy フィルターは、配列を N に制限するために使用されます。開始要素の前の項目。N は渡される最初のパラメータによって指定され、制限を示します。デフォルトは 0、つまりすべての要素が取得されます。 2 番目のパラメーターはオプションで、開始位置を指定するために使用されます。たとえば、最初のパラメーターが 4、2 番目のパラメーターが 5 の場合、4 つの要素を取得し、添字 5 の要素から開始することを意味します。コード例は次のとおりです。

{{&#39;abc&#39; | capitalize}}  // &#39;abc&#39; => &#39;Abc&#39;

{{&#39;abc&#39; | uppercase}}  // &#39;abc&#39; => &#39;ABC&#39;


{{&#39;ABC&#39; | lowercase}}  // &#39;ABC&#39; => &#39;abc&#39;

は次のようにも使用できます:

<div id="app">
    <ul>
        <!--第二个参数不指定,即取全部,从0开始-->
        <li v-for="item in items | limitBy">{{item}}</li>
    </ul>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            items:[1,2,3,4,5,6,7,8,9,10]
        }
    })
</script>


2-2、filterBy

filterBy フィルターの詳細最初のパラメーターは文字列または関数にすることができます。フィルター条件は次のとおりです: 'string function' + in + 'optionKeyName'


最初のパラメーターが文字列の場合、各配列要素は次のようになります。を検索し、その文字列の要素を含む配列を返します。コード例は次のとおりです。

<div id="app">
    <ul>
        <!--只显示5个元素,从0开始-->
        <li v-for="item in items | limitBy 5">{{item}}</li>
    </ul>
</div>

配列要素がオブジェクトの場合、フィルターはそのすべてのプロパティを再帰的に検索します。検索を絞り込むには、検索フィールドを指定します。コード例は次のとおりです。

<div id="app">
    <ul>
        <!--显示4个,从下标为3的元素开始  注意:下标是从0开始-->
        <li v-for="item in items | limitBy 4 3">{{item}}</li>
    </ul>
</div>

filterBy の最初のパラメーターが関数の場合、フィルターは関数の戻り結果に基づいてフィルター処理します。このとき、filterBy フィルターは、JavaScript 配列内の組み込み関数 filter() を呼び出して配列を処理します。フィルター対象の配列内の各要素がパラメーターとして入力され、filterBy に渡された関数が実行されます。

関数が true を返す配列要素のみが対象となり、最終的な戻り結果はこの新しい配列に格納されます。


2-3、orderBy

orderByフィルターの機能は、ソートされた配列を返すことです。フィルター条件: '文字列 || 関数' + 'order>=0 は昇順 || は降順です。

第一个参数可以是字符串、数组或者函数,第二个参数order可选,决定结果为升序或降序排列,默认为1,即升序排列


若输入参数为字符串,则可同时传入多个字符串作为排序键名,字符串之间以空格分隔。代码示例如下:

<ul>
    <li v-for="user in users | orderBy &#39;lastName&#39; &#39;firstName&#39; &#39;age&#39;">
        {{user.lastName}} {{user.firstName}} {{user.age}}
    </li>
</ul>

此时,将按照传入的排序键名的先后顺序进行排序。也可以将排序键名按照顺序放入一个数组中,然后传入一个数组参数给 orderBy 过滤器即可。代码示例如下:

<!--sortKey = [&#39;lastName&#39; &#39;firstName&#39; &#39;age&#39;];-->
<ul>
    <li v-for="user in users | orderBy sortKey">
        {{user.lastName}} {{user.firstName}} {{user.age}}
    </li>
</ul>

    升序排列:

<div id="app">
    <input type="text" v-model="a">
    <ul>
        <li v-for="val in arr | orderBy 1">
            {{val}}
        </li>
    </ul>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            a:&#39;&#39;,
            arr:[&#39;pear&#39;,&#39;cherry&#39;,&#39;lemon&#39;,&#39;orange&#39;]
        }
    })
</script>

Vue.js カスタム フィルター

降序排列:

<div id="app">
    <input type="text" v-model="a">
    <ul>
        <li v-for="val in arr | orderBy -1">
            {{val}}
        </li>
    </ul>
</div>

   Vue.js カスタム フィルター

3、json 过滤器

Vue.js 中的 json 过滤器本质上是 JSON.stringify() 的精简缩略版,可将表达式的值转换为 JSON 字符串,即输出表达式经过 JSON.stringify() 处理后的结果。

json 可接受一个类型为 Number 的参数,用于决定转换后的 JSON 字符串的缩进距离,如果不输入该参数,则默认为2。


不输入参数,默认为2的示例:

<div id="app">
    <p>{{information | json}}</p>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            information:{&#39;name&#39;:&#39;Roger&#39;, &#39;age&#39;:26}
        }
    })
</script>

Vue.js カスタム フィルター

为了看到效果,我们输入一个参数20:

<div id="app">
    <p>{{information | json 20}}</p> <!-- 以20个空格的缩进打印一个对象 -->
</div>

Vue.js カスタム フィルター

4、currency 过滤器

currency 过滤器的作用是将数字值转换为货币形式输出。

第一个参数接受类型为 String 的货币符号,如果不输入,则默认为美元符号$。

第二个参数接受类型为 Number的小数位,如果不输入,则默认为2.

注意:如果第一个参数采取默认形式,而需要第二个参数修改小数位,则第一个参数不可省略


不输入参数,默认形式

<div id="app">
    <h1>{{amount | currency}}</h1>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            amount: &#39;12345&#39;
        }
    })
</script>

Vue.js カスタム フィルター

使用其它货币符号:

<div id="app">
    <h1>{{amount | currency &#39;¥&#39;}}</h1>
</div>

Vue.js カスタム フィルター

将小数调整为3位:

<div id="app">
    <h1>{{amount | currency &#39;¥&#39; 3}}</h1>
</div>

Vue.js カスタム フィルター

5、debounce 过滤器

debounce 过滤器的作用是延迟处理一定的时间执行。其接受的表达式的值必须是函数,因此,一般与 v-on 等指令结合使用。


debounce 接受一个可选的参数作为延迟时间,单位为毫秒。如果没有该参数,则默认的延迟时间为300ms,经过 debounce 包装的处理器在调用之后将至少延迟设定的时间再执行。 如果在延迟结束前再次调用,则延迟时长将重置为设定的时间。


通常,在监听用户 input 事件时使用 debounce 过滤器比较有用,可以防止频繁调用方法。debounce 的用法参考如下:

<input @keyup="onKeyup | debounce 500">

自定义过滤器

1、filter语法

在Vue.js 中也存在一个全局函数 Vue.filter 用于构造过滤器:

Vue.filter(filterName, function(input){...})


该函数接受两个参数,第一个参数为自定义的过滤器名称,第二个参数则是具体的过滤器函数,过滤器函数以值为参数,返回转换后的值


2、单个参数

注册一个名为 reverse 的过滤器,作用是将字符串反转输出。代码示例如下:

<div id="app">
    <input v-model="message">
    <span v-text="message | reverse">{{message}}</span>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    Vue.filter(&#39;reverse&#39;,function(message){
        return message.split(&#39;&#39;).reverse().join(&#39;&#39;);
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;&#39;
        }
    })
</script>

Vue.js カスタム フィルター

注册一个名为 double 的过滤器,作用是将数字补全成两位数输出。代码示例如下

<div id="app">
    <input v-model="value">
    <p v-text="value | double">{{value}}</p>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    Vue.filter(&#39;double&#39;,function(value){
        return value<10? &#39;0&#39;+value : value
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            value:&#39;&#39;
        }
    })
</script>

Vue.js カスタム フィルター

注册一个名为 date 的过滤器,作用是将当前时间毫秒数以年月日时分秒的格式输出。代码示例如下:

<div id="app">
    <p v-text="message | date">{{message}}</p>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    Vue.filter(&#39;date&#39;,function(message){
        var now = new Date(message);
        return now.getFullYear()+&#39;-&#39;
                +(now.getMonth()+1)+&#39;-&#39;
                +now.getDate()+&#39; &#39;
                +(now.getHours()<12?&#39;0&#39;+now.getHours():now.getHours())+&#39;:&#39;
                +(now.getMinutes()<10?&#39;0&#39;+now.getMinutes():now.getMinutes())+&#39;:&#39;
                +now.getSeconds();
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:Date.now()
        }
    })
</script>

Vue.js カスタム フィルター

3、多个参数

过滤器函数除了以值作为参数外,也可以接受任意数量的参数,参数之间以空格分隔。代码示例如下:

<div id="app">
    <input v-model="message">
    <p v-text="message | wrap &#39;before&#39; &#39;end&#39;">{{message}}</p>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    Vue.filter(&#39;wrap&#39;,function(value, begin, end){
        return begin +&#39; &#39;+ value + &#39; &#39;+ end
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;&#39;
        }
    })
</script>

   Vue.js カスタム フィルター

4、双向过滤器

上面的过滤器都是在 Model 数据输出到 View 层之前进行数据转化的,实际上 Vue.js 还支持把来自视图(input元素)的值在写回模型前进行转化,即双向过滤器

   
Vue.filter(&#39;filterName&#39;,{
    //model ---> view
    //read 函数可选
    read:function(val){
        ...
    },
     
    //view ---> model
    //write 函数将在数据被写入Model 之前调用
    //两个参数分别为表达式的新值和旧值
    write:function(newVal, oldVal){
        ...
    }
})

   


代码示例如下:

<div id="app">
    <p>{{message}}</p>
    <input type="text" v-model="message | twoWayFilter">
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    Vue.filter(&#39;twoWayFilter&#39;,{
        read:function(val){
            return &#39;read&#39;+&#39; &#39;+val;
        },
        write:function(newVal, oldVal){
            return oldVal+&#39; &#39;+ &#39;write&#39;;
        }
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;hello world&#39;
        }
    })
</script>

    在初始情况下,message 表达式的值经过 twoWayFilter 中的 read 函数处理,输出到 view 层

Vue.js カスタム フィルター

当我们在 input 框中修改 message 的值时,twoWayFilter 中的 write 函数将在数据输出到 Model 层之前处理,这里将返回 message 的旧值 + 'write',然后输出到 Model层,因此 message的值变更为'hello world write' 并显示到页面上

Vue.js カスタム フィルター

常见问题解析

1、filterBy/orderBy 过滤后 $index 的索引

在使用 filterBy 或者 orderBy 对表达式进行过滤时,如果同时需要将 $index 作为参数,此时的 $index将会根据表达式数组或对象过滤后的值进行索引

<ul id="app">
    <li v-for="item in items | orderBy &#39;age&#39;">
        {{item.name}} - {{$index}}
    </li>
</ul>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            items:[
                {name:&#39;Roger&#39;, age:26},
                {name:&#39;Sarahling&#39;, age:27},
                {name:&#39;Daisy&#39;, age:1}
            ]
        }
    })
</script>

   


2、自定义filter 的书写位置

自定义 filter 可以写在全局 Vue下,例如:

Vue.filter(&#39;reverse&#39;,function(message){
        return message.split(&#39;&#39;).reverse().join(&#39;&#39;);
    });

   


也可以写在Vue 实例当中,例如:

var vm = new Vue({
    el:&#39;#example&#39;,
    data:{
         
    },
    filters:{
        //自定义 filter 事件的位置
        reverse:function(value){
            return value.split(&#39;&#39;).reverse().join(&#39;&#39;);
        }
    }
})

   


二者本质上并无区别,可任选一种使用。但是,采用Vue.filter 在全局定义时,需要在实例化 Vue 之前定义,否则自定义的 filter 不起作用


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。