vue基礎(chǔ)開始

此筆記是我在拉勾學習課程過程中的總結(jié)疆虚,文字原創(chuàng)竹揍,筆記里很多技巧和知識是老師總結(jié)的太惠,如果有侵權(quán)蓝丙,請聯(lián)系本人级遭!

vue框架基礎(chǔ)

vue.js簡介

傳統(tǒng)網(wǎng)頁開發(fā)

請求數(shù)據(jù)->生成結(jié)構(gòu)->監(jiān)聽變化

元素變化->發(fā)送請求->更新結(jié)構(gòu)

DOM操作與邏輯代碼混合,可維護性差渺尘,模塊之間依賴關(guān)系復雜挫鸽,

vue.js

漸進式 JavaScript框架

vue.js核心特性

數(shù)據(jù)驅(qū)動視圖

  • 數(shù)據(jù)變化自動更新到對應元素,無需操作dom鸥跟,稱為單向數(shù)據(jù)綁定

  • 對于輸入框等可輸入元素丢郊,可設(shè)置雙向數(shù)據(jù)綁定

    ·雙向數(shù)據(jù)綁定在數(shù)據(jù)綁定的基礎(chǔ)上,可以自動元素輸入內(nèi)容更新給數(shù)據(jù),實現(xiàn)數(shù)據(jù)與元素內(nèi)容的雙向綁定

實現(xiàn)原理

  • vue.js的數(shù)據(jù)驅(qū)動視圖基于MVVM模型實現(xiàn)

  • MVVM(Model – View – ViewModel )是一種軟件開發(fā)思想

    • model層蚂夕,代表數(shù)據(jù)

    • view層代表視圖模板

    • viewmodel層迅诬,代表業(yè)務邏輯處理代碼

優(yōu)缺點

  • 基于MVVM模型實現(xiàn)了數(shù)據(jù)驅(qū)動解放DOM操作

  • view與model處理分離,降低代碼耦合

  • 雙向綁定bug調(diào)試難度大

  • 大型項目的view和model過多婿牍,維護成本高

組件化開發(fā)

  • 允許封裝為自定義的HTML標簽,復用時書寫自定義標簽名即可

  • 組件可以封裝結(jié)構(gòu)惩歉,邏輯代碼等脂、樣式,提高了開發(fā)效率和可維護性撑蚌。

vue下載

本地引入

? 開發(fā)版本:https://cn.vuejs.org/js/vue.js
? 生產(chǎn)版本:https://cn.vuejs.org/js/vue.min.js

cdn 引入

? 最新穩(wěn)定版: https://cdn.jsdelivr.net/npm/vue
? 指定版本:
https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js

npm 安裝

? 最新穩(wěn)定版:
? npm install vue
? 指定版本
? npm install vue@2.6.12

基礎(chǔ)語法

vue實例

通過vue函數(shù)創(chuàng)建的對象上遥,是vue功能的基礎(chǔ)

var vm = new Vue({
    //選項內(nèi)容
    })

el選項

  • 用于選取一個DOM 元素作為vue實例掛載目標

  • 只有掛載在元素內(nèi)部才能被vue處理,外部為普通的html元素

  • 代表mvvm中的view層

設(shè)置方式

  • 可以為css選擇器格式的字符串或者HTMLElement實例争涌,但是不能為html或者body
    并且不可為選中的類數(shù)組粉楚,只能是類數(shù)組中的某個元素
var vm = new Vue({
    el:'#app'
    })

var app = document.querySelector('#app');
var vm = new Vue({
    el:app
    })

掛載完畢后可以用vm.$el進行訪問

var vm = new Vue({
    el:'#app'
    })
console.log(vm.$el)
  • 未設(shè)置el的vue實例,可以通過vm.$mount()進行掛載亮垫,參數(shù)形式與el規(guī)則相同
  <!-- 掛載元素 -->
  <div id="app"></div>

  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app'
    })
    console.log(vm.$el);

    var app = document.querySelector("#app");
    var vm = new Vue({
      el:app
    })
    console.log(vm.$el);
    
    var app = document.getElementById('app');
    var vm = new Vue();
    // vm.$mount('#app');
    vm.$mount(app);
    console.log(vm.$el);
  </script>

插值表達式

  • 掛載元素可以使用Vue.js模板語法模软,模板中可以通過插值表達式進行動態(tài)內(nèi)容設(shè)置,寫法是{{}}

