Vue.js學習總結——1

  • 2019 年 10 月 10 日
  • 筆記

1、什麼是Vue.js

1、Vue.js 是目前最火的一個前端框架,React是最流行的一個前端框架 2、Vue.js 是前端的主流框架之一,和Angular.js、React.js 一起,並成為前端三大主流框架! 3、Vue.js 是一套構建用戶介面的框架,只關注視圖層,它不僅易於上手,還便於與第三方庫或既有項目整合。(Vue有配套的第三方類庫,可以整合起來做大型項目的開發) 4、前端的主要工作?主要負責MVC中的V這一層;主要工作就是和介面打交道,來製作前端頁面效果

2、框架和庫的區別:

框架:是一套完整的解決方案;對項目的侵入性較大,項目如果需要更換框架,則需要重新架構整個項目。 庫(插件):提供某一個小功能,對項目的侵入性較小,如果某個庫無法完成某些需求,可以很容易切換到其它庫實現需求。

3、MVC和MVVM圖解:

4、Vue.js初體驗:

<!DOCTYPE html>  <html lang="en">    <head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <!-- 1. 導入Vue的包 -->    <script src="./lib/vue-2.4.0.js"></script>  </head>    <body>    <!-- 將來 new 的Vue實例,會控制這個 元素中的所有內容 -->    <!-- Vue 實例所控制的這個元素區域,就是我們的 V  -->    <div id="app">      <p>{{ msg }}</p>    </div>      <script>      // 2. 創建一個Vue的實例      // 當我們導入包之後,在瀏覽器的記憶體中,就多了一個 Vue 構造函數      //  注意:我們 new 出來的這個 vm 對象,就是我們 MVVM中的 VM調度者      var vm = new Vue({        el: '#app',  // 表示,當前我們 new 的這個 Vue 實例,要控制頁面上的哪個區域        // 這裡的 data 就是 MVVM中的 M,專門用來保存 每個頁面的數據的        data: { // data 屬性中,存放的是 el 中要用到的數據          msg: '歡迎學習Vue' // 通過 Vue 提供的指令,很方便的就能把數據渲染到頁面上,程式設計師不再手動操作DOM元素了【前端的Vue之類的框架,不提倡我們去手動操作DOM元素了】        }      })    </script>  </body>    </html>

第一步:引入vue-2.4.0.js文件

第二步:創建vue實例

第三步:在頁面中利用插值表達式渲染數據

5、Vue.js詳細介紹:

(1)、插值:

#文本:

數據綁定最常見的形式就是使用「Mustache」語法 (雙大括弧) 的文本插值:

<p>{{msg}}</p> 此處將顯示msg的內容

<p v-text="msg"></p> 此處將顯示msg的內容

#原始的HTML:

雙大括弧會將數據解釋為普通文本,而非 HTML 程式碼。為了輸出真正的 HTML,你需要使用 v-html 指令:

<p v-html="msg2"></p> 此處將顯示經過渲染後的html程式碼

三種插值的對比:

1、{{}}:在顯示數據時會出現閃爍問題(閃爍就是在數據渲染出來之前會顯示一些其他字元);而v-text和v-html則不會出現閃爍問題 2、{{}}:不會替換標籤原本存在的數據,如果標籤原本存在數據,則將拼接後的結果進行顯示;而v-text和v-html則會覆蓋頁面原有的數據 3、{{}}和v-text不會解析msg中的標籤,會原樣輸出;而v-html則會將msg中的標籤解析輸出

程式碼:

<!DOCTYPE html>  <html lang="en">    <head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <style>      [v-cloak] {         display: none;      }    </style>  </head>    <body>    <div id="app">      <!-- 使用 v-cloak 能夠解決 插值表達式閃爍的問題 -->      <p v-cloak>++++++++ {{ msg }} ----------</p>      <h4 v-text="msg">==================</h4>      <!-- 默認 v-text 是沒有閃爍問題的 -->      <!-- v-text會覆蓋元素中原本的內容,但是 插值表達式  只會替換自己的這個佔位符,不會把 整個元素的內容清空 -->        <div>{{msg2}}</div>      <div v-text="msg2"></div>      <div v-html="msg2">1212112</div>        </div>        <script src="./lib/vue-2.4.0.js"></script>      <script>      var vm = new Vue({        el: '#app',        data: {          msg: '123',          msg2: '<h1>哈哈,我是一個大大的H1, 我大,我驕傲</h1>',          mytitle: '這是一個自己定義的title'        }      })        </script>  </body>    </html>

效果圖:

(2)、屬性和事件綁定:

v-bind:屬性綁定,可以簡寫為:

v-on:事件綁定,可以簡寫為@:

程式碼:

<!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <title>v-bind和v-on的學習</title>      <script src="../lib/vue-2.4.0.js"></script>  </head>  <body>      <div id="app">          <!--屬性綁定-->          <input type="button" v-bind:value="mytitle+'123S'">          <!-- 事件綁定 -->          <input type="button" value="點擊" v-on:click="show">      </div>      <script>          var vm=new Vue({              el:'#app',              data:{                  mytitle:'我是按鈕'              },              methods:{                  show:function(){                      alert("hello")                  }              }          })      </script>  </body>  </html>

效果圖:

(3)、事件修飾符:

.stop 阻止事件冒泡

.prevent 阻止默認行為

.capture 實現捕獲觸發事件的機制

.self 實現只有點擊當前元素時候,才會觸發事件處理函數

程式碼:

<!DOCTYPE html>  <html lang="en">    <head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <script src="./lib/vue-2.4.0.js"></script>    <style>      .inner {        height: 150px;        background-color: darkcyan;      }        .outer {        padding: 40px;        background-color: red;      }    </style>  </head>    <body>    <div id="app">        <!-- 使用  .stop  阻止冒泡 點擊戳他只會觸發btnHandler,不會觸發div1Handler-->      <div class="inner" @click="div1Handler">        <input type="button" value="戳他" @click.stop="btnHandler">      </div>      <br/>        <!-- 使用 .prevent 阻止默認行為 點擊超鏈接不會跳轉到相應頁面 -->      <a href="http://www.baidu.com" @click.prevent="linkClick">有問題,先去百度</a>      <br/>        <!-- 使用  .capture 實現捕獲觸發事件的機制 點擊戳他按鈕先觸發div1Handler事件,然後觸發btnHandler -->      <div class="inner" @click.capture="div1Handler">        <input type="button" value="戳他" @click="btnHandler">      </div>      <br/>        <!-- 使用 .self 實現只有點擊當前元素時候,才會觸發事件處理函數-->      <div class="inner" @click.self="div1Handler">        <input type="button" value="戳他" @click="btnHandler">      </div>      <br/>        <!-- 使用 .once 只觸發一次事件處理函數 -->      <a href="http://www.baidu.com" @click.prevent.once="linkClick">有問題,先去百度</a>      <br/>          <!-- 演示: .stop 和 .self 的區別 -->      <!-- stop真正阻止冒泡行為 -->      <div class="outer" @click="div2Handler">        <div class="inner" @click="div1Handler">          <input type="button" value="戳他" @click.stop="btnHandler">        </div>      </div>      <br/>        <!-- .self 只會阻止自己身上冒泡行為的觸發,並不會真正阻止 冒泡的行為 -->      <div class="outer" @click="div2Handler">        <div class="inner" @click.self="div1Handler">          <input type="button" value="戳他" @click="btnHandler">        </div>      </div>      <br/>      </div>      <script>      // 創建 Vue 實例,得到 ViewModel      var vm = new Vue({        el: '#app',        data: {},        methods: {          div1Handler() {            console.log('這是觸發了 inner div 的點擊事件')          },          btnHandler() {            console.log('這是觸發了 btn 按鈕 的點擊事件')          },          linkClick() {            console.log('觸發了連接的點擊事件')          },          div2Handler() {            console.log('這是觸發了 outer div 的點擊事件')          }        }      });    </script>  </body>    </html>

(4)v-model雙向綁定:

前面學習了v-bind可以用於綁定屬性,v-model的作用也是用於綁定數據,v-bind是單向數據綁定,從M到V,而v-model是雙向數據綁定既可以從M到V,也可以從V到M。

<!DOCTYPE html>  <html lang="en">    <head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <script src="./lib/vue-2.4.0.js"></script>  </head>    <body>    <div id="app">      <h4>{{ msg }}</h4>        <!-- v-bind 只能實現數據的單向綁定,從 M 自動綁定到 V, 無法實現數據的雙向綁定  -->      <!-- <input type="text" v-bind:value="msg" style="width:100%;"> -->        <!-- 使用  v-model 指令,可以實現 表單元素和 Model 中數據的雙向數據綁定 -->      <!-- 注意: v-model 只能運用在 表單元素中 -->      <!-- input(radio, text, address, email....)   select    checkbox   textarea   -->      <input type="text" style="width:100%;" v-model="msg">    </div>      <script>      // 創建 Vue 實例,得到 ViewModel      var vm = new Vue({        el: '#app',        data: {          msg: '大家都是好學生,愛敲程式碼,愛學習,愛思考,簡直是完美,沒瑕疵!'        },        methods: {        }      });    </script>  </body>    </html>

注意: v-model 只能運用在 表單元素中,因為只有表單元素才可以在頁面上進行修改

(5)、vue中的樣式:

Class樣式:

1、對象語法:

我們可以傳給 v-bind:class 一個對象,以動態地切換 class:

<div v-bind:class="{ active: isActive }"></div>

2、數組語法:

我們可以把一個數組傳給 v-bind:class,以應用一個 class 列表:

<div v-bind:class="[activeClass, errorClass]"></div>

內聯樣式:

1、對象語法:

<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>

2、數組語法:

我們可以把一個數組傳給 v-bind:class,以應用一個 class 列表:

<div v-bind:class="[activeClass, errorClass]"></div>

程式碼:

<!DOCTYPE html>  <html lang="en">    <head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <script src="./lib/vue-2.4.0.js"></script>    <style>      .red {        color: red;      }        .thin {        font-weight: 200;      }        .italic {        font-style: italic;      }        .active {        letter-spacing: 0.5em;      }    </style>  </head>    <body>    <div id="app">      <h1 class="red thin">這是一個很大很大的H1,大到你無法想像!!!</h1>        <!-- 第一種使用方式,直接傳遞一個數組,注意: 這裡的 class 需要使用  v-bind 做數據綁定 -->      <h1 :class="['thin', 'italic']">這是一個很大很大的H1,大到你無法想像!!!</h1>        <!-- 在數組中使用三元表達式 -->      <h1 :class="['thin', 'italic', flag?'active':'']">這是一個很大很大的H1,大到你無法想像!!!</h1>        <!-- 在數組中使用 對象來代替三元表達式,提高程式碼的可讀性 -->      <h1 :class="['thin', 'italic', {'active':flag} ]">這是一個很大很大的H1,大到你無法想像!!!</h1>        <!-- 在為 class 使用 v-bind 綁定 對象的時候,對象的屬性是類名,由於 對象的屬性可帶引號,也可不帶引號,所以 這裡我沒寫引號;  屬性的值 是一個標識符 -->      <h1 :class="classObj">這是一個很大很大的H1,大到你無法想像!!!</h1>        </div>      <script>      // 創建 Vue 實例,得到 ViewModel      var vm = new Vue({        el: '#app',        data: {          flag: true,          classObj: { red: true, thin: true, italic: false, active: false }        },        methods: {}      });    </script>  </body>    </html>

效果圖:

未完待續。。。