Vue基礎二之全域性API、例項屬性和全域性配置,以及元件進階(mixins)的詳細教程(案列實現,詳細圖解,附原始碼)
前言
本篇隨筆主要講解Vue中的全域性API、例項屬性和全域性配置,以及元件進階的基礎知識,作為自己對Vue框架基礎語法知識的總結與筆記。
因內容有案例解讀,程式碼實現,導致篇幅稍長,大約3分鐘可以瀏覽完,如有幫助的話(請筆友耐心看完)
長話不說,直接進入正題......
案例實現模版:
以下案例均是基於此模版實現的(以第一個案例為例)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>模版</title> 6<script src="vue.js"></script> 7 </head> 8 <body> 9 10 <!-- 以下是第一個小案例 --> 11 <div id="app"> 12 <input type="text" v-focus="true"> 13 </div> 14 <script> 15 Vue.directive('focus', { 16 inserted (el, binding) { 17 if(binding.value) { 18 el.focus() 19 } 20 } 21 }) 22 var vm = new Vue({ el: '#app' }) 23 </script> 24 25 26 </body> 27 </html>
一、全域性API
全域性API並不在構造器裡,而是先宣告全域性變數或者直接在Vue上定義一些新功能,Vue內建了一些全域性API。說的簡單些就是,在構造器外部用Vue提供給我們的API函式來定義新的功能。
1.Vue.directive
用來註冊自定義指令,對低階DOM元素進行訪問,為DOM元素新增新的特性。
案例:自定義註冊指令v-focus。
1.1 實現步驟
- 定義根標籤div。
- 控制input文字框是否自動獲得焦點。
1.2 程式碼實現
1 <div id="app"> 2 <input type="text" v-focus="true"> 3 </div> 4 <script> 5 Vue.directive('focus', { 6 inserted (el, binding) { 7 if (binding.value) { 8 el.focus() 9 } 10 } 11 }) 12 var vm = new Vue({ el: '#app' }) 13 </script>
1.3 效果展示
2.Vue.use
Vue.use主要用於在Vue中安裝外掛,通過外掛可以為Vue新增全域性功能。外掛可以是一個物件或函式,如果是物件,必須提供install()方法,用來安裝外掛;如果是一個函式,則該函式將被當成install()方法。
2.1 實現步驟
- 建立vm例項
- 定義外掛
- 使用外掛
2.2 程式碼實現
1 <div id="app" v-my-directive></div> 2 <script> 3 // 定義一個MyPlugin(自定義外掛)物件 4 let MyPlugin = {} 5 // 編寫外掛物件的install方法 6 MyPlugin.install = function (Vue, options) { 7 console.log(options) 8 // 在外掛中為Vue新增自定義指令 9 Vue.directive('my-directive', { 10 bind (el, binding) { 11 // 為自定義指令v-my-directive繫結的DOM元素設定style樣式 12 el.style = 'width:100px;height:100px;background-color:#ccc;' 13 } 14 }) 15 } 16 Vue.use(MyPlugin, { someOption: true }) 17 var vm = new Vue({ 18 el: '#app' 19 }) 20 // var Vue = require('Vue') 21 // var vueRouter = require('vue-router') 22 // Vue.use(vueRouter) 23 </script>
2.3 效果展示
PS:
Vue.js官方提供的一些外掛(如vue-router)在檢測到 Vue 是可訪問的全域性變數時,會自動呼叫 Vue.use()。但是在CommonJS等模組環境中,則始終需要Vue.use()顯式呼叫。
3.Vue.extend
Vue.extend用於基於Vue構造器建立一個Vue子類,可以對Vue構造器進行擴充套件。它有一個options引數,表示包含元件選項的物件。
3.1 實現步驟
- 頁面結構
- 建立子類Vue2
3.2 程式碼實現
1 <div id="app1">app1: {{title}}</div> 2 <div id="app2">app2: {{title}}</div> 3 <script> 4 var Vue2 = Vue.extend({ 5 data () { 6 return { title: 'hello' } 7 } 8 }) 9 var vm1 = new Vue({ el: '#app1' }) 10 var vm2 = new Vue2({ el: '#app2' }) 11 </script>
3.3 效果展示
4.Vue.set
Vue的核心具有一套響應式系統,簡單來說就是通過監聽器監聽資料層的資料變化,當資料改變後,通知檢視也自動更新。
Vue.set用於向響應式物件中新增一個屬性,並確保這個新屬性同樣是響應式的,且觸發檢視更新。
4.1 實現步驟
- 頁面結構
- 建立vm物件動態設定屬性b
4.2 程式碼實現
1 <div id="app"> 2 <div>{{a}}</div> 3 <div>{{obj.b}}</div> 4 </div> 5 <script> 6 var vm = new Vue({ 7 el: '#app', 8 data: { 9 a: '我是根級響應式屬性a', 10 obj: {} 11 } 12 }) 13 Vue.set(vm.obj, 'b', '我是Vue.set新增的響應式屬性obj.b') 14 </script>
4.3 效果展示
5.Vue.mixin
Vue.mixin用於全域性註冊一個混入,它將影響之後建立的每個Vue例項。該介面主要是提供給外掛作者使用,在外掛中向元件注入自定義的行為。該介面不推薦在應用程式碼中使用。
案例:Vue.mixin用於全域性註冊一個混入( Mixins ),實現外掛功能。
5.1 實現步驟
- myOption是一個自定義屬性。
- 使用Vue.mixin
5.2 程式碼實現
1 <div id="app"></div> 2 <script> 3 Vue.mixin({ 4 created () { 5 var myOption = this.$options.myOption 6 if (myOption) { 7 console.log(myOption.toUpperCase()) 8 } 9 } 10 }) 11 var vm = new Vue({ 12 myOption: 'hello vue!' 13 }) 14 </script>
5.3 效果展示
二、例項屬性
1.vm.$props
使用vm.$props屬性可以接收上級元件向下傳遞的資料。
案例:通過$props實現手機資訊搜尋。
1.1 實現步驟
- 定義唯一根標籤div。
- 定義父元件模板。
- 定義子元件模板。
- 註冊父元件my-parent。
- 註冊子元件my-child。
- 在子元件的data中定義手機的資料資訊。
- 在子元件的data中定義props用來接收name的值。
- 如果獲取到name值就查詢手機資訊,否則返回。
- 通過forEach()方法對手機資料進行查詢操作。
1.2 程式碼實現
1 <div id="app"> 2 <!-- 父元件 --> 3 <my-parent></my-parent> 4 </div> 5 6 <!-- 父元件模板 --> 7 <template id="parent"> 8 <div> 9 <h3>手機資訊搜尋</h3> 10 手機品牌:<input type="text" v-model="brand"> 11 <!-- 子元件 --> 12 <my-child v-bind:name="brand"></my-child> 13 </div> 14 </template> 15 16 <!-- 子元件模板 --> 17 <template id="child"> 18 <ul> 19 <li>手機品牌:{{show.brand}}</li> 20 <li>手機型號:{{show.type}}</li> 21 <li>市場價格:{{show.price}}</li> 22 </ul> 23 </template> 24 25 <script> 26 Vue.component('my-parent', { 27 template: '#parent', 28 data () { 29 return { 30 brand: '' 31 } 32 } 33 }) 34 Vue.component('my-child', { 35 template: '#child', 36 data () { 37 return { 38 content: [ 39 {brand: '華為', type: 'Mate20', price: 3699}, 40 {brand: '蘋果', type: 'iPhone7', price: 2949}, 41 {brand: '三星', type: 'Galaxy S8+', price: 3299}, 42 {brand: 'vivo', type: 'Z5x', price: 1698}, 43 {brand: '一加', type: 'OnePlus7', price: 2999}, 44 {brand: '360', type: 'N7 Pro', price: 1099}, 45 {brand: 'oppo', type: 'Reno', price: 2599} 46 ], 47 show: {brand: '', type: '', price: ''} 48 } 49 }, 50 props: ['name'], 51 watch: { 52 name () { 53 if (this.$props.name) { 54 var found = false 55 this.content.forEach((value, index) => { 56 if (value.brand === this.$props.name) { 57 found = value 58 } 59 }) 60 this.show = found ? found : {brand: '', type: '', price: ''} 61 } else { 62 return 63 } 64 } 65 } 66 }) 67 var vm = new Vue({ 68 el: '#app', 69 data: {} 70 }) 71 </script>
1.3 效果展示
2.vm.$options
Vue例項初始化時,除了傳入指定的選項外,還可以傳入自定義選項。自定義選項的值可以是陣列、物件、函式等,通過vm.$options來獲取。
2.1 實現步驟
- 定義根標籤
- 建立vm例項
- 在vm例項配置物件中新增$options。
2.2 程式碼實現
1 <div id="app"> 2 <p>{{base}}</p> 3 <p>{{noBase}}</p> 4 </div> 5 <script> 6 var vm = new Vue({ 7 el: '#app', 8 customOption: '我是自定義資料', 9 data: { 10 base: '我是基礎資料' 11 }, 12 created () { 13 this.noBase = this.$options.customOption 14 } 15 }) 16 </script>
2.3 效果展示
3.vm.$el
vm.$el用來訪問vm例項使用的根DOM元素
3.1 實現步驟
- 定義根標籤
- 修改內容
3.2 程式碼實現
1 <div id="app"> 2 <p>我是根標籤結構</p> 3 </div> 4 <script> 5 var vm = new Vue({ 6 el: '#app' 7 }) 8 vm.$el.innerHTML = '<div>我是替換後的div標籤</div>' 9 </script>
3.3 效果展示
4.vm.$children
該屬性只針對vue元件,與js中childNodes還是有區別的。
$children: 獲取子元件例項集合。
childNodes: 獲取子節點集合。
4.1 實現步驟
- 定義根標籤
- 定義子元件
- 獲取子元件
4.2 程式碼實現
1 <div id="app"> 2 <button @click="child">檢視子元件</button> 3 <my-component></my-component> 4 </div> 5 <script> 6 Vue.component('my-component', {template: '<div>myComponent</div>'}) 7 var vm = new Vue({ 8 el: '#app', 9 methods: { 10 child () { 11 console.log(this.$children) 12 } 13 } 14 }) 15 </script>
4.3 效果展示
5.vm.$root
vm.$root用來獲取當前元件樹的根Vue例項,如果當前例項沒有父例項,則獲取到的是該例項本身。
5.1 實現步驟
- 建立vm例項
- 獲取根Vue例項
5.2 程式碼實現
1 <div id="app"> 2 <my-component></my-component> 3 </div> 4 <script> 5 Vue.component('my-component', { 6 template: '<button @click="root">檢視根例項</button>', 7 methods: { 8 root () { 9 console.log(this.$root) 10 console.log(this.$root === vm.$root) 11 } 12 } 13 }) 14 var vm = new Vue({ el: '#app' }) 15 </script>
5.3 效果展示
6.vm.$slots
Vue中的元件中使用template模板定義HTML結構,為了方便使用template公共模板結構。
Vue提出了插槽(Slots)的概念,插槽就是定義在元件內部的template模板,可以通過$slots動態獲取。
案例一:通過<slot></slot>展示元件中的內容。
6.1 實現步驟
- 定義元件模板
- 註冊my-component元件
- 通過v-slot定義插槽物件。
6.2 程式碼實現
1 <div id="app"> 2 <my-component>你好</my-component> 3 </div> 4 5 <template id="first"> 6 <div> 7 <slot></slot> 8 </div> 9 </template> 10 11 <script> 12 Vue.component('my-component', { template: '#first' }) 13 var vm = new Vue({ el: '#app' }) 14 </script>
6.3 效果展示
案例二:通過v-slot定義插槽物件。
6.4 實現步驟
- 定義元件模板。
- 註冊my-component元件和列印插槽物件的文字內容。
6.5 程式碼實現
1 <div id="app"> 2 <my-component>你好 3 <template v-slot:second> 4 <div>內部結構</div> 5 </template> 6 </my-component> 7 </div> 8 9 <template id="first"> 10 <div> 11 <slot></slot> 12 <slot name="second"></slot> 13 </p> 14 </template> 15 16 <script> 17 Vue.component('my-component', { template: '#first' }) 18 var vm = new Vue({ el: '#app' }) 19 // 在控制檯檢視插槽內容 20 console.log(vm.$children[0].$slots.second[0].children[0].text) 21 </script>
6.6 效果展示
7.vm.$attrs
vm.$attrs可以獲取元件的屬性,但其獲取的屬性中不包含class、style以及被宣告為props的屬性。
7.1 實現步驟
- 定義id屬性
- 檢視id屬性
7.2 程式碼實現
1 <div id="app"> 2 <my-component id="test"></my-component> 3 </div> 4 <script> 5 Vue.component('my-component', { 6 template: '<button @click="showAttrs">檢視屬性</button>', 7 methods: { 8 showAttrs () { 9 console.log(this.$attrs) 10 } 11 } 12 }) 13 var vm = new Vue({ el: '#app' }) 14 </script>
7.3 效果展示
三、全域性配置
1.productionTip
開啟或關閉生產資訊提示資訊,預設為開啟狀態。
1.1 實現步驟
- 設定屬性值為false,表示關閉生產資訊提示資訊。
- 重新整理瀏覽器頁面,檢視執行結果。
1.2 程式碼實現
1 <script> 2 Vue.config.productionTip = false 3 </script>
1.3 效果展示
2.silent
silent可以取消Vue日誌和警告,silent預設值為false,開啟警告功能。
2.1 實現步驟
- silent的值設定為true,可以取消Vue日誌和警告。
2.2 程式碼實現
1 <div id="app">{{msg}}</div> 2 <script> 3 Vue.config.silent = true 4 var vm = new Vue({ el: '#app' }) 5 </script>
2.3 效果展示
3.devtools
表示開啟或關閉vue-devtools除錯工具,預設值為true,表示vue-devtools工具可用。
3.1 實現步驟
- devtools的值設定為false,關閉vue-devtools功能。
- 重新整理瀏覽器頁面,檢視執行結果。
3.2 程式碼實現
1 <script> 2 Vue.config.devtools = false 3 </script>
3.3 效果展示
重新整理瀏覽器頁面
四、元件進階
1.mixins
mixins是一種分發Vue元件中可複用功能的方式。
mixins物件可以包含任何元件選項,將定義的mixins物件引入元件中即可使用,mixins中的所有選項將會混入到元件自己的選項中。
1.1 實現步驟
- 定義myMixin物件
- 配置mixins選項
1.2 程式碼實現
1 <script> 2 // 定義myMixin物件 3 var myMixin = { 4 created () { 5 this.hello() 6 }, 7 methods: { 8 hello () { 9 console.log('hello from mixin!') 10 } 11 } 12 } 13 var Component = Vue.extend({ 14 mixins: [myMixin] 15 }) 16 var component = new Component() 17 </script>
1.3 效果展示
2.render
在Vue中可以使用Vue.render()實現對虛擬DOM的操作。在Vue中一般使用template來建立HTML,但這種方式可程式設計性不強,而使用Vue.render()可以更好地發揮JavaScript的程式設計能力。
2.1 實現步驟
- 定義根標籤
- 渲染頁面結構
- 使用render()函式
2.2 程式碼實現
1 <div id="app"> 2 <my-component>成功渲染</my-component> 3 </div> 4 <script> 5 Vue.component('my-component', { 6 render (createElement) { 7 return createElement('p', { 8 style: { 9 color: 'red', 10 fontSize: '16px', 11 backgroundColor: '#eee' 12 } 13 }, this.$slots.default) 14 } 15 }) 16 var vm = new Vue({ el: '#app' }) 17 </script>
2.3 效果展示
3.createElement
createElement()函式返回的並不是一個實際的DOM元素,它返回的其實是一個描述節點(createNodeDescription)。
- 第1個引數可以是一個HTML標籤名或元件選項物件。
- 第2個引數是可選的,可以傳入一個與模板中屬性對應的資料物件。
- 第3個引數是由createElement()構建而成的子級虛擬節點,也可以使用字串來生成文字虛擬節點。
案例:使用render()函式渲染頁面結構。
3.1 實現步驟
- 定義插槽
- 建立vm例項物件
- 使用createElement()函式建立header、content和footer元素。
3.2 程式碼實現
1 <div id="app"> 2 <my-component> 3 <template v-slot:header> 4 <div style="background-color:#ccc;height:50px"> 5 這裡是導航欄 6 </div> 7 </template> 8 <template v-slot:content> 9 <div style="background-color:#ddd;height:50px"> 10 這裡是內容區域 11 </div> 12 </template> 13 <template v-slot:footer> 14 <div style="background-color:#eee;height:50px"> 15 這裡是底部資訊 16 </div> 17 </template> 18 </my-component> 19 </div> 20 <script> 21 Vue.component('my-component', { 22 render (createElement) { 23 return createElement('div', [ 24 createElement('header', this.$slots.header), 25 createElement('content', this.$slots.content), 26 createElement('footer', this.$slots.footer) 27 ]) 28 } 29 }) 30 var vm = new Vue({ el: '#app' }) 31 </script>
3.3 效果展示
總結:
以上便是本篇文章所寫的關於Vue.directive()、Vue.use()等常用全域性API的使用,vm.$props、vm.$options、vm.$slots等例項屬性的使用,以及Vue全域性配置、元件的mixins、元件中渲染函式的使用。
通過以上的學習,各位·筆友應能夠熟練使用Vue完成一些簡單的頁面操作。
碼字不易,覺得樓主寫的還不錯,對你有幫助的話,請給個三連(關注、點贊、收藏)另外有問題可評論區留言討論。
後期會完善Vue進階語法的相關知識,有幫助的話,敬請關注樓主持續更新中ing 。。。(不定時發文)
轉載時請註明出處連結
參考文件:
1.vue官方文件:Vue.js (vuejs.org)
2.傳智播客-黑馬程式設計師(教材):http://stu.ityxb.com/
其他隨筆推薦:
1. Vue開發環境的部署:https://www.cnblogs.com/zbcxy506/p/zbcxy506_1vue-01.html
2. Vue基礎入門一:https://www.cnblogs.com/zbcxy506/p/zbcxy506_1vue-02.html