注意:
· 插值表達式只能書寫在標簽內(nèi)容區(qū)域饮潦,可以與其他內(nèi)容混合
· 內(nèi)部只能書寫JavaScript表達式燃异,不能寫語句

  <div id="app">
    <ul>
      <li>第一段示例內(nèi)容:{{10 + 10 + 29}}</li>
      <li>第二段示例內(nèi)容:{{ 22 > 3 ? '22比2大':'22比3小'}}</li>
      <!-- <li id="{{ 1+2}}"></li> -->
      <!-- <li>{{ var num = 10; }}</li> -->
    </ul>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el:'#app'
    })
  </script>

data選項

  • 用于存儲vue實例需要使用的數(shù)據(jù),值為對象類型继蜡。

    data本質(zhì)就是存儲數(shù)據(jù)
    data中可以存儲對象回俐,可以存儲一個或多個數(shù)據(jù)以供視圖操作

操作數(shù)據(jù):

  • data中的數(shù)據(jù)可以通過 vm.$data數(shù)據(jù) 或者 vm.數(shù)據(jù) 訪問

  • data中的數(shù)據(jù)可以直接在視圖中通過插值表達式訪問

  • data中的數(shù)據(jù)是響應式數(shù)據(jù),發(fā)生改變時稀并,視圖自動更新

  • data中存在數(shù)據(jù)時仅颇,索引操作與length操作無法自動更新視圖,可以借助Vue.set()方法替代操作碘举。

  <div id="app">
    <!-- <p>{{ title }}</p> -->
    <ul>
      <li>{{ arr[0] }}</li>
      <li>{{ arr[1] }}</li>
      <li>{{ arr[2] }}</li>
    </ul>
  </div>

  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
        // title:'標題文本'忘瓦,
        arr : ['內(nèi)容1','內(nèi)容2','內(nèi)容3']
      }
    })
    // vm.arr.pop()數(shù)組的操作依舊可以實現(xiàn),但是length和索引功能無法使用
    Vue.set(vm.arr,1,'這是新的內(nèi)容')
    // vm.title = '這是新文本'
    // 訪問data數(shù)據(jù)
    console.log(vm.$data.title);
    console.log(vm.title);
  </script>

method 選項

  • 用于存儲在vue實例中使用的函數(shù)

  • methods中的方法可以通過 vm.方法名 訪問

  • 方法中的this為vm實例殴俱,可以便捷的訪問 vm 數(shù)據(jù)等功能

  <div id="app">    
    <p>{{ title1.split('-').join('') }}</p>
    <p>{{ title2.split('-').join('') }}</p>
    <p>{{ fn(title1) }}</p>
    <p>{{ fn(title2) }}</p>
  </div>

  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
        prefix:'處理結(jié)果為:',
        title1:'a-b-c-d-e',
        title2:'x-y-z'
      },
      methods:{
        fn(value){
          this.fn1();
          this.fn2();
          return this.prefix + value.split('-').join('');
        },
         fn1 () {
           console.log('執(zhí)行了fn1');
         },
         fn2 () {
           console.log('執(zhí)行了fn2');
         }
      }
    })
    console.log(vm);
  </script>

vue.js指令

本質(zhì)是HTML自定義屬性政冻,是給框架識別的標記

以 v- 開頭的自定義屬性都是 vue 指令

內(nèi)容處理功能

v-once指令

  • 使元素內(nèi)部的插值表達式只生效一次
<body>
  <div id="app">
   <p>此內(nèi)容會隨著數(shù)據(jù)變化而自動變化:{{content}}</p>
   <p v-once>此內(nèi)容不會隨著數(shù)據(jù)變化而自動變化:{{content}}</p>
  </div>

  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
        content:'元素內(nèi)容'
      }
    })
  </script>

v-text指令

  • 元素內(nèi)容整體替換為指定純文本數(shù)據(jù)
  <div id="app">
    <p v-text="content">這是 p 標簽的原始內(nèi)容</p>
    <p v-text="100">這是 p 標簽的原始內(nèi)容</p><!-- 一般不直接指定數(shù)值 -->
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
        content:'文本內(nèi)容',
        content2:'<span>這是span內(nèi)容</span>'
      }
    })
  </script>

v-html指令

