置身世外只爲暗中觀察!!!Hello你們好,我是魔王哪吒!重學鞏固你的Vuejs知識體系,若是有哪些知識點遺漏,還望在評論中說明,讓我能夠及時更新本篇內容知識體系。歡迎點贊收藏!javascript
談談你對MVC、MVP和MVVM的理解?css
https://github.com/webVueBlog...html
什麼是組件化,Vue組件化開發思想前端
axios的使用
vuejs原理相關:響應式原理,源碼。vue
對於基礎知識須要掌握,簡單寫寫✍java
直接CDN引入:node
代碼:<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
webpack
代碼:<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
ios
代碼:git
# 最新穩定版 $ npm install vue
聲明式編程:
代碼:
<!DOCTYPE html> <!-- 魔王哪吒 --> <html> <head> <meta charset="utf-8"> <title></title> <script src="vue.js" type="text/javascript" charset="UTF-8"></script> <!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> --> </head> <body> <div id="app"> {{ a }} </div> <script type="text/javascript"> // 咱們的數據對象 var data = { a: 1 }; // 該對象被加入到一個 Vue 實例中 var vm = new Vue({ el: "#app", data: data }); // data.a = "dada" vm.a = "qianduan"; data.a == vm.a; </script> </body> </html>
methods
,該屬性是用於Vue
對象中定義的方法。@click
,該指令是用於監聽某個元素的點擊事件,而且須要指定當發生點擊時,執行的方法。代碼:
<div id="app"> <h1>當前計數{{counter}}</h1> <button @click="increment">+</button> <button @click="decrement">-</button> </div> <script src="../js/vue.js"></script> <script> let app = new Vue({ el: '#app', data: { counter: 0 }, methods: { increment(){ this.counter++ }, decrement(){ this.counter-- }, } }) </script>
MVVM的思想
它們之間是如何工做的呢?
el
:類型:string | HTMLElement
DOM
data
:類型:Object | Function
methods
:類型:{[key:string]:Function}
生命週期:☞ 事物從誕生到消亡的整個過程
release
穩定版本debug
版本v-once
指令的使用
<div id="app"> <h1>{{message}}</h1> <h2 v-once>{{message}}</h2> </div>
v-once
:
v-html
:
當咱們從服務器請求到的數據自己就是一個HTML代碼時
{{}}
來輸出,會將HTML
格式進行解析,而且顯示對應的內容。v-html
指令string
類型string
的html
解析處理而且進行渲染<h1 v-html="url"></h1>
v-text
的做用和Mustache
比較類似,獨使用於將數據顯示在界面中,通常狀況下,接受一個string
類型。
<div id="app"> <h2 v-text="message"></h2> <h2>{{message}}</h2> </div> <script src="../js/vue.js"></script> <script> let vm = new Vue({ el: '#app', data: { message: '你好' } }) </script>
v-pre
用於跳過這個元素和它子元素的編譯過程,用於顯示本來的Mustache
語法。
<div id="app"> <p v-pre>{{message}}</p> </div> <script src="../js/vue.js"></script> <script> let app = new Vue({ el: '#app', data: { message: 'hello' } }) </script>
v-cloak
斗篷的意思。
<div id="app"> <h2 v-cloak>hello{{name}}</h2> </div> <script> setTimeout(()=>{ let app = new Vue({ el: '#app', data: { name: 'web' } }) },10000) </script> <style> [v-cloak] { display: none; } </style>
v-bind
用於綁定一個或多個屬性值,或者向另外一個組件傳遞props
值。
<div id="app"> <a v-bind:href="link">vuejs</a> <img v-bind:src="url" alt=""> </div> <script> let app = new Vue({ el: '#app', data: { } })
v-bind
語法糖
v-bind
有一個對應的語法糖,就是簡寫方式
<div id = "app"> <a :href="link">vuejs</a> <img :src="longURL" alt=""> </div>
v-bind
動態綁定class
<style> .active{ color: red; } </style> <div id="app"> <h1 class="active">{{message}}</h2> </div> <script> const app = new Vue({ el: '#app', data: { message: 'hello' } }) </script>
綁定class
有兩種方式:
對象語法:
用法一:直接經過{}綁定一個類 <h2 :class="{'active': isActive}">hello</h2> 用法二,傳入多個值 <h2 :class="{'active': isActive, 'line': isLine}">hello</h2> 用法三: <h2 class="title" :class="{'active': isActive}"></h2> 用法四: 能夠放在一個methods或者computed中 <h2 class="title" :class="classes">hello</h2>
v-bind
動態綁定class,數組語法
<div id="app"> <h2 class="title" :class="[active, line]">{{mesg}}</h2> <h2 class="title" :class="getClasses()">{{mesg}}</h2> </div> <script> const app = new Vue({ el: '#app', data: { message: 'hello', active: 'aaa', line: 'bbb', }, methods: { getClasses: function() { return [this.active, this.line] } } }) </script>
v-bind
動態綁定style
對象語法和數組語法兩種綁定。
綁定方法:對象語法:
:style="{ color: currentColor, fontSize: fontSize + 'px' }"
style
後面跟的是一個對象類型,對象的key
是css
屬性名稱,對象的value
是具體賦的值,值能夠來自於data
中的屬性。
綁定方法:數組語法:
<div v-bind:style="[baseStyles, overStyles]"></div>
style
後面跟的是一個數組的類型,多個值,分割便可。
計算屬性,寫在實例的computed
選項中:
<div id="app"> <h2>{{firstName}}{{lastName}}</h2> </div> <script> const vm = new Vue({ el: '#app', data: { firstName: 'web', lastName: 'it', } }) </script>
<div id="app"> <h2>{{fullName}}</h2> </div> <script> const vm = new Vue({ el: '#app', data: { firstName: 'jeskson', lastName: 'it', }, computed: { fullName() { return this.firstName + ' ' + this.lastName } } }) </script>
計算屬性的緩存:
爲何使用計算屬性這個東西?
緣由:計算屬性會進行緩存,若是屢次使用時,計算屬性只會調用一次。
每一個計算屬性都包含一個getter和一個setter
<div id="app"> <div>{{fullName}}</div> <div>{{firstName}}</div> <div>{{lastName}}</div> </div> <script> let vm = new Vue({ el: '#app', data: { firstName: 'web', lastName: 'it', }, computed: { fullName: { get() { rturn this.firstName+" "+this.lastName }, set(newValue){ const names = newValue.split(' ') this.firstName = names[0] this.lastName = names[1] } } } }) </script>
computed: { fullName: function() { return this.firstName+" "+this.lastName } // 計算屬性通常是沒有set方法,只讀屬性。 fullName: { get: function() { return this.firstName + " " + this.lastName } } }
const的使用,在JavaScript中使用const修飾的標識符爲常量,不能夠再次賦值。
在es6開發中,優先使用const,只有須要改變一個標識符的時候才使用let。
在使用cost定義標識符,必須進行賦值。
常量的含義是指向的對象不能修改,可是能夠改變對象內部的屬性。
何時使用const呢?
當咱們修飾的標識符不會被再次賦值時,就可使用const來保證數據的安全性。
const的使用:
const a=20; a = 10; // 錯誤:不能夠修改 const name; // 錯誤,const修飾的標識符必須賦值
let和var
塊級做用域:
JS中使用var來聲明一個變量,變量的做用域主要是和函數的定義有關。
對於其餘塊定義來講是沒有做用域的,好比if/for等,開發中每每會引起一些問題。
// 監聽按鈕的點擊 var btns = document.getElementsByTagName('button'); for(var i=0; i<btns.length; i++) { (function(i){ btns[i].onclick = function(){ alert('點擊了'+i+"個") } })(i) }
let btns = document.getElementsByTagName('button'); for(let i=0;i<btns.length;i++){ btns[i].onclick = function(){ alert('點擊了'+i+'個') } }
變量做用域:變量在什麼範圍內是可用的。
var func; if(true) { var name = 'web'; func = function() { console.log(name); // web } func(); // web } // name = 'it' func(); // web -> it console.log(name); // web -> it
沒有塊級做用域引發的問題,for的塊級
var btns = document.getElementsByTagName('button'); for(var i=0; i<btns.length; i++) { btns[i].addEventListener('click', function(){ console.log('第'+i+'個按鈕被點擊'); }) }
閉包:
var btns = document.getElementsByTagName('button'); for(var i=0; i<btns.length;i++){ (function(i){ btns[i].addEventListener('click', function(){ console.log('第'+i+'個按鈕'); }) })(i) }
爲何閉包能夠解決問題,由於函數是一個做用域。
屬性初始化簡寫和方法的簡寫:
// 屬性的簡寫 // es6前 let name = 'web' let age = 12 let obj1 = { name: name, age: age, } console.log(obj1); // es6後 let obj2 = { name, age } console.log(obj2)
// 方法的簡寫 // es6以前 let obj1 = { test: function() { console.log('obj1') } } obj1.test(); // es6後 let obj2 = { test() { console.log('obj2') } } obj2.test();
v-on:click="counter++"
<div id="app"> <h2>點擊次數:{{counter}}</h2> <button v-on:click="counter++">按鈕點擊</button> <button v-on:click="btnClick">按鈕點擊2</button> </div> let app = new Vue({ el: '#app', data: { counter: 0 }, methods: { btnClick(){ this.counter++ } } })
v-on修飾符的使用
<div id="app"> <div @click="divClick"> web <button @click.stop="btnClick">按鈕</button> </div>
Vue提供了一些修飾符:
.stop 調用event.stopPropagation() .prevent 調用event.preventDefault() .native 監聽組件根元素的原生事件 .once 只觸發一次回調
// 中止冒泡 <button @click.stop="doThis"></button> // 阻止默認行爲 <button @click.prevent="doThis"></button> // 阻止默認行爲,沒有表達式 <form @submit.prevent></form> // 串聯修飾符 <button @click.stop.prevent = "doThis"></button> // 鍵修飾符,鍵別名 <input @keyup.enter="onEnter"> // 鍵修飾符,鍵代碼 <input @keyup.13="onEnter"> // 點擊回調智慧觸發一次 <button @click.once="doThis"></button>
簡單使用:
<div id="app"> <p v-if="score>=90">優秀</p> <p v-else-if="score>=80">良好</p> <p v-else-if="score>=60">及格</p> <p v-else="score<60">不及格</p> </div>
登陸切換:
<div id="app"> <span v-if="type==='username'"> <label>用戶帳號:</label> <input placeholder="用戶帳戶"> </span> <span v-else> <label>郵箱地址:</label> <input placeholder="郵箱地址"> </span> <button @click="handleToggle">切換類型</button> </div> <script> let app = new Vue({ el: '#app', data: { type: 'username' }, methods: { handleToggle(){ this.type = this.type === 'email' ? 'username' : 'email' } } }) </script>
<div id="app"> <span v-if="isUser"> <label for="username">用戶帳戶</label> <input type="text" id="username" placeholder="用戶帳戶"> </span> <span v-else> <label for="email">用戶郵箱</label> <input type="text" id="email" placeholder="用戶郵箱"> </span> <button @click="isUser=!isUser">切換類型</button> </div> <script> const app = new Vue({ el: '#app', data: { isUser: true } }) </script>
<div id="app"> <ul> <li v-for="(value, key, index) in info"> {{value}}-{{key}}-{{index}} </li> </ul> </div> <script> let app = new Vue({ el: '#app', data: { info: { name: 'web', age: 12, } } }) </script>
使用v-for時,給對應的元素或組件添加上一個:key
屬性。
key的做用主要是爲了高效的更新虛擬dom。
數組中哪些方法是響應式的
push() pop() 刪除數組中的最後一個元素 shift() 刪除數組中的第一個元素 unshift() 在數組最前面添加元素 splice() sort() reverse()
<div id="app"> <table> <thead> <tr> <th></th> <th>書籍名稱</th> <th>出版日期</th> <th>價格</th> <th>購買數量</th> <th>操做</th> </tr> </thead> <tbody> <tr v-for="item in books"> <td v-for="value in item">{{value}}</td> </tr> </tbody> </table> </div>
vue中使用v-model指令來實現表單元素和數據的雙向綁定。
<div id="app"> <input type="text" v-model="message"> <h2>{{message}}</h2> </div>
reduce做用對數組中全部的內容進行彙總。
JavaScript reduce() 方法
var numbers = [65, 44, 12, 4]; function getSum(total, num) { return total + num; } function myFunction(item) { document.getElementById("demo").innerHTML = numbers.reduce(getSum); }
定義和用法
reduce() 方法接收一個函數做爲累加器,數組中的每一個值(從左到右)開始縮減,最終計算爲一個值。
reduce() 能夠做爲一個高階函數,用於函數的 compose。
注意:
reduce()
對於空數組是不會執行回調函數的。
語法
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
<input type="text" :value="message" @input="message = $event.target.value"> <script> const app = new Vue({ el: '#app', data: { message: '你好啊' }, methods: { valueChange(event){ this.message = event.target.value; } } }) </script>
v-model
是語法糖,本質:
v-bind
綁定一個value
屬性v-on
指令給當前元素綁定input
事件代碼:
<input type="text" v-model="message"> <input type="text" v-bind:value="message" v-on:input="message = $event.target.value">
複選框分爲兩種狀況,單個勾選框和多個勾選框。
單個勾選框:
v-model
即爲布爾值。input
的value
並不影響v-model
的值。
多個複選框:
當是多個複選框時,對應的data
中屬性是一個數組。
當選中某一個時,就會將input
的value
添加到數組中。
<div id="app"> <label for="check"> <input type="checkbox" v-model="checked" id="check">贊成協議 </label> <label><input type="checkbox" v-model="hobbies" value="籃球">籃球</label> <label><input type="checkbox" v-model="hobbies" value="檯球">檯球</label> </div>
select
分單選和多選兩種狀況
單選:只能選中一個值,多選:能夠選擇多個值。
v-model
結合select
類型和checkbox
同樣,select
分單選和多選兩種狀況。
單選,只能選擇一個值,v-model
綁定的是一個值。當咱們選中option
中的一個時,會將它對應的value
賦值到mySelect
中。
多選,能夠選中多個值。v-model
綁定的是一個數組。當選中多個值時,就會將選中的option
對應的value
添加到數組mySelects
中。
// 選擇一個值 <select v-model="mySelect"> <option value="web">web</option> <option value="it">it</option> </select> <p>您最喜歡的{{mySelect}}</p> // 選擇多個值 <select v-model="mySelects" multiple> <option value="web">web</option> <option value="it">it</option> </select> <p>您最喜歡的{{mySelects}}</p>
<label v-for="item in origin"> <input type="checkbox" :value="item" v-model="hobbies"> {{item}} </label>
lazy
修飾符:
v-model
默認是在input
事件中同步輸入框的數據的。data
中的數據就會自動發生改變。lazy
修飾符可讓數據在失去焦點或者回車時纔會更新。number
修飾符:
number
修飾符可讓在輸入框中輸入的內容自動轉成數字類型。trim
修飾符:
trim
修飾符能夠過濾內容左右兩邊的空格示例:
<div id="app"> <input type="text" v-model.lazy="message"> <h2>{{message}}</h2> </div>
註冊組件的基本步驟:
示例:
調用Vue.extend()方法建立組件構造器 調用Vue.component()方法,註冊組件 在Vue實例的做用範圍內使用組件
組件示例:
<div id="app"> <my-cpn></my-cpn> </div> <script src="../js/vue.js"></script> <script> // 建立組件構造器 const myComponent = Vue.extend({ template: ` <div> <h2>組件標題</h2> <p>組件段落</p> </div>` }); // 註冊組件 Vue.component('my-cpn',myComponent); </script>
Vue.extend()
調用Vue.extend()
建立一個組件構造器。template
表明咱們自定義組件的模板。html
代碼。Vue2.x
的文檔幾乎看不到了。Vue.component()
是將剛纔的組件構造器註冊爲一個組件,而且給它起一個組件的標籤名稱。示例:
組件標題 <div id="app"> <my-cpn><my-cpn> <div> <my-cpn><my-cpn> </div> </div>
示例:
<div id="app1"> <my-cpn></my-cpn> </div> <div id="app2"> <my-cpn></my-cpn> </div> <script src="../js/vue.js"></script> <script> // 建立組件構造器 const myComponent = Vue.extend({ template: ` <div> <h2>web</h2> </div> ` }) // 註冊組件 Vue.component('my-cpn',myComponent); let app1 = new Vue({ el: '#app1' }) let app2 = new Vue({ el: '#app2' })
<div id="app1"> <my-cpn></my-cpn> </div> <div id="app2"> // 沒有被渲染出來 <my-cpn></my-cpn> </div> <script src="../js/vue.js"></script> <script> // 建立組件構造器 const myComponent = Vue.extend({ template: ` <div> <h2>web</h2> </div> ` }) let app1=new Vue({ el: '#app1', components: { 'my-cpn': myComponent } }) let app2 = new Vue({ el: '#app2' }) </script>
組件樹
示例:
<div id="app"> <parent-cpn></parent-cpn> </div> <script src="../js/vue.js"></script> <script> // 建立一個子組件構造器 const childComponent = Vue.extend({ template: ` <div>我是子組件的內容</div> ` }) // 建立一個父組件的構造器 const parentComponent = Vue.extend({ template: ` <div> 我是父組件的內容 <child-cpn></child-cpn> </div> ` components: { 'child-cpn': childComponent } }) let app = new Vue({ el: '#app', components: { 'parent-cpn': parentComponent } })
註冊組件的語法糖
示例:全局組件
<div id="app"> <cpn1></cpn1> </div> <script> // 全局組件註冊的語法糖 // 註冊組件 Vue.component('cpn1', { template: ` <div> <h2>web</h2> </div> ` }) const app = new Vue({ el: '#app', data: { message: 'web', } }) </script>
<div id="app"> <cpn2></cpn2> </div> // 註冊局部組件的語法糖 const app = new Vue({ el: '#app', data: { message: 'web' }, components: { 'cpn2': { template: ` <div> <h1>web</h1> </div> ` } } }) </script>
vue
簡化了註冊組件的方式,提供了註冊的語法糖。
vue
提供了兩種定義html
模塊內容:
<script>
標籤<template>
標籤示例:
<div id="app"> <my-cpn></my-cpn> </div> <script type="text/x-template" id="myCpn"> <div> <h2>web</h2> </div> </script> <script src="../js/vue.js"></script> <script> let app = new Vue({ el: '#app', components: { 'my-cpn': { template: '#myCpn' } } }) </script>
template
標籤
<template id="cpn"> <div> <h2>web</h2> </div> </template> // 註冊一個全局組件 Vue.component('cpn', { template: '#cpn' })
組件能夠訪問vue實例數據嗎
組件是一個單獨的功能模塊封裝,有屬於本身的html
模板和本身的數據data
。
組件對象有一個data
屬性,methods
屬性,這個data
屬性必須是一個函數,函數返回一個對象,對象內部保存着數據。
<div id="app"> <my-cpn></my-cpn> </div> <template id="myCpn"> <div>{{message}}</div> </template> <script src="..."></script> <script> let app = new Vue({ el: '#app', components: { 'my-cpn': { template: 'myCpn', data() { return{ message: 'web' } } } } })
如何進行父子組件間的通訊呢?
props
向子組件傳遞數據
props
基本用法
在組件中,使用props
來聲明從父級接收到的數據
props
的值:
camelCase
(駝峯命名法) 的 prop
名須要使用其等價的 kebab-case
(短橫線分隔命名) 命名:
Vue.component('blog-post', { // 在 JavaScript 中是 camelCase 的 props: ['postTitle'], template: '<h3>{{ postTitle }}</h3>' }) <!-- 在 HTML 中是 kebab-case 的 --> <blog-post post-title="hello!"></blog-post>
重申一次,若是你使用字符串模板,那麼這個限制就不存在了。
prop
各自的名稱和類型:
props: { title: String, likes: Number, isPublished: Boolean, commentIds: Array, author: Object, callback: Function, contactsPromise: Promise // or any other constructor }
<!-- 動態賦予一個變量的值 --> <blog-post v-bind:title="post.title"></blog-post> <!-- 動態賦予一個複雜表達式的值 --> <blog-post v-bind:title="post.title + ' by ' + post.author.name" ></blog-post> <!-- 即使 `42` 是靜態的,咱們仍然須要 `v-bind` 來告訴 Vue --> <!-- 這是一個 JavaScript 表達式而不是一個字符串。--> <blog-post v-bind:likes="42"></blog-post> <!-- 用一個變量進行動態賦值。--> <blog-post v-bind:likes="post.likes"></blog-post>
傳入一個對象的全部屬性
若是你想要將一個對象的全部屬性都做爲 prop 傳入,你可使用不帶參數的 v-bind (取代 v-bind:prop-name)
:
post: { id: 1, title: 'My Journey with Vue' } <blog-post v-bind="post"></blog-post> <blog-post v-bind:id="post.id" v-bind:title="post.title" ></blog-post>
一個簡單的props
傳遞:
<div id="app"> <child-cpn :message="message"></child-cpn> </div> <template id="childCpn"> <div> 顯示信息:{{message}}</div> </template> <script> let app = new Vue({ el: '#app', data: { message: 'hello' }, components: { 'child-cpn': { templte: '#childCpn', props: ['message'] } } }) </script>
在 Vue
中,父子組件的關係
props
向下傳遞,事件向上傳遞。
父組件經過 props
給子組件下發數據,子組件經過事件給父組件發送消息。
props
支持的數據類型:
String Number Boolean Array Object Date Function Symbol
示例:
Vue.component('my-component',{ props: { // 基礎的類型檢查 propA: Number, // 多個可能的類型 propB: [String, Number], // propC: { type: String, required: true }, // 帶有默認值的數字 propD: { type: Number, default: 100 }, // 帶有默認值的對象 propE: { type: Object, default: function(){ return {message: 'web'} } }, // 自定義驗證函數 propF: { vfunc: function(value) { return value > 1 } } } })
子傳父
代碼:
this.$emit('item-click',item)
props
用於父組件向子組件傳遞數據,還有一種比較常見的是子組件傳遞數據或事件到父組件中。
自定義事件:
$emit()
來觸發事件。v-on
來監聽子組件事件。自定義事件代碼:
<div id="app"> <child-cpn @increment="changeTotal" @decrement="changeTotal"></child-cpn> <h2>點擊次數</h2> </div> <template id="childCpn"> <div> <button @click="increment">+1</button> <button @click="decrement">-1</button> </div> </template> let app = new Vue({ el: '#app', data: { total: 0 }, methods: { changeTotal(counter) { this.total = counter } }, components: { 'child-cpn': { template: '#childCpn', data(){ return{ counter: 0 } }, methods: { increment(){ this.counter++; this.$emit('increment', this.counter) }, decrement(){ this.counter--; this.$emit('decrement',this.counter) } } } } })
$children
有時候須要父組件直接訪問子組件,子組件直接訪問父組件,或者是子組件訪問父組件。
$children
或者$refs
$parent
對於$children
的訪問:
this.$children
是一個數組類型,它包含全部子組件對象。message
狀態。示例:
<div id="app"> <parent-cpn></parent-cpn> </div> // 父組件template <template id="parentCpn"> <div> <child-cpn1></child-cpn1> <child-cpn2></child-cpn2> <button @click="showChildCpn">顯示全部子組件信息</button> </div> </template> // 子組件 <template id="childCpn1"> <h2>我是子組件1</h2> </template> // 子組件 <template id="childCpn2"> <h2>我是子組件2</h2> </template> Vue.component('parent-cpn',{ template: '#parentCpn', methods: { showChildCpn(){ for(let i=0; i<this.$children.length; i++){ console.log(this.$children[i].message) } } } })
$parent
子組件中直接訪問父組件,能夠經過$parent
$parent
來訪問父組件,可是儘可能不要這樣作
父子組件的訪問方式
$refs
$children
的缺陷:
$children
訪問子組件,是一個數組類型,訪問其子組件要經過索引值。$refs
$refs
的使用:
$refs
和ref
指令一般一塊兒使用ref
給某個子組件綁定一個特定的id
this.$refs.id
能夠訪問到該組件示例:
<child-cpn1 ref="child1"></child-cpn1> <child-cpn2 ref="child2"></child-cpn2> <button @click="show">經過refs訪問子組件</button> show() { console.log(this.$refs.child1.message); console.log(this.$refs.child2.message); }
看看一個
.vue
文件項目
<template> <div class="xxx"> <div class="xxx" :class="{active: currentIndex === index}" @click="itemClick(index)" v-for="(item,index) in titles"> <span>{{item}}</span> </div> </div> </template> <script> export default { name: 'xxx', props: { titles: { type: Array, default() { return [] } } }, data: function() { return { currentIndex: 0 } }, } </script> <style scoped> .xxx { xxx: xxx; } </style>
三層部分:
vue
中的代碼slot
是什麼呢,它叫插槽,<slot>
元素做爲組件模板之中的內容分發插槽,傳入內容後<slot>
元素自身將被替換。
v-slot
用法:
slot
以及slot-scope
的用法:子組件編寫,父組件編寫默認插槽
子組件:
// 子組件 <template> <div class="content"> // 默認插槽 <content-box class="text"> <slot>默認值</slot> <content-box> </div> </template>
slot
基本使用
<slot>
能夠爲子組件開啓一個插槽。子組件定義一個插槽:
<slot>
中的內容表示,若是沒有在該組件中插入任何其餘內容,就默認顯示改內容。示例:
<div id="app"> <my-cpn></my-cpn> <my-cpn> <p>web</p> </my-cpn> </div> <template id="myCpn"> <div> <slot>我是誰</slot> </div> </template> <script> Vue.component('my-cpn',{ template: '#myCpn' }) let app = new Vue({ el: '#app' }) </script>
使用具名插槽
slot
元素添加一個name
屬性<slot name="web"></slot>
示例:
<div id="app"> // 沒有任何內容 <my-cpn></my-cpn> // 傳入某個內容 <my-cpn> <span slot="left">left</span> </my-cpn> <my-cpn> <span slot="left">left</span> <span slot="center">center</span> <span slot="right">right</span> </div> <template id="myCpn"> <div> <slot name="left">1</slot> <slot name="center">2</slot> <slot name="right">3</slot> </div> </template> <script> Vue.component('my-cpn', { template: '#myCpn' }) let app = new Vue({ el: '#app' }) </script>
編譯做用域
Vue
實例屬性:
父組件模板的全部東西都會在父級做用域內編譯,子組件模板的全部東西都會在子級做用域內編譯。
父組件替換插槽的標籤,可是內容由子組件來提供。
什麼是模塊化,將一組模塊以正確的順序拼接到一個文件中的過程,模塊是實現特定功能的一組屬性和方法的封裝。
利用構造函數封裝對象
function web() { var arr = []; this.add = function(val) { arr.push(var) } this.toString = function() { return arr.join('') } } var a = new web(); a.add(1); // [1] a.toString(); // "1" a.arr // undefined
示例:
var ModuleA = (function(){ // 定義一個對象 var obj = {} // 在對象內部添加變量和方法 obj.flag = true obj.myFunc = function(info) { console.log(info) }; // 將對象返回 return obj }
if(ModuleA.flag) { console.log('web') } ModuleA.myFunc('webweb')
常見的模塊化規範:
CommonJS
,AMD
,CMD
,ES6
中的Modules
什麼是AMD
,異步模塊定義,它是在瀏覽器端實現模塊化開發的規範,可是該規範不是原生js
支持的,使用AMD
規範進行開發的時候須要引入第三方的庫函數,就是RequireJS
。
RequireJS
解決了多個js
文件可能有依賴的關係,被依賴的文件須要早於依賴它的文件加載到瀏覽器;js
加載的時候瀏覽器會中止頁面渲染,加載文件越多,頁面就會失去響應時間越長。
CMD
是什麼,它是通用模塊定義,解決的問題和AMD
同樣,不過在模塊定義方式和模塊加載時機上不一樣,CMD
須要額外的引入第三方的庫文件SeaJS
。
JavaScript模塊化編程
那麼什麼是模塊化呢
將一個項目按照功能劃分,理論上一個功能一個模塊,互不影響,在須要的時候載入,儘可能遵循高內聚低耦合。
瞭解CommonJS
CommonJS 是一種思想,本質上是可複用的JavaScript,它導出特定的對象,提供其它程序使用。
使用module.exports
和exports.obj
來導出對象,並在須要它的程序中使用require('module')
加載。
模塊化的核心就是:導入和導出
導出:CommonJS
module.exports = { flag: true, test(a,b) { return a+b }, demo(a,b) { return a*b } }
導入:CommonJS
// CommonJS模塊 let {test, demo, flag} = require('moduleA'); // => let ma = require('moduleA'); let test = ma.test; let demo = ma.demo; let flag = ma.flag;
由於網站開發愈來愈複雜,js文件又不少,就會出現一些問題:
CommonJS
,定義模塊,一個單獨的js
文件就是一個模塊,每一個模塊都有本身單獨的做用域,在該模塊內部定義的變量,沒法被其餘模塊讀取,除了定義爲global
對象的屬性。
模塊的導出:exports
和module.exports
模塊的導入:require
node
中,每一個模塊內部都有要給本身的module
對象module
對象中,有一個成員exports
也是一個對象exports
對象導出當前方法或變量,也可經過module.exports
導出node
簡化了操做,exports
等於module.exports
,至關於var exports = module.exports
es模塊的導入和導出
export function add(num1, num2) { return num1 + num2 }
export function accString(param) { if (param == 0) { return '關' }else if(param == 1) { return '開' } } import { accString } from '../../utils'
const name = 'web' export default name
export default
一個模塊中包含某個功能,若是不但願給功能命名,可讓導入者本身來定:
export default function(){ console.log('web') }
使用:
import myFunc from '../web.js' myFunc()
export default
在同一個模塊中,不容許同時存在多個
import
使用
export
指令導出了模塊對外提供的接口
import
指令用於導入模塊中的內容
import {name, age} from './web.js'
經過*
能夠導入模塊中全部全部的export
變量
import * as web from './web.js' console.log(web.name);
我是程序員哆啦A夢,藍胖子,簡書萬粉優秀創做者,掘金優秀做者、CSDN博客專家,雲+社區社區活躍做者,致力於打造一系列可以幫助程序員提升的優質文章。網站@http://www.dadaqianduan.cn