vue (basic)

構(gòu)造器


實例化 vue 時顶掉,需要傳入一個選項對象草娜,包括 數(shù)據(jù)模板痒筒、掛件元素宰闰、方法和生命周期鉤子

屬性與方法


  • 每個 vue 實例都會代理其data對象里所有的屬性
  • 實例中會有一些實例的屬性和方法茬贵,這些屬性和方法都有前綴$(便于與代理data屬性區(qū)分)

生命周期視圖


https://cn.vuejs.org/images/lifecycle.png

實例生命周期


name description
created 鉤子 在實例被創(chuàng)建后被調(diào)用
mounted 當(dāng)編譯好的 HTML 被掛載到對應(yīng)的位置,這個操作完成后觸發(fā)
updated 當(dāng)data中的數(shù)據(jù)改變移袍,并且虛擬 DOM 重新渲染完成后觸發(fā)
destroyed
注意 鉤子的this指向調(diào)用它的實例

插值


1. 文本

  • 雙大括號 {{ }}
  • v-text

2. 純 HTML

  • v-html

3. 屬性

  • v-bind(雙括號不能在屬性中使用解藻,因此需使用v-bind

4. 使用 JavaScript 表達式

指令


例舉一些指令

  • v-bind
  • v-on
修飾符 描述
.stop 阻止單擊事件冒泡<a v-on:click.stop="doThis"></a>
.prevent 提交事件不再重載頁面
.capture 添加事件偵聽器時使用時間捕獲模式
.self 只當(dāng)事件在該元素本身(而不是子元素)觸發(fā)時觸發(fā)回調(diào)
... 等等
  • v-if
<div id="app">
<template v-if="ok==='username'">
用戶名: <input type="text" placeholder="請輸入用戶名" key="name-input">
</template>
<template v-else>
密碼: <input type="text"  placeholder="請輸入密碼" key="psd-input">
</template>
<button @click="toggle">點擊切換類型</button>
</div>

new Vue({
  el: "#app",
  data: {
    ok:'username'
  },
  methods: {
  toggle: function(todo){
      if(this.ok==='username'){
      this.ok = 'psd'
    }else{
      this.ok = 'username';
    }
  }
  }
})

https://jsfiddle.net/18613326395/zrkL9wj3/

  • v-for
<ul>
  <li v-for="item in items">{{item}}</li>
</ul>
</div>

new Vue({
el: "#app",
data: {
items:['a','b','c']
},
methods: {
  toggle: function(todo){
      todo.done = !todo.done
  }
}
})

https://jsfiddle.net/18613326395/s3fu7tmk/

過濾器

用于將文本轉(zhuǎn)化成你想要的格式
filters

 <div id="app">
        <p>{{message | changeChar}}</p>
       <button @click="changeFirstChar">改變</button>
    </div>

   new Vue({
    el: "#app",
    data: {
      message:'nihao'
    },
    methods: {
        changeFirstChar: function(todo){
            this.message = 'good evening'
        }
      },
      filters:{
        changeChar(value){
                if(!value){
            return '';
          }else{
            return value.charAt(0).toUpperCase()+value.substring(1)
          }
        }
      }
    })

https://jsfiddle.net/18613326395/z81xsma3/1/

縮寫

  • v-bind
<a v-bind:href="url"></a> 
---
<a :href="url"></a>
  • v-on
<button v-on:click="doSomeThing"></button> 
---
<button @click="doSomeThing"></button>


計算屬性


計算屬性(減少模板{{}}的復(fù)雜度)

computed

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

new Vue({
  el: "#app",
  data: {
    firstName:'Ji',
    lastName:'RenGu'
  },
  computed:{
    fullName(){
      return this.firstName+'----'+this.lastName;
    }
  }
})

計算(computed) vs 方法(methods)
計算屬性computed具有緩存,而methods無緩存

計算(computed) vs 偵聽器(watch)
watch方法--觀察Vue實例上的數(shù)據(jù)變動,只要指定的數(shù)據(jù)改變就會執(zhí)行預(yù)定的函數(shù)

watch

<div id="app">
    {{msg}} <br> 
    改變了嗎? {{isChange}}
    <button @click="change">改變</button>
</div>

new Vue({
  el: "#app",
  data: {
      msg:'欲窮千里目',
      isChange:'No'
  },
  watch:{
    //只要msg改變,這個方法就會執(zhí)行
    msg(val,oldVal){
        this.isChange = 'Yes'
    }
  },
  methods:{//不得不說ES6寫起來真爽
    change(){
        this.msg = '更上一層樓'
    }
  }
})

計算屬性的兩種方法:

getset葡盗,顧名思義螟左,一個是獲得,一個是設(shè)置觅够,常規(guī)上來講胶背,計算屬性中都是有getset方法,默認是只有getter方法喘先,如果需要的話钳吟,可以寫一個setter方法,看下面例子

<div id="app">
  此時的onpiece: {{onepiece}} <br>
  此時的msg: {{msg}} <br><br>
  <button @click="setName">設(shè)置name</button>
</div>

new Vue({
  el: "#app",
  data: {
  name:'Kobe',
  msg:''
  },
  methods:{
    setName(){
    this.onepiece = 'JorDan'
    }
  },
  computed:{
    onepiece:{
      get(){
        return this.name +'Bryant'
      },
      set(newVal){
      //當(dāng)你給 onepiece 設(shè)置值的時候 set 就就會調(diào)用
        this.msg = newVal+'is the greatest basketball player'
      }
    }
  }
})


class 與 style 綁定


綁定HTML class

  • 對象語法
    • 基本
    • 在對象中傳入多個 class 屬性(其會與原有 class 共存)
    • 直接傳入對象
    • 與計算屬性一起使用(綁定返回對象的計算屬性)
  • 數(shù)組語法
    • 簡單例子
    • 三元表達式
    • 當(dāng)有多個條件 class 時窘拯,可以在數(shù)組語法中使用對象語法
  • 用在組件上
    • 簡單例子

    • 綁定HTML class例子

綁定class的幾種方式

.classC{
  color:red;
}
.classD{
  font-weight:bold;
}
.classE{
  font-size:20px;
}
.classF{
  color:blue;
}
.classM{
  display:block;
}
.classN{
  display:none;
}
<div id="app">
  <h2>class屬性綁定</h2>
 -------------------綁定變量-------------------------
 <div :class="{classA:a,classB:b}">
   綁定變量
 </div>
  -------------------綁定對象-------------------------
 <div :class="styleObj">
   綁定對象
 </div>
  -------------------綁定數(shù)組-------------------------
 <div :class="arrClass">
   綁定數(shù)組
 </div>
   -------------------綁定三元運算符------------------
 <div :class="m==true?'classM':'classN'">
   綁定變量
 </div>
   <button @click="toggle">toggle</button>
</div>

new Vue({
  el: "#app",
  data: {
    a:true,
    b:false,
    styleObj:{
     classC:true,
     classD:true
     },
   m:true,
   arrClass:['classE','classF']
  },
  methods:{
    toggle(){
      this.m=!this.m;
    }
  }
})

綁定內(nèi)聯(lián)樣式

  • 對象語法
    內(nèi)聯(lián)式對象語法
    樣式對象式對象語法(更推薦)
  • 數(shù)組語法
  • 自動添加前綴
    v-bind:style 當(dāng)需要特定的前綴時如transform红且,vue.js會自動添加
  • 多重值
    從vue2.3+后,可以為一個屬性添加多個值的數(shù)組涤姊,常用于含有多個前綴的情況

條件渲染


v-if(v-else)是真正的渲染

  • template元素與v-if
  • v-else(需要緊跟在v-if后邊)
  • v-else-if(vue2.1.0新增)
  • key管理可復(fù)用的元素
    例子:用戶名和郵箱登錄界面 如果有key就不會復(fù)用,把key去試一下,然后再次輸入看一下效果
<div id="app">
  <template v-if="ok==='username'">
      用戶名: <input type="text" placeholder="請輸入用戶名" key="name-input">
  </template>
  <template v-else>
     密碼: <input type="text"  placeholder="請輸入密碼" key="psd-input">
  </template>
  <button @click="toggle">點擊切換類型</button>
</div>

new Vue({
  el: "#app",
  data: {
   ok:'username'
  },
  methods: {
    toggle: function(todo){
        if(this.ok==='username'){
        this.ok = 'psd'
      }else{
        this.ok = 'username';
      }
    }
  }
})

v-show(其只是簡單的切換display屬性)

  • v-show不支持template語法
  • v-show不支持v-else

v-if vs v-show

  • v-if
    1.當(dāng)條件不成立時不會渲染
    2.切換開銷較大暇番,適合不太可能變化的場景
  • v-show
    1.無論成不成立都會渲染
    2.首次渲染開銷較大,但切換開銷小砂轻,因此適合經(jīng)常變化的場景

列表渲染


v-for

  • 基本用法
    i. 簡單例子
    ii. 帶有index參數(shù)
    iii.使用of 替代 in
  • template v-for
    i. 簡單例子
  • 對象迭代 v-for
    i. 基礎(chǔ)用法
    ii. 帶其他參數(shù)用法
  • 整數(shù)迭代 v-for
    例子
  • 組件和v-for
    i. 包含所有類型的例子
//遍歷數(shù)組:
<ul>
  <li v-for="item in items">{{item}}</li>
<ul>

//遍歷數(shù)組對象:
<ul>
  <li v-for="(item, index) in pers">
    {{index}} 名字:{{item.name}}奔誓,年齡:{{item.age}}
  </li>
<ul>

//遍歷對象:
<ul>
  <li v-for="(value, key) in obj">
    key: {{key}}
    value: {{value}}
  </li>
<ul>

data: {
  items: ['banana', 'apple', 'orange'],
  pers: [{
    name: 'Kobe',
    age: '40'
  },
  {
    name: 'James',
    age: '38'
  }],
  obj: {
    1: 'one',
    2: 'two'
  }
}

key

作用:用v-for更新已渲染過的列表時,它默認采用的是“就地復(fù)用”的原則搔涝,也就是如果數(shù)據(jù)項順序發(fā)生了改變厨喂,vue將不是移動DOM元素來匹配數(shù)據(jù)項的順序,而是簡單復(fù)用此處的元素庄呈。如果想跟蹤每個節(jié)點的身份蜕煌,從而重用或重新排列現(xiàn)有元素,可使用key诬留。(key還可用在v-if中斜纪,詳見v-if中的郵箱名和用戶名切換的例子)

還是不懂,看下面的例子

<div id="app">
  KEY: <input type="text" v-model="id"> 
  VALUE: <input type="text" v-model="name">
  <button @click="add">添加</button>
  <ul>
    <li v-for='item in list' :key="item.id">  //---
      <input type="checkbox">
      {{item.id}}---{{item.name}}
    </li>
  </ul>
</div>

new Vue({
  el: "#app",
  data: {
    list:[
      {id:1, name:'李斯'},
      {id:2, name:'嬴政'},
      {id:3, name:'趙高'},
      {id:4, name:'韓非'},
      {id:5, name:'荀子'},
    ]
  },
  methods: {
    add: function(){
    this.list.unshift({id:this.id, name:this.name})
    }
  }
})

試著把 key 先去掉文兑,然后勾選一條盒刚,點擊添加;再加上 key 重復(fù)下操作绿贞。就會發(fā)現(xiàn)微妙的地方

數(shù)組更新檢測


  • 變異方法(會改變原有數(shù)組)
    push()
    pop()
    shift()
    splice()
    sort()
    reverse()
  • 重塑數(shù)據(jù)
    filter()
    concat()
    slice()
  • 注意事項
    利用索引直接設(shè)置一個項時因块,vue不能檢測變動,如:vm.items[indexOfItem] = newValue
    那如果設(shè)置某一項的該怎么設(shè)置呢?
    -1. Vue.set(example1.items, indexOfItem, newValue)
    -2. example1.items.splice(indexOfItem, 1, newValue)
<div id="app">
  <button @click="setZF">設(shè)置第二項為張飛</button>
  <button @click="setGY">設(shè)置第三項為關(guān)羽</button>
  <ul>
    <li v-for="item in list">
      <input type="checkbox">{{item.id}}---{{item.name}}
    </li>
  </ul>
</div>

new Vue({
  el: "#app",
  data: {
    id: '',
    name: '',
    list:[
      {id:1, name:'李斯'},
      {id:2, name:'嬴政'},
      {id:3, name:'趙高'},
      {id:4, name:'韓非'},
      {id:5, name:'荀子'},
    ]
  },
  methods: {
    setZF: function(){
        Vue.set(this.list,1,{id:2,name:'張飛'})
    },
    setGY: function(){
        this.list.splice(2,1,{id:3,name:'關(guān)羽'})
    }
  }
})

注意:

  • 修改數(shù)組長度時籍铁,vue 不能檢測變動涡上,如 `vm.items.length = newLength
  • 只能用`example1.items.splice(newLength)

對于顯示過濾 / 排序結(jié)果的兩種方法

過濾數(shù)組--計算屬性 (computed)

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

new Vue({
  el: "#app",
  data: {
    nums: [1,2,3,4,5,6,7,8,9]
  },
  computed: {
    specialNum() {
        return this.nums.filter((item, index) => {return item%3 == 0})
    }
  }
})

過濾數(shù)組--方法 (method)

<div id="app">
  <ul>  //在 v-for 循環(huán)中趾断,直接嵌入方法
    <li v-for="item in fil(numbers)">{{item}}</li>
  </ul>
</div>

new Vue({
  el: "#app",
  data: {
    numbers:[1,2,3,4,5,6,7,8,9]
  },
  methods:{
    fil(nums){
      return nums.filter((item,index)=>{
        return item%3==0;
      })
    }
  }
})


事件處理器


v-on來綁定事件,兩個簡單的例子

<div id="app">
  <button @click="num+=1">增加1</button>
  {{num}}
</div>

new Vue({
  el: "#app",
  data: {
    num: 0
  },
})
<div id="app">
  <button @click="sayHello">點擊sayHello</button>
</div>

new Vue({
  el: "#app",
  methods: {
    sayHello: function(){
      alert('sayHello')
    }
  }
})

內(nèi)聯(lián)處理器方法

訪問原生DOM事件的例子,如果click事件不傳參數(shù),就默認把原生DOM傳遞進去

<div id="app">  <!-- 沒有傳參數(shù),就是原生的!!! -->
  <button @click="showBtnname">顯示按鈕的名字</button> <br>
  {{msg}}
</div>

new Vue({
  el: "#app",
  data: {
    msg:''
  },
  methods: {
    showBtnname: function(e){
      this.msg = e.target.innerText;
    }
  }
})

未訪問原生DOM事件的例子,如果傳了參數(shù).那么方法中接受的第一個參數(shù)就是該參數(shù),在vue中所有的事件綁定都是這樣的

事件修飾符

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吩愧,一起剝皮案震驚了整個濱河市芋酌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雁佳,老刑警劉巖脐帝,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甘穿,居然都是意外死亡腮恩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門温兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人武契,你說我怎么就攤上這事募判。” “怎么了咒唆?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵届垫,是天一觀的道長。 經(jīng)常有香客問我全释,道長装处,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任浸船,我火速辦了婚禮妄迁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘李命。我一直安慰自己登淘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布封字。 她就那樣靜靜地躺著黔州,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阔籽。 梳的紋絲不亂的頭發(fā)上流妻,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音笆制,去河邊找鬼绅这。 笑死,一個胖子當(dāng)著我的面吹牛项贺,可吹牛的內(nèi)容都是我干的君躺。 我是一名探鬼主播峭判,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棕叫!你這毒婦竟也來了林螃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俺泣,失蹤者是張志新(化名)和其女友劉穎疗认,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伏钠,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡横漏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了熟掂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缎浇。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赴肚,靈堂內(nèi)的尸體忽然破棺而出素跺,到底是詐尸還是另有隱情,我是刑警寧澤誉券,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布指厌,位于F島的核電站,受9級特大地震影響踊跟,放射性物質(zhì)發(fā)生泄漏踩验。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一商玫、第九天 我趴在偏房一處隱蔽的房頂上張望箕憾。 院中可真熱鬧,春花似錦决帖、人聲如沸厕九。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扁远。三九已至,卻和暖如春刻像,著一層夾襖步出監(jiān)牢的瞬間畅买,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工细睡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谷羞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像湃缎,于是被迫代替她去往敵國和親犀填。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • x項目: MOOC qunar 基礎(chǔ):js es6 webpack npm 知識點:axios ajax數(shù)據(jù)獲...
    菠菜大法好閱讀 405評論 0 0
  • Vue起步 Axios:ajax數(shù)據(jù)的獲取嗓违。Vue Router:多頁面之間的路由九巡。Vuex:各個組件之間的數(shù)據(jù)共...
    db366da20578閱讀 990評論 0 1
  • 一、了解Vue.js 1.1.1 Vue.js是什么蹂季? 簡單小巧冕广、漸進式、功能強大的技術(shù)棧 1.1.2 為什么學(xué)習(xí)...
    蔡華鵬閱讀 3,324評論 0 3
  • 每個 Vue 應(yīng)用都是通過用 Vue 函數(shù)創(chuàng)建一個新的 Vue 實例開始的: 實例生命周期鉤子 每個 Vue 實例...
    Timmy小石匠閱讀 1,380評論 0 11
  • 1. Vue 實例 1.1 創(chuàng)建一個Vue實例 一個 Vue 應(yīng)用由一個通過 new Vue 創(chuàng)建的根 Vue 實...
    王童孟閱讀 1,021評論 0 2