作用:

  • 元素內(nèi)容整體替換為指定的 html 文本
  <div id="app">
      <p v-html="content">這是原始內(nèi)容</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
       var vm = new Vue({
         el:'#app',
         data: {
          //  content:'這是新內(nèi)容',
           content:'<span>這是span內(nèi)容</span>'
         }
       })
  </script>

屬性綁定

v-bind指令

  • 動態(tài)綁定HTML屬性

  • 與插值表達式類似,v-bind中也允許使用表達式

  • 如果一次綁定多個屬性线欲,還可以綁定對象

  <div id="app">
    <p v-bind:title="myTitle">這是p標簽內(nèi)容</p>
    <p :title='myTitle'>這是p標簽的內(nèi)功</p>

    <p :class="'num'+ 1 + 2 + 3">111</p> 
    <p :class="prefix + num">222</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
        myTitle:'這是屬性',
        prefix:'demo',
        num:10
      }
    })
  </script>
  <div id="app">
    <p v-bind="attrObj">這是 p 標簽的內(nèi)容</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vn = new Vue({
      el:'#app',
      data:{
        attrObj:{
          id : 'box',
          title:"市里內(nèi)容",
          class : "clearFix",
          'datatitle': "這是data-title的內(nèi)容"
        }
      }
    })
  </script>

Class綁定

  • class可以通過v-bind綁定明场,也可以與class屬性共存

  • 對于class綁定,vue.js中還提供了特殊處理方式

  <div id="app">
    <p v-bind:class="cls1">標簽內(nèi)容</p>
    <p class="a" :class="cls2">標簽內(nèi)容</p>

    <!-- 下面是錯誤寫法 -->
    <!-- <p class="a b c" :class="cls1 cls2 cls3"></p> -->

    <!-- <p :class='cls'></p> -->

    <!-- <p :class="bool ? cls1 : cls2"></p> -->

    <p :class='{x: isX, y: false, z: true}'></p>
    <p :calss='["a", classB,{c: isC}]'></p>
  </div>

  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        classB: 'B',
        isC: true
        // bool:'ture',
        // cls:'q e w',
        // cls1: 'x',
        // cls2: 'y',
        // cls3: 'z'
      }
    })
  </script>

Style綁定

  • style 是 HTML屬性李丰,可以通過v-bind進行綁定苦锨,并且可以與style屬性共存。

  • 當我們希望給元素綁定多個樣式對象時,可以設(shè)置為數(shù)組

<div id="app">
  <p :style="[baseStyle, styleObj1]">第一個 p 標簽</p>
  <p :style="[baseStyle, styleObj2]">第二個 p 標簽</p>
</div>
<script src="lib/vue.js"></script>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      // 公共樣式
      baseStyle: {
        width: '100px',
        height: '100px'
      },
      styleObj1: {
        backgroundColor: 'red'
      },
      styleObj2: {
        backgroundColor: 'blue'
      }
    }
  });
</script>

渲染指令

v-for 指令

  • 用于遍歷數(shù)據(jù)渲染結(jié)構(gòu)舟舒,常用數(shù)組與對象均可遍歷

  • 使用v-for 的同時拉庶,應該始終指定唯一的 key 屬性,可以提高渲染性能秃励,避免出現(xiàn)綁定的錯誤

  <div id="app">
    <ul>
      <li v-for="(item , index) in itemList" :key="item.id">
        輸入框{{ item.value }}: <input type="text">
      </li>
    </ul>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        itemList: [
          {
            id:1,
            value: 2
          },
          {
            id: 2,
            value:3
          },
          {
            id: 3,
            value: 3
          }
        ]
      }
    })
  </script>
  • 通過<template>標簽設(shè)置模板占位符氏仗,可以將部分元素或內(nèi)容作為整體進行操作
  <div id="app">
    <!-- template無法設(shè)置key綁定,因其只是占位夺鲜,并不存在 -->
    <template v-for="utem in obj">
      {{utem}}
      <br>
    </template>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        obj: {
          content1: '內(nèi)容1',
          content2: '內(nèi)容2',
          content3: '內(nèi)容3'
        }
      }
    })
  </script>

v-show 指令

  • 控制元素顯示與因此皆尔,用于顯示隱藏的頻繁切換,布爾類型:true控制顯示币励,false控制隱藏
    注意:
    <template></template>無法使用 v-show 指令
  <div id="app">
    <p v-show="false">標簽內(nèi)容</p>
    <p v-show="22 > 11">標簽內(nèi)容</p>

    <p v-show="bool">標簽內(nèi)容</p>

    <template v-show='false'>這是內(nèi)容</template>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: "#app",
      data: {
        bool: true
      }
    });
  </script>

