Vue中計算屬性、偵聽、過濾、自定義指令、ref的操作


1.計算屬性

<div id="app">
    <input type="text" v-model="x">
    <input type="text" v-model="y">
    {{get}}
</div>
<script>
         var app=new Vue({
                el:"#app",
                data:{
                       x:"",
                       y:""                
                },
                computed:{
                      get:function(){
                       return this.x+this.y;
                  }
                 }
               });
</script>

     我們可以將同一函數定義為一個方法而不是一個計算屬性。兩種方式的最終結果確實是完全相同的。然而,不同的是計算屬性是基於它們的依賴進行緩存的。只在相關依賴發生改變時它們才會重新求值;多次調用,計算屬性會立即返回之前的計算結果,而不必再次執行函數。

2.使用偵聽器

<body>
        <div id="app">
            <input type="text" v-model="msg">
            {{msg}}
        </div>
    </body>
    <script>
     var app=new Vue({
         el:"#app",
         data:{
             msg:"",
         },
         watch: {
           msg:function(newval,oldval){
                if(newval=="admin"){
                    this.msg=oldval;
                }else{
                    this.msg=newval;
                }
           }  
         },
     });
</script>

    我們發現,與計算屬性相比,偵聽器並沒有優勢;也不見得好用,直觀上反而比計算屬性的使用更繁瑣;雖然計算屬性在大多數情況下更合適,但有時也需要一個自定義的偵聽器。這就是為什么 Vue 通過 watch 選項提供了一個更通用的方法,來響應數據的變化。當需要在數據變化時執行異步或開銷較大的操作時,這個方式是最有用的。

3.過濾器的使用

局部過濾器:

<body>
    <div id="app">
        <input type="text" v-model="msg">
        {{msg|myf|nu}}
    </div> 
</body>
<script>
     var app=new Vue({
         el:"#app",
        data: {
           msg:"",
        },
         filters:{
             myf:function(val){
                return val.toUpperCase();
            },
             nu:function(val){
                  var reg=/\d/g;
                 return val.replace(reg,'*');
            }
         }
     });
</script>

全局過濾器:

<body>
    <div id="app2">
        <input type="text" v-model="msg">
        {{msg|myf|nu}}
    </div>
</body>
<script>
    Vue.filter('myf',function(val){
           return  val.toUpperCase();
    });
    Vue.filter('nu',function(val){
           var reg=/\d/g;
           return val.replace(reg,'*');
    });
    var app2=new Vue({
         el:"#app2",
         data:{
             msg:"",
         }
    });
</script>

過濾器要被添加到操作值得后面,使用 管道符 | 分割;vue會自動將操作值,以實參的形式傳入過濾器的方法中;

4.自定義指令

前面我們學過 v-on 、v-model、v-show 等指令,在操作 dom 時使用了 ref 屬性,其實之前學過的指令也是操作dom 的一種方式,但有時,這些指令並不能滿足我們的需求,因此 vue 允許我們自定義指令來操作 dom

<body>
    <div id="app">
        <p v-color>123131321</p>
    </div>
</body>
<script>
    //全局指令
    //    Vue.directive("color",{
    //        inserted:function(el){
    //             el.style.background="red";
    //        }
    //    });
       var app=new Vue({
           el:"#app",
           directives:{
               color:{
                   inserted:function(el){
                      el.style.background="green";
                   }
               }
           }
       });
</script>

5.ref的使用

在學習 jq 時,我們首要任務就是學習選擇的使用,因為選擇可以極其方便幫助我們獲取節點查找dom,因為我們要通過dom展示處理數據。而在Vue中,我們的編程理念發生了變化,變為了數據驅動dom;但有時我們因為某些情況不得不脫離數據操作dom,因此vue為我們提供了 ref 屬性獲取dom節點;

<body>
    <div id="app">
        <input type="button" value="按鈕" @click="get">
        <p ref="ps">211113131</p>
    </div>
</body>
   <script>
        var app=new Vue({
            el:"#app",
            methods: {
                //用來獲取具有ref屬性的節點對象
                get:function(){
                    alert(this.$refs.ps.innerHTML);
                }
            },
        });
   </script>

但是在項目開發中,盡可能不要使用ref,因為從一定程度上,ref 違背的mvvm設計原則;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM