VUE基本使用

vue簡(jiǎn)介

  • vue.js的數(shù)據(jù)驅(qū)動(dòng)視圖是基于MVVM模型實(shí)現(xiàn)的
  • model 代表數(shù)據(jù)
  • view 代表視圖模板
  • viewmodel 代表業(yè)務(wù)邏輯處理

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

  • 基于MVVM模型實(shí)現(xiàn)的數(shù)據(jù)驅(qū)動(dòng)視圖解放了DOM操作
  • view與model處理分離橄务,降低代碼耦合度
  • 雙向綁定時(shí)的bug調(diào)試難度增大
  • 大型項(xiàng)目的view與model過(guò)多计螺,維護(hù)成本高

組件化開(kāi)發(fā)

  • 組件化開(kāi)發(fā),允許我們將網(wǎng)頁(yè)功能封裝為自定義HTML標(biāo)簽泛粹,復(fù)用書(shū)寫(xiě)自定義標(biāo)簽名即可
  • 組件不僅可以封裝結(jié)構(gòu)蓬蝶,還可以封裝樣式與邏輯代碼螺戳,大大提高了開(kāi)發(fā)效率與可維護(hù)性

vue實(shí)例

  • vue實(shí)例是通過(guò)vue函數(shù)創(chuàng)建的對(duì)象踏堡,是使用vue功能的基礎(chǔ)

el選項(xiàng)

  • 用于選取一個(gè)DOM元素作為vue實(shí)例的掛載目標(biāo)
  • 只有掛載元素內(nèi)部才會(huì)被vue進(jìn)行處理,外部為普通HTML元素
  • 代表MVVM中的view層

插值表達(dá)式

  • 掛載元素可以使用vue.js的模板語(yǔ)法恒水,模塊中通過(guò)插值表達(dá)式為元素進(jìn)行動(dòng)態(tài)內(nèi)容設(shè)置会放,寫(xiě)法為{{}}
  • 插值表達(dá)式只能書(shū)寫(xiě)在標(biāo)簽內(nèi)容區(qū)域,可以與其他內(nèi)容混合
  • 內(nèi)部只能書(shū)寫(xiě)js表達(dá)式钉凌,不能書(shū)寫(xiě)語(yǔ)句

data選項(xiàng)

  • data中的數(shù)據(jù)可以通過(guò)vm.$data.數(shù)據(jù)或vm.數(shù)據(jù)訪(fǎng)問(wèn)
  • data中的數(shù)據(jù)為響應(yīng)式數(shù)據(jù)咧最,在發(fā)生改變時(shí),視圖會(huì)自動(dòng)更新
  • data中存在數(shù)組時(shí)御雕,索引操作與length操作無(wú)法自動(dòng)更新視圖矢沿,這時(shí)可以借助vue.set()方法替代操作

methods選項(xiàng)

  • 用于存儲(chǔ)需要在vue實(shí)例中使用的函數(shù)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./lib/vue.js"></script>
</head>
<body>
  <div id="app">
    <ul>
      <!-- 插值表達(dá)式 -->
      <li>內(nèi)容展示: {{10 + 2 + 3}}</li>
      <li>{{title}}</li>
      <li>{{fn(list)}}</li>
    </ul>
  </div>
  <script>
    var vm = new Vue({
      //el綁定元素
      el: '#app',
      data: {
        title: '標(biāo)題文本',
        list: 'a-b-c-d'
      },
      methods: {
        fn(value){
          return value.split('-').join('')
        }
      }
    });

    console.log(vm.$el); 
    console.log(vm.title)
    // var vm = new Vue({});
    // vm.$mount('#app')
  </script>
</body>
</html>

指令

  • 指令本質(zhì)就是html自定義屬性

v-once

  • 使元素內(nèi)部的插值表達(dá)式只生效一次
    <li v-once>{{title}}</li>
    

v-text

  • 元素內(nèi)容整體替換為指定純文本數(shù)據(jù)
    <li v-text="title"></li>
    

v-html

  • 元素內(nèi)容整體替換為指定的html文本
    <li v-html="content"></li>
    data: {
      content: '<h1>aaa</h1>'
    },
    

v-bind 簡(jiǎn)寫(xiě)用 :

  • v-bind用于動(dòng)態(tài)綁定HTML屬性
  • 需要一次綁定多個(gè)屬性,還可以綁定對(duì)象

class綁定

  • class是html屬性饮笛,可以通過(guò)v-bind進(jìn)行綁定咨察,并且可以與class屬性 共存
    <li :class="{b : isB,c : isC,'class-d' : true}"></li>
    <li :class="['a',{b : isB},'c']"></li>
    data: {
      isB : true,
      isC : true,
    },
    

style綁定

  • style是html屬性论熙,可以通過(guò)v-bind進(jìn)行綁定福青,并且可以和style屬性共存
  • 綁定樣式的優(yōu)先級(jí)大于固定樣式
  • 可以通過(guò)數(shù)組給標(biāo)簽設(shè)置多個(gè)樣式
    <p :style="styleObj">這是樣式</p> 
    data: {
      styleObj: {
        width: '100px',
        height: '100px',
        backgroundColor: 'red',
      }
    }
    

v-for

  • 用于遍歷數(shù)據(jù)渲染結(jié)構(gòu),常用的數(shù)組與對(duì)象均可遍歷
  • 通過(guò)<template>標(biāo)簽設(shè)置模板占位符,可以將部分元素或內(nèi)容作為整體進(jìn)行操作
     <div id="app">
      <ul>
        <li v-for="(item, index) in itemList" :key="item.id">
          輸入框{{ item.value }}: <input type="text">
        </li>
      </ul>
      <template v-for="item in obj">
        <span>{{ item }}</span>
        <br>
      </template>
    </div>
    <script src="lib/vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          arr: [1, 2, 3],
          itemList: [
            {
              id: 1,
              value: 2
            },
            {
              id: 2,
              value:3
            },
            {
              id:3,
              value:3
            }
          ],
          obj: {
            content1: '內(nèi)容1',
            content2: '內(nèi)容2',
            content3: '內(nèi)容3'
          }
        }
      })
    </script>
    

v-show

  • 用于控制元素顯示與隱藏无午,適用于顯示隱藏頻繁切換時(shí)使用
  • <template>無(wú)法使用v-show指令

v-if

  • 用于根據(jù)條件控制元素的創(chuàng)建和移除
    <div id="app">
      <p v-if="false">這個(gè)元素不會(huì)創(chuàng)建</p>
      <p v-else-if="true">這個(gè)元素會(huì)創(chuàng)建</p>
      <p v-else>這個(gè)元素不會(huì)創(chuàng)建</p>
    </div>
    

事件處理

v-on 簡(jiǎn)寫(xiě)用@

  • 用于進(jìn)行元素的事件綁定
  • 事件程序代碼較多媒役,可以在methods中設(shè)置函數(shù),并設(shè)置為事件處理程序
  • 在視圖中可以通過(guò)$event訪(fǎng)問(wèn)事件對(duì)象
    <div id="app">
      <p>{{content}}</p>
      <button v-on:click="content='這是點(diǎn)擊內(nèi)容'">點(diǎn)擊</button>
      <button @click="fn">按鈕</button>
      <button @click="fn($event)">按鈕2</button>
    </div>
    <script>
      var vm = new Vue({
        //el綁定元素
        el: '#app',
        data: {
          content : '這是綁定的內(nèi)容'
        },
        methods: {
          fn(event){
            this.content = "這是按鈕3設(shè)置的內(nèi)容"
            console.log(event)
          }
        }
      });
    </script>
    

v-model

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

    <div id="app">
      <p>元素雙向綁定:{{value}}</p>
     <input type="text" v-model="value">
    </div>
    <script>
      var vm = new Vue({
        //el綁定元素
        el: '#app',
        data: {
         value: '',
        }
      });
    </script>
    

單選按鈕綁定

<div id="app">
    <p>radio的內(nèi)容:{{value}}</p>
    <label for="one">選項(xiàng)一</label>
    <input type="radio" id="one" value="1" v-model="value">
    <label for="two">選項(xiàng)一</label>
    <input type="radio" id="two" value="2" v-model="value">
  </div>

修飾符

  • 修飾符是以點(diǎn)開(kāi)頭的指令后綴酣衷,用于給當(dāng)前指令設(shè)置特殊操作

.prevent修飾符

  • 用來(lái)阻止默認(rèn)事件行為,相當(dāng)于event.preventDefault()
    <a @click.prevent >鏈接</a>
    

