VUE基礎之vue入門

Vue之 - 基本的代碼結構插值表達式v-cloak
Vue指令之v-textv-html
Vue指令之v-bind的三種用法
  1. 直接使用指令v-bind
  2. 使用簡化指令:
  3. 在綁定的時候,拼接綁定內容::title="btnTitle + ', 這是追加的內容'"

Vue指令之v-on跑馬燈效果

  1. HTML結構:
<div id="app">
    <p>{{info}}</p>
    <input type="button" value="開啟" v-on:click="go">
    <!-- 在Vue中,使用事件綁定機制,為元素指定處理函數的時候,如果加了小括號,就可以給函數傳參了 -->
    <!--  <input type="button" value="添加" class="btn btn-primary" @click="add()">-->
    <input type="button" value="停止" v-on:click="stop">
  </div>
  1. Vue實例:
 // 創建 Vue 實例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        info: '一個字,干~!',
        intervalId: null
      },
      methods: {
        go() {
          // 如果當前有定時器在運行,則直接return
          if (this.intervalId != null) {
            return;
          }
          // 開始定時器
          this.intervalId = setInterval(() => {
            this.info = this.info.substring(1) + this.info.substring(0, 1);
          }, 500);
        },
        stop() {
          clearInterval(this.intervalId);
        }
      }
    });
Vue指令之v-on的縮寫事件修飾符
事件修飾符:
  • .stop 阻止冒泡
  • .prevent 阻止默認事件
  • .capture 添加事件偵聽器時使用事件捕獲模式
  • .self 只當事件在該元素本身(比如不是子元素)觸發時觸發回調
  • .once 事件只觸發一次
Vue指令之v-model雙向數據綁定
簡易計算器案例
  1. HTML 代碼結構
  <div id="app">
    <input type="text" v-model="n1">
    <select v-model="opt">
      <option value="0">+</option>
      <option value="1">-</option>
      <option value="2">*</option>
      <option value="3">÷</option>
    </select>
    <input type="text" v-model="n2">
    <!-- 注意: Vue中所有的指令,在調用的時候,都以 v- 開頭 -->
    <input type="button" value="=" v-on:click="getResult">
    <input type="text" v-model="result">
  </div>
  1. Vue實例代碼:
// 創建 Vue 實例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        n1: 0,
        n2: 0,
        result: 0,
        opt: '0'
      },
      methods: {
        getResult() {
          switch (this.opt) {
            case '0':
              this.result = parseInt(this.n1) + parseInt(this.n2);
              break;
            case '1':
              this.result = parseInt(this.n1) - parseInt(this.n2);
              break;
            case '2':
              this.result = parseInt(this.n1) * parseInt(this.n2);
              break;
            case '3':
              this.result = parseInt(this.n1) / parseInt(this.n2);
              break;
          }
        }
      }
    });

在Vue中使用樣式

使用class樣式

  1. 數組
<h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>
  1. 數組中使用三元表達式
<h1 :class="['red', 'thin', isactive?'active':'']">這是一個邪惡的H1</h1>
  1. 數組中嵌套對象
<h1 :class="['red', 'thin', {'active': isactive}]">這是一個邪惡的H1</h1>
  1. 直接使用對象
<h1 :class="{red:true, italic:true, active:true, thin:true}">這是一個邪惡的H1</h1>
使用內聯樣式
  1. 直接在元素上通過 :style 的形式,書寫樣式對象
<h1 :style="{color: 'red', 'font-size': '40px'}">這是一個善良的H1</h1>
  1. 將樣式對象,定義到 data 中,并直接引用到 :style
  • 在data上定義樣式:
data: {
        h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }
}
  • 在元素中,通過屬性綁定的形式,將樣式對象應用到元素中:
<h1 :style="h1StyleObj">這是一個善良的H1</h1>
  1. :style 中通過數組,引用多個 data 上的樣式對象
  • 在data上定義樣式:
data: {
        h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },
        h1StyleObj2: { fontStyle: 'italic' }
}
  • 在元素中,通過屬性綁定的形式,將樣式對象應用到元素中:
<h1 :style="[h1StyleObj, h1StyleObj2]">這是一個善良的H1</h1>
Vue指令之v-forkey屬性
  1. 迭代數組
<ul>
  <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年齡:{{item.age}}</li>
</ul>
  1. 迭代對象中的屬性
    <!-- 循環遍歷對象身上的屬性 -->
    <div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>
  1. 迭代數字
<p v-for="i in 10">這是第 {{i}} 個P標簽</p>

2.2.0+ 的版本里,當在組件中使用 v-for 時,key 現在是必須的。
當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用 “就地復用” 策略。如果數據項的順序被改變,Vue將不是移動 DOM 元素來匹配數據項的順序, 而是簡單復用此處每個元素,并且確保它在特定索引下顯示已被渲染過的每個元素。
為了給 Vue 一個提示,以便它能跟蹤每個節點的身份,從而重用和重新排序現有元素,你需要為每項提供一個唯一 key 屬性。

Vue指令之v-ifv-show

一般來說,v-if 有更高的切換消耗而 v-show 有更高的初始渲染消耗。因此,如果需要頻繁切換 v-show 較好,如果在運行時條件不大可能改變 v-if 較好。

  1. 1.x 版本中的filterBy指令,在2.x中已經被廢除:
    filterBy - 指令

  2. 在2.x版本中手動實現篩選的方式

Vue調試工具vue-devtools的安裝步驟和使用

Vue.js devtools - 翻墻安裝方式 - 推薦

過濾器

概念:Vue.js 允許你自定義過濾器,可被用作一些常見的文本格式化。過濾器可以用在兩個地方:mustache 插值和 v-bind 表達式。過濾器應該被添加在 JavaScript 表達式的尾部,由“管道”符指示;

私有過濾器

  1. HTML元素:
<td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>
  1. 私有 filters 定義方式:
filters: { // 私有局部過濾器,只能在 當前 VM 對象所控制的 View 區域進行使用
    dataFormat(input, pattern = "") { // 在參數列表中 通過 pattern="" 來指定形參默認值,防止報錯
// 過濾器的定義語法
    // Vue.filter('過濾器的名稱', function(){})
    // 過濾器中的 function ,第一個參數,已經被規定死了,永遠都是 過濾器 管道符前面 傳遞過來的數據
    /* Vue.filter('過濾器的名稱', function (data) {
      return data + '123'
    }) */
      var dt = new Date(input);
      // 獲取年月日
      var y = dt.getFullYear();
      var m = (dt.getMonth() + 1).toString().padStart(2, '0');
      var d = dt.getDate().toString().padStart(2, '0');
      // 如果 傳遞進來的字符串類型,轉為小寫之后,等于 yyyy-mm-dd,那么就返回 年-月-日
      // 否則,就返回  年-月-日 時:分:秒
      if (pattern.toLowerCase() === 'yyyy-mm-dd') {
        return `${y}-${m}-$p6btvjt`;
      } else {
        // 獲取時分秒
        var hh = dt.getHours().toString().padStart(2, '0');
        var mm = dt.getMinutes().toString().padStart(2, '0');
        var ss = dt.getSeconds().toString().padStart(2, '0');
        return `${y}-${m}-$x6wxerf ${hh}:${mm}:${ss}`;
      }
    }
  }

使用ES6中的字符串新方法 String.prototype.padStart(maxLength, fillString='') 或 String.prototype.padEnd(maxLength, fillString='')來填充字符串;

全局過濾器
// 定義一個全局過濾器
// 所謂的全局過濾器,就是所有的VM實例都共享的
Vue.filter('dataFormat', function (input, pattern = '') {
  var dt = new Date(input);
  // 獲取年月日
  var y = dt.getFullYear();
  var m = (dt.getMonth() + 1).toString().padStart(2, '0');
  var d = dt.getDate().toString().padStart(2, '0');
  // 如果 傳遞進來的字符串類型,轉為小寫之后,等于 yyyy-mm-dd,那么就返回 年-月-日
  // 否則,就返回  年-月-日 時:分:秒
  if (pattern.toLowerCase() === 'yyyy-mm-dd') {
    return `${y}-${m}-$d0zqyzr`;
  } else {
    // 獲取時分秒
    var hh = dt.getHours().toString().padStart(2, '0');
    var mm = dt.getMinutes().toString().padStart(2, '0');
    var ss = dt.getSeconds().toString().padStart(2, '0');
    return `${y}-${m}-$efopi0p ${hh}:${mm}:${ss}`;
  }
});

