【總結】vue.js

一、MVVM

View,Model是Vue.js的核心。

實例化Vue的過程就是定義MVVM各個組成部分的過程。

1. 定義View

2. 定義Model

3. 創建一個Vue實例或"ViewModel",它用於連接ViewModel

舉例:

<!--這是View-->         

<div id="app">{{message}}</div>

//創建一個Vue實例,它連接 View 與Model        

 new Vue({             

el: '#app', (連接)          

//這是Model

data:{

message:'Hello World!'

}

})

在vue中要使用data中定義的參數,用this.message

(angularjs中用$scope.message)

與angulajs的區別:angularjs需要ng-app和ng-controller,vue直接用id即可;angularjs定義數據$scope.參數名,vue要在data:中定義,方法也要在methods或者computed中定義,若要在方法中使用參數,要用this.參數名

二、指令

1.數據綁定

1)v-text={{}}     (angular js 是 ng-bind和{{}})

(這兩個是一樣的,{{xxx}},這種情況是有弊端的,當網速很慢或者javascript出錯時,會暴露{{xxx}})

<span v-text="message"></span>=

<span>{{message}}</span>

2).v-html

(有html標籤,用v-text是輸出不出來的)

<div v-html="message"></div>

new Vue({ 

el: '#app', 

data: { 

message: '<h1>菜鳥教程</h1>' } }) 

得到<div>

<h1>菜鳥教程</h1>

</div>

在生產環境中動態渲染HTML是非常危險的,因爲容易導致XSS攻擊。所以只能在可信的內容上使用v-html,永遠不要在用戶提交和可操作的網頁上使用v-html。

2.判斷

1)v-show(angularjs中是ng-show)

根據表達式之真假值,切換元素的 display CSS 屬性。(DOM已經加載出來了)

2).v-if和v-else和v-else-if(angularis中是ng-if、ng-else)

v-else和v-if一起出現,且裏面不用放參數,和if相反

用來判斷是否加載html的DOM(DOM還沒有加載出來)

  • • v-if: 判斷是否加載,可以減輕服務器的壓力,在需要時加載。
  • • v-show:調整css dispaly屬性,可以使客戶端操作更加流暢。

v-if的安全級別更高,v-show只是隱藏了,通過頁面源代碼還是可以看到,安全級別低、

v-if更高的切換消耗(切換消耗指從未加載到加載或者從加載到未加載的狀況,需要添加或刪除這個元素),v-show需要更高的初始化渲染消耗

因此如果需要頻繁切換而對安性無要求,使用v-show;如果運行時,條件不能改變,使用v-if

3.循環v-for(angularjs是ng-repeat=“(key,value) in values”索引在前面)

(item,key)索引值放在後面!!

還可以(index, key,item)

<div v-for="(value, key, index) in object">

(自己試吧)

<li v-for="item in items">

        {{item}}

</li>

v-for的應用:排序

用到了Vue的computed:或methods:屬性。定義方法的屬性

定義

var app =new Vue({

      el:"#app",

      data:{

        items:[20,23,18,65,32,19,5,56,41]

      },

      computed:{

        sortItems:function(){

          //這個現成的sort方法只能給位數一樣的進行排序,所以調用了sortNumber這個方法,這個方法在後面定義,記住這個方法即可

          return this.items.sort(sortNumber);

        }

      },

      methods:{

        methodSort:function(){

          return this.items.sort(sortNumber);

        }

      }

    })

function sortNumber(a,b){

            return a-b

}

直接用sort方法只能排序同樣位數的,所以要用sortNumber

調用computed和methods的方法時,都可以不加()

計算屬性 :和普通屬性一樣是在模板中綁定計算屬性的,當data中對應數據發生改變時,計算屬性的值也會發生改變。

Methods:methods是方法,只要調用它,函數就會執行。

相同:兩者達到的效果是同樣的。

不同:計算屬性是基於它們的依賴進行緩存的,只有相關依賴會發生改變時纔會重新求職。只要相關依賴未改變,只會返回之前的結果,不再執行函數。

<div>{{sortItems}}</div>

<div>{{methodSort}}</div>

v-for循環數組,對象都可以

students:[

  {name:'jspang',age:32},

  {name:'Panda',age:30},

  {name:'PanPaN',age:21},

  {name:'King',age:45}

]

<ul>

   <li v-for="student in students">

       {{student.name}} - {{student.age}}

   </li>

</ul>

4.事件監聽v-on

v-on:事件=“方法”

v-on: 還有一種簡單的寫法,就是用@代替。 

<button @click="jianfen">減分</button>

<button v-on:click="jiafen">加分</button>

<button v-on:click="jianfen">減分</button>

var app=new Vue({

            el:'#app',

            data:{

                count:1

            },

            methods:{

                jiafen:function(){

                    this.count++;

                },

                jianfen:function(){

                    this.count--;

                }

            }

        })

鍵盤迴車事件v-on:keyup.enter,

回車:@keydown

常用:@keyup

          @mousedown

    @mouseover

    @submit

https://www.cnblogs.com/xcsn/p/3413074.html

阻止冒泡:event.stopPropagation();   或者直接  @click.stop="方法"(事件修飾符)

阻止默認事件:event.preventDefault()  或者直接@submit.prevent(事件修飾符)

5.數據雙向綁定v-model(和angularjs中的ng-model是一樣的)

必須用input框(或者其它textarea、 radio等), 使用時必須先在data中定義一下。

<input type="text" v-model="message">

6.屬性v-bind(一切css樣式都可以綁定)

可以省略寫:

<a :href="url"></a>

<img v-bind:src="imgSrc"  width="200px">

經常使用v-bind來綁定css樣式

1)、直接綁定class樣式

<div :class="className">1、綁定classA</div>

2)、綁定classA並進行判斷,在isOK爲true時顯示樣式,在isOk爲false時不顯示樣式。

<div :class="{classA:isOk}">2、綁定class中的判斷</div>

3)、綁定class中的數組

<div :class="[classA,classB]">3、綁定class中的數組</div>

4)、綁定class中使用三元表達式判斷

<div :class="isOk?classA:classB">4、綁定class中的三元表達式判斷</div>

5)、綁定style

<div :style="{color:red,fontSize:font}">5、綁定style</div>

6)、用對象綁定style樣式

<div :style="styleObject">6、用對象綁定style樣式</div>

var app=new Vue({

   el:'#app',

   data:{

       styleObject:{

           fontSize:'24px',

           color:'green'

            }

        }

})

7.其它指令

1)v-pre指令

在模板中跳過vue的編譯,直接輸出原始值。就是在標籤中加入v-pre就不會輸出vue中的data值了。

<div v-pre>{{message}}</div>

頁面會顯示{{message}}

2)v-cloak指令( 類似ng-clock解決未加載完的問題)(不會用)

在vue渲染完指定的整個DOM後才進行顯示。它必須和CSS樣式一起使用,

[v-cloak] {

  display: none;

}

<div v-cloak>

  {{ message }}

</div>

3)v-once指令

在第一次DOM時進行渲染,渲染完成後視爲靜態內容,跳出以後的渲染過程。

<p>可以改變:{{ msg }}</p>       

<p v-once>不可以改變:{{ msg1 }}</p>

(vue.js 較少用到自定義指令,因此就不放在這了)

三、組件(標籤)(定義時data必須是function,return數據)(可以extend定義後,再用component,直接定義比較簡單易懂)

Component組件

1、初始組件

組件就是製作自定義的標籤,這些標籤在HTML中是沒有的。

1)、全局化註冊組件(全局的也必須放在vue作用域的裏面才管用)

<div id="app">

        <jspang></jspang>

用<jspang></jspang>代替template中的內容

</div>

這種只能定義一個,一個組件名定義一個組件,所以是component

Vue.component('jspang組件名',{

  template:`<div style="color:red;">全局化註冊的jspang標籤</div>`

        })

        var app=new Vue({

            el:'#app',

            data:{

            }

        })

2)、局部註冊組件局部註冊組件和全局註冊組件是向對應的,局部註冊的組件只能在組件註冊的作用域裏進行使用,其他作用域使用無效。

 <div id="app">

      <panda></panda>

 </div>

        var app=new Vue({

el:'#app',

可以定義多個,所以要加s

            components:{

                "panda":{

             template:`<div style="color:red;">局部註冊的panda標籤</div>`

                }

           }

        })