.stop修飾符

  • 用于阻止事件傳播次泽,相當(dāng)于event.stopPropagation()
    <div @click="fn1">
      <!-- <button @click.stop="fn2">按鈕</button> -->
      //只執(zhí)行fn2穿仪,不會(huì)執(zhí)行fn1
      <a @click.prevent.stop="fn2" >鏈接</a>
    </div>
    

.once修飾符

  • 用于設(shè)置事件只會(huì)觸發(fā)一次
    <button @click.once="fn">按鈕2</button>
    

按鍵修飾符

  • 按鍵碼指的是將按鍵的按鍵碼作為修飾符使用以標(biāo)識(shí)按鍵的操作方式
  • 單獨(dú)點(diǎn)擊系統(tǒng)操作符無(wú)效
    <div id="app">
      <!-- <input type="text" @keyup="fn"> -->
      <!-- <input type="text" @keyup.49="fn"> -->  
      <!-- <input type="text" @keyup.esc="fn"> -->
      <input type="text" @keyup.a.b.c="fn">
    </div>
    <script src="lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data: {
    
        },
        methods: {
          fn (event) {
            console.log(event);
            console.log('輸入了對(duì)應(yīng)內(nèi)容');
          }
        }
      });
    

v-model修飾符

  • .trim修飾符 用于自動(dòng)過(guò)濾用戶(hù)輸入內(nèi)容首尾兩端的空格
  • .lazy修飾符 用于將v-model的觸發(fā)方式由input事件觸發(fā)更改為change事件觸發(fā)
  • .number修飾符 用于自動(dòng)將用戶(hù)輸入的指轉(zhuǎn)換為數(shù)值類(lèi)型,如果無(wú)法被parseFloat()轉(zhuǎn)換意荤,則返回原始內(nèi)容

自定義全局指令

  • 指的是可以被任意vue實(shí)例或組件使用的指令
    <input type="text" v-focus.a.b="100+1">
    <script>
      // 自定義全局指令
      Vue.directive('focus', {
        inserted (el, binding) {
          // console.log(el);
          console.log(binding);
          el.focus();
        }
      });
    </script>
    

自定義局部指令

  • 只能在當(dāng)前vue實(shí)例或組件內(nèi)使用
    <input type="text" v-focus>
    // 自定義局部指令
    new Vue({
      el: '#app',
      data: {},
      directives: {
        focus: {
          inserted (el) {
            el.focus();
          }
        }
      }
    });
    

全局過(guò)濾器

  • 全局過(guò)濾器可以在任意vue實(shí)例中使用
  • 過(guò)濾器能在插值表達(dá)式和v-bind中使用啊片,通過(guò)管道符|連接數(shù)據(jù)
    <div id="app">
      <p :title="value | filterA">這是標(biāo)簽</p>
    </div>
    <script>
      //設(shè)置全局過(guò)濾器
      Vue.filter('filterA',function (value) {
        return value.split('-').join('')
      })
      var vm = new Vue({
        //el綁定元素
        el: '#app',
        data: {
         value: 'a-b-c',
         value2: []
        }
      });
    

局部過(guò)濾器

  • 局部過(guò)濾器只能在當(dāng)前vue實(shí)例中使用
    <div id="app">
      <p :title="value | filterA">這是標(biāo)簽1</p>
    </div>
    <script>
      var vm = new Vue({
        //el綁定元素
        el: '#app',
        //局部過(guò)濾器
        filters:{
          filterA: function (value) {
            return value.split('-').join('')
          }
        },
        data: {
         value: 'a-b-c',
        }
      });
    </script>
    

計(jì)算屬性

  • vue.js的視圖不建議書(shū)寫(xiě)復(fù)雜邏輯,這樣不利于維護(hù)
  • 計(jì)算屬性使用時(shí)為屬性形式玖像,訪(fǎng)問(wèn)時(shí)會(huì)自動(dòng)執(zhí)行對(duì)應(yīng)函數(shù)

methods與computed區(qū)別

  • computed具有緩存性紫谷,methods沒(méi)有
  • computed通過(guò)屬性名訪(fǎng)問(wèn),methods需要調(diào)用
  • computed僅使用于計(jì)算操作

