Vue2入門 從0到1

安裝

開箱即用(學(xué)習(xí)推薦省撑,最好上手)

<!-- 開發(fā)環(huán)境版本掖鱼,包含了有幫助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 生產(chǎn)環(huán)境版本,優(yōu)化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

開始使用

創(chuàng)建一個Vue實列

var App = new Vue({
  el: '#app', // 實列化dom的選擇器
  components: {}, // 組件注冊
  data: {}, // 數(shù)據(jù)
  methods: {} // 函數(shù)
})

生命周期

總共分為8個階段:創(chuàng)建前/后,掛載前/后,更新前/后,銷毀前/銷毀后。

掛載
beforeCreate(創(chuàng)建前)created(創(chuàng)建后)beforeMount(掛載前)mounted(掛載后)

更新(元素或組件的變更操作)
beforeUpdate(更新前)updated(更新后)

銷毀(銷毀相關(guān)屬性)
beforeDestroy(銷毀前)destroyed(銷毀后)

以上生命周期常用的最常用的是mounted(掛載后) 前置數(shù)據(jù)的獲取處理在這里,因載入前dom并沒有渲染到頁面上母怜,我們需要操作dom時會獲取到undefined。

其次是destroyed(銷毀后)是saas中使用到的缚柏,用于組件中定時任務(wù)的清除苹熏。

數(shù)據(jù)綁定與渲染

1.{{xxx}}

模板寫法
例子 <h3>{{ message }}</h3>

2.v-bind:xxx

綁定內(nèi)容到html屬性中
例子 <h3 v-bind:class="xxx"></h3>
簡寫 <h3 :class="xxx"></h3>

3.v-model

雙向綁定
例子 <input v-model="xxx">

4.v-html

以html的形式在標(biāo)簽內(nèi)部渲染內(nèi)容
例子 <div v-html="xxx"></div>

5.v-show

是否顯示dom
例子 <div v-show="true||fasle"></div>

6.v-if,v-else

是否渲染dom
需要注意v-else永遠(yuǎn)跟隨前面一個v-if币喧,并且不提供else if功能
例子 <div v-if="boolean"></div><div v-else></div>

7.v-for

列表渲染
例子 <li v-for="(item, index) in list" :key="唯一標(biāo)識"></li>

事件處理

事件綁定 v-on:xxx
例子 <button v-on:click="changeColor">切換顏色</button>
簡寫 <button @click="changeColor">切換顏色</button>

事件綁定分為帶括號和不帶括號轨域,是否有括號對事件的影響是不同的,如下
<button @click="funcDemo">無括號</button>
<button @click="funcDemo($event)">有括號時傳入事件對象</button>
<button @click="funcDemo('arg1')">有括號傳參1</button>
<button @click="funcDemo('arg1', 'arg2')">有括號傳參2</button>
<button @click="funcDemoObj1({a:1,b:2,c:3})">傳入對象</button>
<button @click="funcDemoObj2({a:1,b:2,c:3})">傳入對象 解構(gòu)賦值</button>

當(dāng)參數(shù)傳入對象時杀餐,會因為接收方式的不同改變參數(shù)格式干发,如下
funcDemoObj1(obj){} 接收整個對象
funcDemoObj2({a, b, d = 4}){}只接收對象中的a和b,并聲明一個包含默認(rèn)值的屬性

有意思的是時間函數(shù)不管是否傳入$event在函數(shù)中都可以通過event獲取事件對象

組件注冊

全局注冊
Vue.component('component-a', { /* ... */ })

局部注冊
定義組件 var ComponentA = { /* ... */ }
然后在 components 選項中定義你想要使用的組件,如:components: { ComponentA }

Html中引入 <component-a></component-a> 或者 <ComponentA></ComponentA>在模塊化開發(fā)中當(dāng)組件不使用插槽時可直接作為自合閉標(biāo)簽來使用如<component-a/> 或者 <ComponentA/>史翘。
其中全大寫的寫法枉长,只能在模塊化開發(fā)中使用,同時也推薦在模塊化開發(fā)中使用琼讽,以便于我們能快速查找代碼位置與區(qū)分組件的來源”胤澹現(xiàn)在項目中,我們自己封裝或者二次封裝的組件就是使用的這種風(fēng)格钻蹬。

自定義組件

以下是一個公共基礎(chǔ)組件代碼的聲明

Vue.component('component-a', {
  props: ['title'],
  template: '<h3 @click="func">A Num:{{clickNum}} ------ {{title}} <slot></slot></h3>',
  data () {
    return {
      clickNum: 0
    }
  },
  watch: {
    clickNum: {
      handler(newV, oldV) {}
    }
  },
  // ...生命周期
  methods: { 
    func() {
      this.clickNum++
      this.$emit('callback', '組件A參數(shù)1', '組件A參數(shù)2')
    }
  }
})