v-if 指令

  • 用于根據(jù)條件控制元素的創(chuàng)建與移除
  <div id="app">
    <!-- 不適合用于元素的隱藏與顯示慷蠕,只適合元素的移除和創(chuàng)建,因為頻繁操作DOM較消耗內(nèi)存 -->
    <p v-if='bool'>這是標簽內(nèi)容</p>
    <p v-else-if="false">這是第二個p標簽</p>
    <p v-else-if="false">這是第三個p標簽</p>
    <p v-else>這是最后一個p標簽</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        bool: false
      }
    });
  </script>
  • 給使用 v-if 的同類型元素綁定各不同的 key
 <div id="app">
   <div v-if = "type==='username'" :key="'username'">
     用戶名:<input type="text">
   </div>
   <div v-else :key='email'>
     郵箱:<input type="text">
   </div>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        bool: true,
        type: 'username'
      }
    });
  </script>
  • 出于性能考慮 食呻,避免v-if和 v-for用于同一標簽流炕,v-for的優(yōu)先級高于if,如果放在同一標簽,for會先執(zhí)行仅胞,如果執(zhí)行后發(fā)現(xiàn)if是false每辟,就會浪費性能
  <div id="app">
    <ul v-if="false">
      <li v-for="item in items">{{item}}</li>
    </ul>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
       items: {
         content1: '內(nèi)容1',
         content2: '內(nèi)容2',
         content3: '內(nèi)容3'
       }
      }
    });
  </script>

事件與表單處理

事件處理v-on指令

  • 用于元素事件綁定

  • 簡化書寫方式@click,或者@加其他的觸發(fā)形式

  • 事件代碼復雜饼问,可以在methods中設(shè)置函數(shù)影兽,并設(shè)置為事件處理程序

  • 設(shè)置事件后,可以接受事件對象

  • 視圖中可以通過 $event 訪問事件對象

  <div id="app">
    <p >{{ content }}</p>
    <button v-on:click="content='0這是新內(nèi)容'">按鈕1</button>
    <button @click="content='這是這是新內(nèi)容'">按鈕2</button>
    <button @click="fn">按鈕3</button>

    <!-- 傳入fn2函數(shù)和實參莱革,$event是vue規(guī)定的事件對象峻堰,不可更改 -->
    <button @click='fn(200, $event)'>按鈕4</button>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        content:'這是默認內(nèi)容'
      },
      method: {
        //fn函數(shù)
        fn () {
          this.content = '這是按鈕3設(shè)置的內(nèi)容';
        },
        fn2(value, event) {
          console.log(value, event);
        }
      }
    })
  </script>

表單輸入綁定 v-model

  • 用于給<input>、<textarea>以及<select> 元素設(shè)置雙向數(shù)據(jù)綁定

輸入框綁定

  • 單行綁定input和多行輸入框textarea
  <div id="app">
    <p>input 輸入框內(nèi)容:{{ value1 }}</p>
    <input type="text" v-model="value1">

    <p>input 輸入框內(nèi)容:{{ value2 }}</p>
    <input type="text" v-model="value2">
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value1: '',
        value2: ''
      }
    });
  </script>

單選按鈕綁定

單選按鈕雙向數(shù)據(jù)綁定

  • input 標簽中type為radio的元素盅视,把多個同一組的單選按鈕綁定為同一值
  <div id="app">
    <!-- p中展示的值就是單選框中value的值 -->
    <p>radio的值為{{ value3 }}</p>
    <input type="radio" id="one" value="1" v-model="value3">
    <label for="one">按鈕1</label>

    <input type="radio" id="two" value="2" v-model="value3">
    <label for="tow">按鈕2</label>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value3: ''
      }
    });
  </script>