3)、組件和指令的區別

組件註冊的是一個標籤,而指令註冊的是已有標籤裏的一個屬性。之後會在標籤中加屬性。Angularjs 就擅長用指令,在實際開發中還是用組件比較多,指令用的比較少。因爲指令看起來封裝的沒那麼好。

2、父子組件間的傳值

1)父傳子

parent:   <template id="p">

                      <sub  :id="id"></sub>

               </template>

               new Vue({

                              el:"#p",

                              data:{ id:10} ,

sub:                        compoments:{

                                          sub:template:"<h1>{{id}}</h1>",

                                                  props:["id"]

                              }

2)子傳父

parent:   <template id="p">

                      <sub  @send="getdata"></sub>

               </template>

               new Vue({

                              el:"#p",

                             methods:{

                                          getdata(input){

                                                                alert(input);

                                         }

                             },

sub:                        compoments:{

                                          sub:template:"<div><button @click="senddata"></button></div>",

                                                  methods:{

                                                            senddata(){

                                                                            this.$emit("send","hello");

                                                              }     

                                                  }

                              }

四、過濾器

內置過濾器全部取消

1、私有過濾器

<div id="app">

<td>{{col|capitalize}}</td>

</div>

new Vue({

        el: '#app',

        data: {

                 col:asdasd

        },

        filters: {

               capitalize: function (value) {

                         return value.charAt(0).toUpperCase() + value.slice(1);

               }

        },

});

2、全局過濾器

<div id="app">

  <!-- 首字符串大寫 -->

  <div>首字母大寫過濾器:{{str | upcase}}</div>

  <!-- 給過濾器傳入參數 -->

  <p>求和過濾器:{{message | sum(10,20)}}</p> 

</div>

    //全局方法 Vue.filter()註冊一個自定義過濾器,必須放在Vue實例化前面

    // 註冊一個首字母大寫的過濾器

    Vue.filter("upcase", function(value) { 

        if (!value) return ''

        value = value.toString()

        return value.charAt(0).toUpperCase() + value.slice(1)

    });

    // 全局註冊一個求和過濾器

    Vue.filter('sum', function (value, a, b) {

      return value + a + b;

    });

    var demo = new Vue({

      el: "#app",

      data: {

        str:'hello',

        message:12

      }

五、路由

<div id="app">

    <div class="content">

        <router-link to="/goods">商品</router-link>

        <router-link to="/ratings">評論</router-link>

        <router-link to="/seller">商家</router-link>

    </div>

    <router-view></router-view>

</div>

import goods from 'components/goods/goods';

import ratings from 'components/ratings/ratings';

import seller from 'components/seller/seller';

var router = new VueRouter

({

routes:[

  { path: '/goods', component: goods },

  { path: '/ratings', component: ratings },

  { path: '/seller', component: seller },

{ path: '/', redirect: seller }

];

})

var app = new Vue({

  el: '#app',

  router

});

 

路由傳參:

<router-link :to="'/news/newsinfo/'+item.id">  這塊有了參數

{path:"/news/newsinfo/:id",component:newsinfo},

接受參數:created(){

this.id=this.$route.params.id;

再根據這個id請求數據等操作

},

六、ajax請求數據

目前主流的 Vue 項目,都選擇 axios 來完成 ajax 請求,而大型項目都會使用 Vuex 來管理數據。使用 、cnpm install axios -S

安裝其他插件的時候,可以直接在 main.js 中引入並 Vue.use(),但是 axios 並不能 use,只能每個需要發送請求的組件中即時引入

首先在 main.js 中引入 axios

import axios from 'axios'

Vue.prototype.$ajax = axios

就可以在其它組件中使用

 this.$ajax({

  method: 'post',

  url: '/user',

  data: {

  name: 'wise',

  info: 'wrong'

  }

 })

}

this.$ajax({  

          method: 'get',  

          url,  

        }).then((res)=> {  

        console.log(res);

          this.list=res.body;

        });

用=>是因爲this不指代vue了,所以用this

還有一種辦法是:// let that = this (不能用var)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章