在父組件中使用 <component-a title="xxx" ></component-a>

Props

父組件通過props向子組件傳遞數(shù)據(jù) 父組件中寫法<component-a title=”xxx”/>
上面的基礎(chǔ)組件代碼中的寫法是一個基礎(chǔ)寫法吼蚁,只包含了參數(shù)名稱
更加復(fù)雜嚴(yán)謹(jǐn)?shù)膶懛ㄈ缦拢?/p>

props: {
  // 限制類型
  a: Number,
  // 多個可能類型
  b: [String, Number],
  // 必填
  c: {
    type: String,
    required: true
  },
  // 帶有默認(rèn)值
  d: {
    type: Number,
    default: 100
  },
  // 對象默認(rèn)值
  e: {
    type: Object,
    default() {
      return { message: 'hello' }
    }
  }
}

其中必填和默認(rèn)值這兩項不需要同時存在選擇其一即可
Props是單向數(shù)據(jù)流綁定,子組件中通過$emit調(diào)用父組件暴露給子組件的函數(shù)進(jìn)行參數(shù)傳遞修改问欠。代碼如下:
父組件暴露函數(shù)給子組件:
<component-a title="xxx" @xxx=”()=>{}”></component-a>
子組件調(diào)用:
this.$emit('xxx')
this.$emit('xxx', ...參數(shù))

Template

是模板代碼書寫位置肝匆,寫法和html完全相同
當(dāng)使用模塊化開發(fā)時,此處代碼放到文件中的<template></template>標(biāo)簽中
<slot></slot>插槽:
子組件中需要的地方加入<slot></slot>即可在加入的位置渲染父組件調(diào)用子組件時在組件標(biāo)簽中寫入的內(nèi)容顺献。

Data

這里并不像之前的實列化Vue一樣是一個對象旗国,組件中的data必須一個函數(shù),每個實列化的組件單獨維護(hù)一份被返回對象滚澜,因此我們可以再同一個頁面中多次引入一個相同的組件而不會相互影響

Watch

以下是一個簡單的監(jiān)聽器代碼結(jié)構(gòu):

watch: {
  xxx(newValue, oldValue) {}
}

也可以這么寫:

watch: {
  xxx: {
    // 是數(shù)據(jù)改變時觸發(fā)的函數(shù)
    handler(newValue, oldValue) {}
  }
}

xxx是要監(jiān)聽的屬性名稱粗仓,如需監(jiān)聽對象中的某個屬性寫法為 'obj.xxx'字符串,如下:

watch: {
  'obj.xxx': {
    // 是數(shù)據(jù)改變時觸發(fā)的函數(shù)
    handler(newValue, oldValue) {}
  }
}
Methods

函數(shù)代碼位置嫁怀,函數(shù)中的this指向當(dāng)前實列對象设捐,因此可以再函數(shù)中通過this.xxx獲取所有當(dāng)前組件中的內(nèi)容

以下是包含上述內(nèi)容的dome

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div id="app">
      
      <h3>{{ message }}</h3>
      
      <input v-model="message" @change="funcDemo('change', message)" @focus="funcDemo('focus', message)">
      
      <h3 :class="color">顏色</h3>
      
      <div>
        <button v-on:click="changeColor">切換顏色</button>
        <br /><br />
        <button @click="funcDemo">無括號</button>
        <button @click="funcDemo($event)">傳入事件對象</button>
        <button @click="funcDemo('arg1')">傳參1</button>
        <button @click="funcDemo('arg1', 'arg2')">傳參2</button>
        <button @click="funcDemoObj1({a:1,b:2,c:3})">傳入對象</button>
        <button @click="funcDemoObj2({a:1,b:2,c:3})">傳入對象 解構(gòu)賦值</button>
        <br /><br />
      </div>
      
      <h3 v-html="html"></h3>
      
      <ul>
        <li v-for="(item, index) in list" :key="item">no:{{index}} val:{{item}}</li>
      </ul>
      
      <component-a title="組件1" @callback="funcDemo">插槽區(qū)域提示的內(nèi)容</component-a>
      <component-a title="組件2"></component-a>
      <component-b :a="3" b="字符串或者數(shù)字" c="必填項" d="改變默認(rèn)值" :e="{message: '改變對象默認(rèn)message的值'}"></component-b>
    </div>
    
  </body>