注意:當有局部和全局兩個名稱相同的過濾器時候,會以就近原則進行調用,即:局部過濾器優先于全局過濾器被調用!

鍵盤修飾符以及自定義鍵盤修飾符
1.x中自定義鍵盤修飾符【了解即可】
Vue.directive('on').keyCodes.f2 = 113;
2.x中自定義鍵盤修飾符
  1. 通過Vue.config.keyCodes.名稱 = 按鍵值來自定義案件修飾符的別名:
Vue.config.keyCodes.f2 = 113;
  1. 使用自定義的按鍵修飾符:
<input type="text" v-model="name" @keyup.f2="add">
自定義指令
  1. 自定義全局和局部的 自定義指令:
     // 使用  Vue.directive() 定義全局的指令  v-focus
    // 其中:參數1 : 指令的名稱,注意,在定義的時候,指令的名稱前面,不需要加 v- 前綴, 
    // 但是: 在調用的時候,必須 在指令名稱前 加上 v- 前綴來進行調用
    //  參數2: 是一個對象,這個對象身上,有一些指令相關的函數,這些函數可以在特定的階段,執行相關的操作
    Vue.directive('focus', {
      bind: function (el) { // 每當指令綁定到元素上的時候,會立即執行這個 bind 函數,只執行一次
        // 注意: 在每個 函數中,第一個參數,永遠是 el ,表示 被綁定了指令的那個元素,這個 el 參數,是一個原生的JS對象
        // 在元素 剛綁定了指令的時候,還沒有 插入到 DOM中去,這時候,調用 focus 方法沒有作用
        //  因為,一個元素,只有插入DOM之后,才能獲取焦點
        // el.focus()
      },
      inserted: function (el) {  // inserted 表示元素 插入到DOM中的時候,會執行 inserted 函數【觸發1次】
        el.focus()
        // 和JS行為有關的操作,最好在 inserted 中去執行,放置 JS行為不生效
      },
      updated: function (el) {  // 當VNode更新的時候,會執行 updated, 可能會觸發多次

      }
    })
    // 自定義一個 設置字體顏色的 指令
    Vue.directive('color', {
      // 樣式,只要通過指令綁定給了元素,不管這個元素有沒有被插入到頁面中去,這個元素肯定有了一個內聯的樣式
      // 將來元素肯定會顯示到頁面中,這時候,瀏覽器的渲染引擎必然會解析樣式,應用給這個元素
      bind: function (el, binding) {
        // el.style.color = 'red'
        // console.log(binding.name)
        // 和樣式相關的操作,一般都可以在 bind 執行

        // console.log(binding.value)
        // console.log(binding.expression)

        el.style.color = binding.value
      }
    })
    // 自定義局部指令 v-color 和 v-font-weight,為綁定的元素設置指定的字體顏色 和 字體粗細:
      directives: {
        color: { // 為元素設置指定的字體顏色
          bind(el, binding) {
            el.style.color = binding.value;
          }
        },
        'font-weight': function (el, binding2) { // 自定義指令的簡寫形式,等同于定義了 bind 和 update 兩個鉤子函數
          el.style.fontWeight = binding2.value;
        }
      }

  1. 自定義指令的使用方式:
<input type="text" v-model="searchName" v-focus v-color="'red'" v-font-weight="900">

Vue 1.x 中 自定義元素指令【已廢棄,了解即可】

Vue.elementDirective('red-color', {
  bind: function () {
    this.el.style.color = 'red';
  }
});

使用方式:

<red-color>1232</red-color>

相關文章

  1. vue.js 1.x 文檔
  2. vue.js 2.x 文檔
  3. String.prototype.padStart(maxLength, fillString)
  4. js 里面的鍵盤事件對應的鍵碼
  5. Vue.js雙向綁定的實現原理
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容