復選框綁定

  <div id="app">
    <!-- 單個復選框進行雙向數(shù)據(jù)綁定的演示 -->
    <!-- 單個復選框選中時捐名,綁定展示的數(shù)據(jù)是true和false -->
    <p>單個復選框的值:{{ value4 }}</p>
    <input type="checkbox" id="one" v-model="value4">
    <label for="one">選項1</label>

    <!-- 多個復選框進行雙向數(shù)據(jù)綁定的演示 -->
    <!-- 多個復選框選擇,選中時闹击,value5展示的是數(shù)組的值 -->
    <p>多個復選框的值:{{ value5 }}</p>
    <input type="checkbox" id="cb1" value="選項1" v-model="value5">
    <label for="cb1">選項2</label>
    <input type="checkbox" id="cb2" value="選項2" v-model="value5">
    <label for="cb1">選項3</label>
    <input type="checkbox" id="cb3" value="選項3" v-model="value5">
    <label for="cb1">選項4</label>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value4: '',
        value5: []
      }
    });
  </script>

選擇框綁定

  • 單選綁定和多選綁定
  <div id="app">
    <!-- 單選選擇框 -->
    <p>單選選擇框的內(nèi)容: {{value6}}</p>
    <select name="" id="" v-model="value6">
      <option value="">請選擇</option>
      <option value="1">選項1</option>
      <option value="2">選項2</option>
      <option value="3">選項3</option>
    </select>

    <!-- 多選選擇框 -->
    <p>多選選擇框的內(nèi)容:{{ value7 }}</p>
    <!-- 多選框要加一個mutiple屬性 -->
    <select name="" id="" v-model="value7" multiple>
      <option value="1">選項1</option>
      <option value="2">選項2</option>
      <option value="3">選項3</option>
    </select>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        // 單選選擇框數(shù)據(jù)
        value6: '',
        // 多選選擇框數(shù)據(jù)
        value7: []
      }
    });
  </script>

v-model指令小結(jié)

設(shè)置數(shù)據(jù)時镶蹋,可以設(shè)置為空字符串或者空數(shù)組

  • input:綁定字符串值

  • textarea:綁定字符串值

  • radio:綁定字符串值

  • checkbox:單個綁定布爾值,多個綁定數(shù)組

  • select:單選綁定字符串赏半,多選綁定數(shù)組

修飾符

以點開頭的指令后綴贺归,用于給當前指令設(shè)置特殊操作

事件修飾符

**.prevent修飾符,用于阻止默認事件行為断箫。**
  <div id="app">
    <a @click.prevent="fn" >鏈接</a>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {

      },
      methods: {
        fn () {
          console.log('這是 a 鏈接的點擊事件');
        }
      }
    });
  </script>
**.stop修飾符 用于阻止事件傳播 防止冒泡拂酣,相當于event.stopPropagation()**
  <div id="app">
    <div @click="fn1">
        <!-- 阻止事件冒泡 -->
        <!-- <button @click.stop = "fn2">按鈕</button> -->

        <a @click.prevent.stop = "fn2"  >鏈接</a>
    </div>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {

      },
      methods: {
       fn1 () {
         console.log('div事件');
       },
       fn2 () {
        //  console.log('button事件');
         console.log('a事件');
       }
       
      }
    })
  </script>

** once修飾符 用于設(shè)置事件只會觸發(fā)一次**

按鍵修飾符

  • 按鍵碼是將按鍵的按鍵碼作為修飾符使用以表示按鍵的操作方式

  • 除了內(nèi)容按鍵還有特殊按鍵如esc,enter仲义、delete等功能按鍵婶熬,應首選內(nèi)置別名剑勾,方便兼容。
    如: .esc .enter .tab .delete. .space .up .down .left .right

  <div id="app">
    
    <!-- <input type="text" @keyup="fn"> -->
    <!-- 97是數(shù)字1的keycode -->
    <!-- <input type="text" @keyup.97="fn"> -->
    <!-- 也可以直接用按鍵代替 -->
    <input type="text" @keyup.a="fn">
    <input type="text" @keyup.esc="fn">
    <!-- 表示幾個按鍵有一個按下即可赵颅,或的關(guān)系 -->
    <input type="text" @keyup.esc.a.b.c="fn">


  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {

      },
      methods: {
        // e和event等價
       fn(e) {
          console.log(e);
          console.log("輸入了相應代碼");
       }
      }
    });

系統(tǒng)修飾符

  • ctrl虽另、 alt、 shift系統(tǒng)按鍵饺谬,系統(tǒng)按鍵與其他按鍵組合使用

  • 系統(tǒng)修飾符ctrl修飾符捂刺、 alt修飾符 、 shift修飾符

  • .exact修飾符允許控制有精確系統(tǒng)修飾符組合觸發(fā)事件


<button v-on:click.ctrl.exact='onclick'>按鈕</button>

  <div id="app">
    <!-- <input type="text" @keyup.17.q="fn"> -->

    <input type="text" @keyup.ctrl.q="fn" v-model='inputValue'>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        inputValue: ''
      },
      methods: {
        fn (event) {
          // console.log(event);
          this.inputValue = '';
        }
      }
    });
  </script>

鼠標修飾符

  • 可以決定由鼠標哪個鼠標按鍵完成
    分為.left左鍵 .right右鍵 .middle中鍵
  <div id="app">
    <button @click.left="fn">按鈕1</button>
    <button @click.right="fn">按鈕2</button>
    <button @click.middle="fn">按鈕3</button>


  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {

      },
      methods: {
        fn() {
          console.log('點擊了元素');
        }
      }
    });
  </script>

v-model修飾符

  • .trim修飾符
    用于自動過濾用戶輸入的首尾兩端的空格
  • .lazy修飾符
    用于將v-model觸發(fā)方式由 input 事件觸發(fā)更改為 change 事件觸發(fā)(指定操作觸發(fā))
  • .number 修飾符
    用于自動將輸入內(nèi)容轉(zhuǎn)換為數(shù)值募寨,如 無法被parseFloat()轉(zhuǎn)換叠萍,返回原始內(nèi)容

自定義指令

  • 簡化dom操作,相當于對dom操作的一種封裝绪商,通過自定義指令,封裝一些dom功能

自定義全局指令

  • 可以被任意 vue 實例或組件使用的指令
    <div id="app">
      <!-- v-focus是調(diào)用指令辅鲸,.a.b是給binding綁定信息 -->
      <input type="text" v-focus.a.b="100+100">
    </div>
  <script src="lib/vue.js"></script>
  <script>
    // 自定義全局指令格郁,focus是指令的類型,directive是單數(shù)形式
    Vue.directive("focus",{
      // inserted是指插入元素時独悴,執(zhí)行回調(diào)函數(shù)
       inserted(el, binding) {
        //  打印綁定信息例书,綁定信息有很多屬性
         console.log(binding);
        //  執(zhí)行焦點函數(shù)
         el.focus();
       }
    });
    new Vue({
      el: '#app',
      data: {

      }
    });   
  </script>

自定義局部指令

  • 在當前 vue實例或者組件內(nèi)使用的指令

鉤子函數(shù):

  • bind:只調(diào)用一次,指令第一次綁定到元素使用

  • inserted:被綁定元素插入父節(jié)點時調(diào)用(僅保證父節(jié)點存在刻炒,但不一定被插入文檔中)

  • update:所在組件的VNode更新時調(diào)用决采,但是可能發(fā)生在其子 VNode 更新之前,指令的值可能發(fā)生了改變坟奥,也可能沒有
    但是可以通過比較更新前后的值來忽略不必要的模板更新

  <div id="app">
    <input type="text" v-focus>
  </div>

  <div id="app2">
    <input type="text" v-focus>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    // 自定義局部指令
    new Vue({
      el: '#app',
      data: {},
      //這里是復數(shù)
      directives:{
        //注意此處指令名稱沒有雙引號了
        focus: {
          inserted(el) {
            el.focus();
          }
        }
      }
    });
    //新定義的就不會掛載自動獲取焦點功能
    new Vue({
      el:'#app2'
    })
    
  </script>

過濾器

全局過濾器

  • 用于進行文本內(nèi)容格式化树瞭,可以在插值表達式和 v-bind 中使用

  • 全局過濾器可以在任意 vue 實例中使用

  • 過濾器通過管道符 | 連接數(shù)據(jù)

  • 可以將一個數(shù)據(jù)傳入到多個過濾器中處理

  <div id="app">
    <!-- 執(zhí)行順序是從前往后一次執(zhí)行過濾器,前面過濾器執(zhí)行完畢之后將值傳給后面的過濾器 -->
    <!-- <p>{{ aaa | filterA | UpperCase }}</p> -->
    
    <!-- 這里filter中的第一個參數(shù)始終是管道符前的變量,后面會依次作為第二個第三個參數(shù)傳入 -->
    <!-- <p>{{ aaa | filterC("abc","lagou-",200) }}</p> -->

  </div>
  <script src="lib/vue.js"></script>
  <script>
    
    // Vue.filter('filterA', function (aaa) {
    //   console.log(aaa);//a-b-c
    //   return aaa.split('-').join("");
    // });

    // // 過濾器是可以改名字的
    // Vue.filter('UpperCase',function (aaa) {
    //   console.log(aaa);//abc
    //   return aaa[0].toUpperCase() + aaa.slice(1)
    // });
    Vue.filter("filterC",function (par1,par2,par3,par4) {
      return par1 + par2.split('-').join("") + par3 + par4;
      // console.log();
    })
    new Vue({
      el: '#app',
      data: {
        aaa:'a-b-c'
      }
    });
  </script>

局部過濾器

  • 只用在當前 vue 實例中

注釋中寫了很多有用的東西

  <div id="app">
    <!-- <p>{{ content | filterA}}</p>
    <p>{{ content2 | filterA}}</p> -->
    <p>{{ content | filterA | filterB}}</p>
    <p>{{ content | filterA | fliterC('lagou-')}}</p>
  </div>

  <!-- <div id="app2">
    <p>{{ content | filterA }}</p>
  </div> -->
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        content: 'a-b-c',
        content2: 'x-y-z'
      },
      //  局部過濾器需要filters爱谁,復數(shù)
      filters: {
        filterA : function (value) {
          return value.split('-').join("");
        },
        filterB : function (value) {
          return value.split('').reverse().join('');
        },
        // 接收多個參數(shù)
        fliterC (value,prefix) {
          //記住第一個參數(shù)一定是管道符前的內(nèi)容
          // return value + prefix;
          return prefix + value;
        }
      }
    });

    new Vue({
      el: '#app2',
      data: {
        content: 'q-w-e'
      }
    }) 
  </script>

全局過濾器與局部過濾器共同存在且 重名 的情況晒喷,局部過濾器 生效,可以利用此方法層疊掉不用的過濾器

計算屬性

  • vue.js 視圖不建議書寫復雜邏輯访敌,這樣不利于維護

  • 計算屬性使用時為屬性形式凉敲,訪問是自動執(zhí)行對應函數(shù)

方法名就是計算屬性的屬性名稱,功能就是函數(shù)執(zhí)行的操作

  <div id="app">
    <p>{{ getSum() }}</p>
    <p>{{ getSum() }}</p>
    <p>{{ getSum() }}</p>

    <p>{{getResult}}</p>
    <p>{{getResult}}</p>
    <p>{{getResult}}</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        arr: [1, 2, 3, 4, 5]
      },
      methods: {
        getSum () {
          console.log('執(zhí)行了函數(shù)功能');
          var arr = this.arr;
          var sum = 0;
          for (var i = 0; i < arr.length; i++) {
            sum += arr[i];
          }
          return sum;
        }
      },
      computed: {
        getResult () {
          console.log('執(zhí)行了計算屬性');
          var arr = this.arr;
          var sum = 0;
          for (var i = 0; i < arr.length; i++) {
            sum += arr[i];
          }
          return sum;
        }
      }
    })
  </script>
  • method與computed區(qū)別

    · computed 具有緩存性寺旺,每次計算之后緩存結(jié)果爷抓,methods沒有
    · computed 通過屬性名訪問,methods需要調(diào)用
    · computed 僅適用于計算操作

計算屬性的setter

計算屬性默認只有g(shù)etter阻塑,vue.js也允許給計算屬性設(shè)置setter

用于給comtped進行賦值和獲取

  <div id="app">
    <p>{{ fullName }}</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        firstName: '張',
        lastName: '三'
      },
      computed: {
        // 默認書寫方式
        // fullName () {
        //   return this.firstName + this.lastName;
        // }
        // 分開書寫getter和setter
          fullname () {
            get() {
              return this.firstName + this.lastName;
            },
            set(newName) {
              var nameArr = newName.split(" ");
              this.firstName = nameArr[0];
              this.lastName = nameArr[1];
            }
          }
      }
    });
      </script>

偵聽器

  • 用于監(jiān)視數(shù)據(jù)變化并執(zhí)行操作

  • 為了監(jiān)聽對象內(nèi)部值的變化蓝撇,需要將watch書寫為對象,設(shè)置deep:true叮姑,這是通過handler設(shè)置處理函數(shù)

注意:
- 當更改(非替換)數(shù)組或?qū)ο髸r唉地,回調(diào)函數(shù)中新值與舊值相同据悔,因為他們的引用都指向同一數(shù)組、對象耘沼。

- 數(shù)組操作不要使用length和索引极颓,無法觸發(fā)偵聽器函數(shù)
  <div id="app">

  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        title:'這是普通內(nèi)容',
        obj:{
          content1:'內(nèi)容1',
          content2:'內(nèi)容2'
        }
      },
      watch: {
        //修改title內(nèi)容
        title(val,oldval) {
          console.log('title被修改了',val,oldval);
        },
        //無法監(jiān)聽對象內(nèi)部值的變化
        // obj (){
        //   console.log('obj 被修改了');
        // }
        // 可以將函數(shù)改寫為對象形式
        obj: {
          //必須設(shè)置監(jiān)聽器為deep:true才能監(jiān)聽對象內(nèi)部
          deep:true,
          handler (val,oldVal) {
            console.log('obj被監(jiān)聽了',val,oldval);
            console.log(val === oldval);//true
          }
        },
        // arr在監(jiān)聽中,length和索引是不生效的群嗤,且可以不用deep:true,
        arr: {
          deep:true,
          handler (val,oldVal) {
            console.log('arr修改了',val,oldVal);
          }
        },
        // 與上面等價
        // arr(val,oldVal) {
        //     console.log('arr修改了',val,oldVal);
        // }
      }      
    });
  </script>

Vue DevTools

  • 是vue.js官方提供的用來調(diào)試vue應用的工具
    注意:
    • 網(wǎng)頁必須應用了vue.js功能才能看到

    • 網(wǎng)頁必須使用了vue.js而不是vue.min.js

    • 網(wǎng)頁必須在http協(xié)議下打開菠隆,而不是使用 file 協(xié)議本地打開

vue.js生命周期

  • 實例從創(chuàng)建到運行,再到銷毀的過程

生命周期函數(shù)(鉤子)

  • 創(chuàng)建階段:
    · beforeCreate:實例初始化之前調(diào)用(很少用)

    · created: 實例創(chuàng)建后調(diào)用,data和methods創(chuàng)建完畢后 -- 數(shù)據(jù)請求和操作

    · beforeMount:實例掛載錢調(diào)用狂秘,頁面模板未渲染

    · mounted: 實例掛載完畢骇径,可執(zhí)行dom操作。
    特點:每個實例只能執(zhí)行一次

  • 運行階段:
    · beforeUpdate:數(shù)據(jù)更新后者春,視圖更新前調(diào)用破衔。

    · updated:視圖更新后調(diào)用

特點:按需調(diào)用

  • 銷毀階段:
    · beforeDestroy:實例銷毀之前調(diào)用

    · destroy:實例銷毀之后調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钱烟,隨后出現(xiàn)的幾起案子晰筛,更是在濱河造成了極大的恐慌,老刑警劉巖拴袭,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件读第,死亡現(xiàn)場離奇詭異,居然都是意外死亡拥刻,警方通過查閱死者的電腦和手機怜瞒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來般哼,“玉大人吴汪,你說我怎么就攤上這事∈潘” “怎么了浇坐?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黔宛。 經(jīng)常有香客問我近刘,道長,這世上最難降的妖魔是什么臀晃? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任觉渴,我火速辦了婚禮,結(jié)果婚禮上徽惋,老公的妹妹穿的比我還像新娘案淋。我一直安慰自己,他們只是感情好险绘,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布踢京。 她就那樣靜靜地躺著誉碴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓣距。 梳的紋絲不亂的頭發(fā)上黔帕,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音蹈丸,去河邊找鬼成黄。 笑死,一個胖子當著我的面吹牛逻杖,可吹牛的內(nèi)容都是我干的奋岁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荸百,長吁一口氣:“原來是場噩夢啊……” “哼闻伶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起够话,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虾攻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后更鲁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡奇钞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年澡为,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景埃。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡媒至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷徙,到底是詐尸還是另有隱情拒啰,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布完慧,位于F島的核電站谋旦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屈尼。R本人自食惡果不足惜册着,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脾歧。 院中可真熱鬧甲捏,春花似錦、人聲如沸鞭执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至大溜,卻和暖如春化漆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猎提。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工获三, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锨苏。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓疙教,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伞租。 傳聞我的和親對象是個殘疾皇子贞谓,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容