</html>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
  Vue.component('component-a', {
    props: ['title'],
    template: '<h3 @click="func">A Num:{{clickNum}} ------ {{title}} <slot></slot></h3>',
    data () {
      return {
        clickNum: 0,
      }
    },
    watch: {
      clickNum: {
        handler(newV, oldV) {
          console.log('clickNum oldV', oldV, 'clickNum newV', newV)
        }
      }
    },
    methods: { 
      func() {
        this.clickNum++
        this.$emit('callback', '組件A參數(shù)1', '組件A參數(shù)2')
      }
    }
  })
  
  var ComponentB = {
    props: {
      // 限制類型
      a: Number,
      // 多個可能類型
      b: [String, Number],
      // 必填
      c: {
        type: String,
        required: true
      },
      // 帶有默認(rèn)值
      d: {
         type: String,
         default: '默認(rèn)值'
      },
      // 對象默認(rèn)值
      e: {
        type: Object,
        // 對象或數(shù)組默認(rèn)值必須從一個工廠函數(shù)獲取
        default() {
          return { message: '對象中message' }
        }
      },
    },
    template: `<div>
      <h4>A:{{a}}</h4>
      <h4>B:{}</h4>
      <h4>C:{{c}}</h4>
      <h4>D:{fttfbhb}</h4>
      <h4>E:{{e.message}}</h4>
    </div>`,
    data() {
      return {}
    }
  }
  
  var App = new Vue({
    el: '#app',
    components: {ComponentB},
    data: {
      color: 'red',
      message: 'Hello Vue!',
      html: '<span class="blue">這是一端藍(lán)色文字的html渲染</span>',
      list: ['a','b','c']
    },
    mounted() {
      console.log('mounted...')
    },
    methods: {
      changeColor() {
        if (this.color == 'blue') {
          this.color = 'red'
        } else {
          this.color = 'blue'
        }
      },
      funcDemo(arg1, arg2 = '默認(rèn)的值2') {
        console.log('參數(shù)1', arg1, '參數(shù)2', arg2)
      },
      funcDemoObj1(obj) {
        console.log('參數(shù)', obj)
      },
      funcDemoObj2({a, b, d = 4}) {
        console.log('參數(shù)a', a ,'參數(shù)b', b, '參數(shù)d', d)
      }
    }
  })
</script>
<style>
  .red {
    color: red;
  }
  .blue {
    color: blue;
  }
</style>

框架搭建整體流程

點擊下載步驟 1-7 配置完成的完整 Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萝招,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子存捺,更是在濱河造成了極大的恐慌槐沼,老刑警劉巖曙蒸,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岗钩,居然都是意外死亡纽窟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門兼吓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臂港,“玉大人,你說我怎么就攤上這事视搏∩竽酰” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵浑娜,是天一觀的道長佑力。 經(jīng)常有香客問我,道長筋遭,這世上最難降的妖魔是什么打颤? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮漓滔,結(jié)果婚禮上瘸洛,老公的妹妹穿的比我還像新娘。我一直安慰自己次和,他們只是感情好反肋,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踏施,像睡著了一般石蔗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畅形,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天养距,我揣著相機(jī)與錄音,去河邊找鬼日熬。 笑死棍厌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竖席。 我是一名探鬼主播耘纱,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毕荐!你這毒婦竟也來了束析?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤憎亚,失蹤者是張志新(化名)和其女友劉穎员寇,沒想到半個月后弄慰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蝶锋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年陆爽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扳缕。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡墓陈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出第献,到底是詐尸還是另有隱情贡必,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布庸毫,位于F島的核電站仔拟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏飒赃。R本人自食惡果不足惜利花,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望载佳。 院中可真熱鬧炒事,春花似錦、人聲如沸蔫慧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑躲。三九已至睡扬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黍析,已是汗流浹背卖怜。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留阐枣,地道東北人马靠。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蔼两,于是被迫代替她去往敵國和親甩鳄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 一宪哩、Vue2 1.1 模板語法 1.1.1 模板的理解 html 中包含了一些 JS 語法代碼娩贷,語法分為兩種第晰,分別...
    Cola_Mr閱讀 500評論 0 1
  • 標(biāo)簽(空格分隔): 聽課 一锁孟、vuejs及相關(guān)工具介紹 1.1 學(xué)習(xí)收獲 了解一個中度復(fù)雜規(guī)模的應(yīng)用開發(fā) 掌握Vu...
    lvyweb閱讀 271評論 2 0
  • #vue2筆記 ##腳手架文件結(jié)構(gòu) ├──node_modules ├──public │├──favicon.i...
    Daydream_許多閱讀 421評論 0 0
  • 初識Vue2.0 想讓Vue工作彬祖,就必須創(chuàng)建一個Vue實例,且要傳入一個配置對象 vue容器里的代碼依然符合htm...
    Zindex閱讀 398評論 0 0
  • 前言 您將在本文當(dāng)中了解到,往網(wǎng)頁中添加數(shù)據(jù),從傳統(tǒng)的dom操作過渡到數(shù)據(jù)層操作,實現(xiàn)同一個目標(biāo),兩種不同的方式....
    itclanCoder閱讀 25,741評論 1 12