計(jì)算屬性的setter

  • 計(jì)算屬性默認(rèn)只有g(shù)etter,vue.js也允許給計(jì)算屬性設(shè)置setter
    <div id="app">
      <p>{{fullname}}</p>
    </div>
    <script>
      var vm = new Vue({
        //el綁定元素
        el: '#app',
        data: {
          firstName: '張',
          lastName: '三'
        },
        computed: {
          // fullname(){
          //   return this.firstName + this.lastName
          // }
          fullname: {
            get(){
              return this.firstName + this.lastName
            },
            set(newValue){
              // console.log(newValue)
              var nameArr = newValue.split(' ');
              this.firstName = nameArr[0];
              this.lastName = nameArr[1];
            }
          }
        }
      });
    

偵聽(tīng)器

  • 偵聽(tīng)器用于監(jiān)聽(tīng)數(shù)據(jù)變化并執(zhí)行指定操作
  • 為了監(jiān)聽(tīng)對(duì)象內(nèi)部值的變化捐寥,需要將watch書(shū)寫(xiě)為對(duì)象笤昨,并設(shè)置選項(xiàng)deep:true,這時(shí)通過(guò)handler設(shè)置處理函數(shù)
  • 當(dāng)更改數(shù)組和對(duì)象時(shí),回調(diào)函數(shù)中的新值與舊值相同握恳,因?yàn)樗鼈兊囊枚贾赶蛲粋€(gè)數(shù)組瞒窒、對(duì)象
  • 數(shù)組操作不要使用索引與length,無(wú)法觸發(fā)偵聽(tīng)器函數(shù)
    <div id="app">
      <input type="text" v-model="value">
      <p>{{value}}</p>
    </div>
    <script>
      var vm = new Vue({
        //el綁定元素
        el: '#app',
        data: {
          value:'',
        },
        watch: {
          value(){
            console.log('執(zhí)行了偵聽(tīng)器')
          }
        }
      });
    </script>
    

vue DevTools

  • Vue.js官方提供的用來(lái)調(diào)試Vue應(yīng)用的工具
  • 網(wǎng)頁(yè)必須應(yīng)用了Vue.js功能才能看到Vue DevTools
  • 網(wǎng)頁(yè)必須使用Vue.js而不是Vue.min.js
  • 網(wǎng)頁(yè)需要在http協(xié)議下打開(kāi),而不是使用file協(xié)議本地打開(kāi)

生命周期

  • 通過(guò)設(shè)置生命周期函數(shù)乡洼,可以在生命周期的特定階段執(zhí)行功能
  • 初始化階段
    • beforeCreate: 實(shí)例初始化之前調(diào)用
    • created:實(shí)例創(chuàng)建后調(diào)用
    • beforeMount: 實(shí)例掛載之前調(diào)用
    • mounted: 實(shí)例掛載完畢
  • 運(yùn)行階段
    • beforeUpdate: 數(shù)據(jù)更新后根竿,視圖更新前調(diào)用
    • updated: 視圖更新后調(diào)用
  • 銷(xiāo)毀階段
    • beforeDestroy: 實(shí)例銷(xiāo)毀之前調(diào)用
    • destroyed: 實(shí)例銷(xiāo)毀后調(diào)用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市就珠,隨后出現(xiàn)的幾起案子寇壳,更是在濱河造成了極大的恐慌,老刑警劉巖妻怎,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳炎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逼侦,警方通過(guò)查閱死者的電腦和手機(jī)匿辩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)榛丢,“玉大人铲球,你說(shuō)我怎么就攤上這事∥蓿” “怎么了稼病?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵选侨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我然走,道長(zhǎng)援制,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任芍瑞,我火速辦了婚禮晨仑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拆檬。我一直安慰自己洪己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布竟贯。 她就那樣靜靜地躺著码泛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澄耍。 梳的紋絲不亂的頭發(fā)上噪珊,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音齐莲,去河邊找鬼痢站。 笑死,一個(gè)胖子當(dāng)著我的面吹牛选酗,可吹牛的內(nèi)容都是我干的阵难。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芒填,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呜叫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起殿衰,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朱庆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后闷祥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娱颊,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年凯砍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱硕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悟衩,死狀恐怖剧罩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情座泳,我是刑警寧澤惠昔,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布幕与,位于F島的核電站,受9級(jí)特大地震影響舰罚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薛耻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一营罢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饼齿,春花似錦饲漾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至证鸥,卻和暖如春僚楞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枉层。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工泉褐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸟蜡。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓膜赃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親揉忘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跳座,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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