Heim > Web-Frontend > js-Tutorial > Benutzerdefinierter Vue.js-Filter

Benutzerdefinierter Vue.js-Filter

高洛峰
Freigeben: 2016-11-23 17:21:28
Original
1408 Leute haben es durchsucht

Ein Filter ist im Wesentlichen eine Funktion. Seine Funktion besteht darin, dass der Benutzer Daten nach der Eingabe verarbeiten und ein Datenergebnis zurückgeben kann.


Vue.js ähnelt in gewisser Weise der Filtersyntax in AngularJS. Verwenden Sie zum Verbinden das Pipe-Zeichen (|). >

{{'abc' | uppercase}}    'abc' => 'ABC'
Nach dem Login kopieren
Der integrierte Großbuchstabenfilter von Vue.js wird hier verwendet, um alle Buchstaben im String in Großbuchstaben umzuwandeln.


Vue.js unterstützt das Hinzufügen von Filtern überall dort, wo Ausdrücke erscheinen. Zusätzlich zum Ausdruck in doppelten Klammern im obigen Beispiel können Sie auch Filter in Bindungsanweisungen hinzufügen, die nach einem Ausdruck aufgerufen werden , das Codebeispiel lautet wie folgt:

<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>
Nach dem Login kopieren
wird gerendert als: => HALLO WORLD!


In Vue 2.x, Filter Can darf nur in Schnurrbartbindungen verwendet werden. Um dasselbe Verhalten in Direktivenbindungen zu erreichen, sollten Sie berechnete Eigenschaften verwenden.


Filter können verkettet werden:

{{ message | filterA | filterB }}
Nach dem Login kopieren


Hier sehen Sie ein Beispiel:

<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>
Nach dem Login kopieren


Kleinbuchstabenfilter: Ändern Sie die Daten in Kleinbuchstaben

Großschreibungsfilter: Großschreibung des ersten Buchstabens

// 'ABCDE' -> 'Abcde'



Filter kann Parameter akzeptieren, die dem Filternamen folgen und durch Leerzeichen getrennt sind. Das Codebeispiel lautet wie folgt:

{{ message | filterA(&#39;arg1&#39;, arg2) }}
Nach dem Login kopieren


Die Filterfunktion übernimmt immer den Wert des Ausdrucks als Erster Parameter: In Anführungszeichen gesetzte Parameter werden als Zeichenfolgen und nicht in Anführungszeichen gesetzte Parameter als Datenattributnamen behandelt.


Die Nachricht hier wird als erster Parameter verwendet, die Zeichenfolge arg1 wird als zweiter Parameter verwendet und der Wert des Ausdrucks arg2 wird als dritter übergeben Parameter nach der Berechnung. Gleichzeitig unterstützen Vue.js-Filter Kettenaufrufe und die Ausgabe des vorherigen Filters kann als Eingabe des nächsten Filters verwendet werden


Eingebauter Filter

1. Buchstabenoperationen

Vue.js verfügt über drei integrierte Filter: Großschreibung, Großschreibung und Kleinschreibung für die Verarbeitung englischer Zeichen. Hinweis: Diese drei Filter werden nur für englische Zeichenfolgen verwendet.


1-1, Großschreibung

Der Groß-/Kleinschreibungsfilter wird verwendet, um den ersten Buchstaben im Ausdruck Convert umzuwandeln in Großbuchstaben

{{&#39;abc&#39; | capitalize}}  // &#39;abc&#39; => &#39;Abc&#39;
Nach dem Login kopieren


1-2, Großbuchstaben

Großbuchstabenfilter wird zum Konvertieren von „Alle“ verwendet Buchstaben im Ausdruck werden in Großbuchstaben umgewandelt

{{&#39;abc&#39; | uppercase}}  // &#39;abc&#39; => &#39;ABC&#39;
Nach dem Login kopieren


1-3, Kleinbuchstaben

Die Der Kleinbuchstabenfilter wird verwendet, um alle Buchstaben im Ausdruck in Kleinbuchstaben umzuwandeln

{{&#39;ABC&#39; | lowercase}}  // &#39;ABC&#39; => &#39;abc&#39;
Nach dem Login kopieren


2. Einschränkungen

Vue.js verfügt über drei integrierte Filter: limitBy, filterBy und orderBy, die zum Verarbeiten und Zurückgeben gefilterter Arrays verwendet werden, beispielsweise bei Verwendung mit v-for.

Hinweis: Der Wert des von diesen drei Filtern verarbeiteten Ausdrucks muss ein Array sein, andernfalls meldet das Programm einen Fehler


2-1, limitBy

Die Funktion des limitBy-Filters besteht darin, das Array vor dem Anfang auf N Elemente zu begrenzen, wobei N durch den ersten übergebenen Parameter angegeben wird, der die Grenze angibt. Der Standardwert ist 0, das heißt, alle Elemente sind vorhanden genommen. Der zweite Parameter ist optional und wird verwendet, um anzugeben, wo begonnen werden soll. Wenn der erste Parameter beispielsweise 4 und der zweite Parameter 5 ist, bedeutet dies, dass 4 Elemente genommen und mit dem Element mit dem Index 5 begonnen werden. Codebeispiele lauten wie folgt:

<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>
Nach dem Login kopieren

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

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

Es kann auch so verwendet werden:

<div id="app">
    <ul>
        <!--取6个,从下标为4的元素开始  注意:数组的长度是arr.length -->
        <li v-for="item in items | limitBy  items.length-4 4">{{item}}</li>
    </ul>
</div>
Nach dem Login kopieren

2-2, filterBy


Verwendung von filterBy filter Es ist flexibler. Der erste Parameter kann eine Zeichenfolge oder eine Funktion sein: 'string || function' + in + 'optionKeyName'


Wenn das erste Argument eine Zeichenfolge ist, wird jedes Array-Element danach durchsucht und ein Array von Elementen zurückgegeben, die diese Zeichenfolge enthalten. Das Codebeispiel lautet wie folgt:

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

Wenn das Array-Element ein Objekt ist, sucht der Filter rekursiv in allen seinen Elementen Eigenschaften. Um die Suche einzugrenzen, können Sie ein Suchfeld angeben. Das Codebeispiel lautet wie folgt:

<div id="app">
    <input v-model="uname">
    <ul>
        <li v-for="user in users | filterBy uname in &#39;uname&#39;">{{user.uname}}</li>
    </ul>
</div>
 
<script src="//cdn.bootcss.com/vue/1.0.26/vue.js"></script>
<script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            uname:&#39;&#39;,
            users:[
                {uname:&#39;Tom&#39;},
                {uname:&#39;Jerry&#39;},
                {uname:&#39;Kobe&#39;},
                {uname:&#39;James&#39;}
            ]
        }
    })
</script>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-FilterBenutzerdefinierter Vue.js-FilterWenn der erste Parameter von filterBy eine Funktion ist, basiert der Filter auf das Rückgabeergebnis der zu filternden Funktion. Zu diesem Zeitpunkt ruft der filterBy-Filter die integrierte Funktion filter() im Javascript-Array auf, um das Array zu verarbeiten. Jedes zu filternde Element im Array wird als Parameter eingegeben und die in filterBy übergebene Funktion wird ausgeführt.

Nur ​​Array-Elemente, deren Funktion „true“ zurückgibt, sind geeignet und werden in einem neuen Array gespeichert. Das endgültige Rückgabeergebnis ist dieses neue Array.


2-3. orderBy

Die Funktion des orderBy-Filters besteht darin, das sortierte Array zurückzugeben. Die Filterbedingung lautet: 'string ||. array function' + 'order>=0 ist aufsteigende Reihenfolge ||.

第一个参数可以是字符串、数组或者函数,第二个参数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>
Nach dem Login kopieren

此时,将按照传入的排序键名的先后顺序进行排序。也可以将排序键名按照顺序放入一个数组中,然后传入一个数组参数给 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>
Nach dem Login kopieren

升序排列:

<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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

降序排列:

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

Benutzerdefinierter Vue.js-Filter

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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

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

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

Benutzerdefinierter Vue.js-Filter

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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

使用其它货币符号:

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

Benutzerdefinierter Vue.js-Filter

将小数调整为3位:

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

Benutzerdefinierter Vue.js-Filter

5、debounce 过滤器

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


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


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

<input @keyup="onKeyup | debounce 500">
Nach dem Login kopieren

自定义过滤器

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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

注册一个名为 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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

注册一个名为 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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

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>
Nach dem Login kopieren

Benutzerdefinierter Vue.js-Filter

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){
        ...
    }
})
Nach dem Login kopieren


代码示例如下:

<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>
Nach dem Login kopieren

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

Benutzerdefinierter Vue.js-Filter

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

Benutzerdefinierter Vue.js-Filter

常见问题解析

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>
Nach dem Login kopieren


2、自定义filter 的书写位置

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

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


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

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

   


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


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage