摘要:添加事件偵聽器時使用模式。只當事件是從偵聽器綁定的元素本身觸發時才觸發回調。差別在哪里將特性名轉換為從開始支持語法糖,會擴展成一個更新父組件綁定值的偵聽器。如果需要條件渲染多個元素,可以使用包裹。
1.前言 安裝
直接用 引入(本地或者cdn)
npm npm install vue
vue-cli官方腳手架
# 全局安裝 vue-cli $ npm install --global vue-cli # 創建一個基于 webpack 模板的新項目 $ vue init webpack my-project # 安裝依賴,走你 $ cd my-project $ npm install $ npm run dev簡介
Vue (讀音 /vju?/,類似于 view) 是一套用于構建用戶界面的漸進式框架。Vue 的核心庫只關注視圖層,對應view。
Vue數據驅動,jQuery是結構驅動
原理內部使用Object.defineProperty(最低支持IE9)把所有屬性全部轉為 getter/setter,為每個組件綁定了watcher 實例對象,并且把屬性作為依賴項,當依賴項的setter調用時,watcher將會重新計算,從而更新組件。
[組件render]-<創建>-[getter、setter]-<收集依賴>-[watcher]
[觸發setter]-<通知>-[watcher]-<觸發>-[組件渲染函數]-<更新>-[組件]
.png)
開發環境vueTools
vscode【Vetur、Vue2 Snippets】
weboack
2.實例 聲明式渲染{{ message }}
//js var vm = new Vue({ el: "#app", data: { message: "Hello Vue!" } })數據與方法
當一個 Vue 實例被創建時,它向 Vue 的響應式系統中加入了其 data 對象中能找到的所有的屬性。當這些屬性的值發生改變時,視圖將會產生“響應”,即匹配更新為新的值。
// 我們的數據對象 var data = { a: 1 } // 該對象被加入到一個 Vue 實例中 var vm = new Vue({ data: data }) // 他們引用相同的對象! vm.a === data.a // => true // 設置屬性也會影響到原始數據 vm.a = 2 data.a // => 2 // ... 反之亦然 data.a = 3 vm.a // => 3
當這些數據改變時,視圖會進行重渲染。值得注意的是只有當實例被創建時 data 中存在的屬性是響應式的。也就是說如果你添加一個新的屬性,將不會觸發任何視圖的更新。如果你知道你會在晚些時候需要一個屬性,但是一開始它為空或不存在,那么你僅需要設置一些初始值。
var data = { a: 1 } var vm = new Vue({ el: "#example", data: data }) vm.$data === data // => true vm.$el === document.getElementById("example") // => true // $watch 是一個實例方法 vm.$watch("a", function (newValue, oldValue) { // 這個回調將在 `vm.a` 改變后調用 })自身屬性和方法
vue實例自身暴露的屬性和方法通過前綴$來獲取
var data = { a: 1 } var vm = new Vue({ el: "#example", data: data }) vm.$data === data // => true vm.$el === document.getElementById("example") // => true實例生命周期
每個 Vue 實例在被創建之前都要經過一系列的初始化過程(生命周期)。在這個過程中會運行一些叫做生命周期鉤子的函數,用戶可以在不同階段添加自己的代碼來做一些事情。
beforeCreate:在實例初始化之后,數據觀測 (data observer) 和 event/watcher 事件配置之前被調用。
created:在實例創建完成后被立即調用。在這一步,實例已完成以下的配置:數據觀測 (data observer),屬性和方法的運算,watch/event 事件回調。然而,掛載階段還沒開始,$el 屬性目前不可見。
beforeMount:在掛載開始之前被調用:相關的 render 函數首次被調用。
mounted:el 被新創建的 vm.$el 替換,并掛載到實例上去之后調用該鉤子。
beforeUpdate:數據更新時調用,發生在虛擬 DOM 重新渲染和打補丁之前。
updated:由于數據更改導致的虛擬 DOM 重新渲染和打補丁,在這之后會調用該鉤子
beforeDestroy:實例銷毀之前調用。在這一步,實例仍然完全可用。
destroyed:Vue 實例銷毀后調用。調用后,Vue 實例指示的所有東西都會解綁定,所有的事件監聽器會被移除,所有的子實例也會被銷毀。
activated/deactivated:keep-alive 組件激活/停用時調用,
errorCaptured:當捕獲一個來自子孫組件的錯誤時被調用。此鉤子會收到三個參數:錯誤對象、發生錯誤的組件實例以及一個包含錯誤來源信息的字符串。此鉤子可以返回 false 以阻止該錯誤繼續向上傳播。
注意:
beforeCreate,created外的鉤子在服務器端渲染期間不被調用。
不要在選項屬性或回調上使用箭頭函數,比如
//錯誤,會導致this不會指向Vue 實例 created: () => console.log(this.a) vm.$watch("a", newValue => this.myMethod())Vue對象的選項
var vm = new Vue({ // 數據 data: "聲明需要響應式綁定的數據對象", props: "接收來自父組件的數據", propsData: "創建實例時手動傳遞props,方便測試props", computed: "計算屬性", methods: "定義可以通過vm對象訪問的方法", watch: "Vue實例化時會調用$watch()方法遍歷watch對象的每個屬性", // DOM el: "將頁面上已存在的DOM元素作為Vue實例的掛載目標", template: "可以替換掛載元素的字符串模板", render: "渲染函數,字符串模板的替代方案", renderError: "僅用于開發環境,在render()出現錯誤時,提供另外的渲染輸出", // 生命周期鉤子 beforeCreate: "發生在Vue實例初始化之后,data observer和event/watcher事件被配置之前", created: "發生在Vue實例初始化以及data observer和event/watcher事件被配置之后", beforeMount: "掛載開始之前被調用,此時render()首次被調用", mounted: "el被新建的vm.$el替換,并掛載到實例上之后調用", beforeUpdate: "數據更新時調用,發生在虛擬DOM重新渲染和打補丁之前", updated: "數據更改導致虛擬DOM重新渲染和打補丁之后被調用", activated: "keep-alive組件激活時調用", deactivated: "keep-alive組件停用時調用", beforeDestroy: "實例銷毀之前調用,Vue實例依然可用", destroyed: "Vue實例銷毀后調用,事件監聽和子實例全部被移除,釋放系統資源", // 資源 directives: "包含Vue實例可用指令的哈希表", filters: "包含Vue實例可用過濾器的哈希表", components: "包含Vue實例可用組件的哈希表", // 組合 parent: "指定當前實例的父實例,子實例用this.$parent訪問父實例,父實例通過$children數組訪問子實例", mixins: "將屬性混入Vue實例對象,并在Vue自身實例對象的屬性被調用之前得到執行", extends: "用于聲明繼承另一個組件,從而無需使用Vue.extend,便于擴展單文件組件", provide&inject: "2個屬性需要一起使用,用來向所有子組件注入依賴,類似于React的Context", // 其它 name: "允許組件遞歸調用自身,便于調試時顯示更加友好的警告信息", delimiters: "改變模板字符串的風格,默認為{{}}", functional: "讓組件無狀態(沒有data)和無實例(沒有this上下文)", model: "允許自定義組件使用v-model時定制prop和event", inheritAttrs: "默認情況下,父作用域的非props屬性綁定會應用在子組件的根元素上。當編寫嵌套有其它組件或元素的組件時,可以將該屬性設置為false關閉這些默認行為", comments: "設為true時會保留并且渲染模板中的HTML注釋" });3.模板語法
Vue.js 使用了基于 HTML 的模板語法,必須是合法的 HTML。在底層的實現上,Vue 將模板編譯成虛擬 DOM 渲染函數。
插值 文本Message: {{ msg }} 這個將不會改變: {{ msg }}HTML
Using v-html directive:
只對可信內容使用 HTML 插值,絕不要對用戶提供的內容使用插值。
特性在插值中可以使用表達式,但只限簡單表達式。
{{ message.split("").reverse().join("") }}指令
指令 (Directives) 是帶有 v- 前綴的特殊屬性。
指令的職責是,當表達式的值改變時,將其產生的連帶影響,響應式地作用于 DOM。
現在你看到我了
...
指令 | 預期/限制 | 作用 |
---|---|---|
v-text | string | 文本插值 |
v-html | string | html插值 |
v-show | any | 條件顯示 |
v-if、v-else、v-else-if | any | 條件渲染 |
v-for | Array/Object/number/string | 列表渲染 |
v-on(@) | Function/Inline Statement/Object | 事件綁定 |
v-bind(:) | any (with argument)/Object (without argument) | 特性綁定 |
v-model | 僅限/ | 雙向綁定 |
v-pre | 忽略編譯 | |
v-cloak | 避免顯示Mustache | |
v-once | 一次性渲染 |
修飾符 (Modifiers) 是以半角句號 . 指明的特殊后綴,用于指出一個指令應該以特殊方式綁定。
v-on能使用的修飾符:
修飾符 | 作用 |
---|---|
.stop | 調用 event.stopPropagation()。 |
.prevent | 調用 event.preventDefault()。 |
.capture | 添加事件偵聽器時使用 capture 模式。 |
.self | 只當事件是從偵聽器綁定的元素本身觸發時才觸發回調。 |
.{keyCode / keyAlias} | 只當事件是從特定鍵觸發時才觸發回調。 |
.native | 監聽組件根元素的原生事件。 |
.once | 只觸發一次回調。 |
.left | (2.2.0) 只當點擊鼠標左鍵時觸發。 |
.right | (2.2.0) 只當點擊鼠標右鍵時觸發。 |
.middle | (2.2.0) 只當點擊鼠標中鍵時觸發。 |
.passive | (2.3.0) 以 { passive: true } 模式添加偵聽器 |
v-bind能使用的修飾符:
修飾符 | 作用 |
---|---|
.prop | 被用于綁定 DOM 屬性 (property)。(差別在哪里?) |
.camel | (2.1.0+) 將 kebab-case 特性名轉換為 camelCase. (從 2.1.0 開始支持) |
.sync | (2.3.0+) 語法糖,會擴展成一個更新父組件綁定值的 v-on 偵聽器。 |
v-model能使用的修飾符:
修飾符 | 作用 |
---|---|
.lazy | 取代 input 監聽 change 事件 |
.number | 輸入字符串轉為數字 |
.trim | 輸入首尾空格過濾 |
對于任何復雜邏輯,你都應當使用計算屬性,而不應直接放在模板中。
計算屬性也是響應式的,但是它會基于它們的依賴進行緩存的,只有當緩存改變,它才會重新求值;否則會直接返回緩存的結果,而不必再次執行函數。
應當優先使用計算屬性而不是偵聽屬性。
Original message: "{{ message }}"
Computed reversed message: "{{ reversedMessage }}"
var vm = new Vue({ el: "#example", data: { message: "Hello" }, computed: { // 計算屬性的 getter reversedMessage: function () { // `this` 指向 vm 實例 return this.message.split("").reverse().join("") } } })
下面的計算屬性不會更新,因為Date.now() 不是響應式依賴。
computed: { now: function () { return Date.now() } }計算屬性緩存 vs 方法
Reversed message: "{{ reversedMessage() }}"
// 在組件中 methods: { reversedMessage: function () { return this.message.split("").reverse().join("") } }
方法在每次調用時總會再次執行函數。
setter計算屬性默認只有 getter ,不過在需要時你也可以提供一個 setter
computed: { fullName: { // getter get: function () { return this.firstName + " " + this.lastName }, // setter set: function (newValue) { var names = newValue.split(" ") this.firstName = names[0] this.lastName = names[names.length - 1] } } }偵聽器
Ask a yes/no question:
{{ answer }}
watch: { // 如果 `question` 發生改變,這個函數就會運行 question: function (newQuestion, oldQuestion) { this.answer = "Waiting for you to stop typing..." this.getAnswer() } }銷毀
// const unWatch = app.$watch("text", (newText, oldText) => { // console.log(`${newText} : ${oldText}`) // }) // setTimeout(() => { // unWatch() // }, 2000)5. Class與Style綁定 Class 對象語法
當value為真時,綁定對應的key到class
數組語法data: { classObject: { active: true, "text-danger": false } }
data: { activeClass: "active", errorClass: "text-danger" }
也可以使用三元表達式。
// isActive為真添加activeClass,errorClass始終存在混合
用在組件上
class將被添加到該組件的根元素上面。該元素上已經存在的class不會被覆蓋。
注意:和普通的class并存,并不會覆蓋(不同名),最終會合成一個class。
Style自動偵測并添加相應瀏覽器引擎前綴。
對象語法CSS 屬性名可以用駝峰式 (camelCase) 或短橫線分隔 (kebab-case,記得用單引號括起來) 來命名。
data: { activeColor: "red", fontSize: 30 } data: { styleObject: { color: "red", fontSize: "13px" } }數組語法
可以將多個樣式對象應用到同一個元素上
多重值
6.條件渲染 v-if(v-else、v-else-if)
根據表達式的值的真假條件渲染元素。
ABCNot A/B/C
如果需要條件渲染多個元素,可以使用包裹。
Title
Paragraph 1
Paragraph 2
Vue 會盡可能高效地渲染元素,通常會復用已有元素而不是從頭開始渲染。添加一個具有唯一值的 key 屬性可以強制其重新渲染。
v-show根據表達式之真假值,切換元素的 display CSS 屬性。
7.列表渲染 數組Hello!
包含變異(改變原數組)和非變異(生成新數組,不改變原數組)兩組方式,都將觸發更新。
變異方法:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
非變異方法(需用新數組替換原數組):filter()、concat()、slice()
不能檢測的變動:
當你利用索引直接設置一個項時,例如:vm.items[indexOfItem] = newValue
當你修改數組的長度時,例如:vm.items.length = newLength
對象Vue 不能檢測對象屬性的添加或刪除。
對于已經創建的實例,Vue 不能動態添加根級別的響應式屬性。
var vm = new Vue({ data: { a: 1 } }) // `vm.a` 現在是響應式的 vm.b = 2 // `vm.b` 不是響應式的
可以使用 Vue.set(object, key, value) 方法向嵌套對象添加響應式屬性
var vm = new Vue({ data: { userProfile: { name: "Anika" } } }) vm.$set(this.userProfile, "age", 27)
多個屬性可以使用Object.assign() 或 _.extend()
this.userProfile = Object.assign({}, this.userProfile, { age: 27, favoriteColor: "Vue Green" })delete
對應的刪除屬性使用vm.$delete(obj,key)
key當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用“就地復用”策略。
建議盡可能在使用 v-for 時為每一項提供一個唯一的 key。
循環組件的時候,key是必須的。
其他
v-for的循環對象也可以是計算屬性和帶返回值的method 方法。
利用帶有 v-for 的 渲染多個元素
v-for和v-if處于同一節點時,v-for 具有比 v-if 更高的優先級
8.事件處理 事件new Vue({ el: "#example-3", methods: { say: function (message) { alert(message) }, say2: function (message,event) { // 現在我們可以訪問原生事件對象 if (event) event.preventDefault() alert(message) } } })事件修飾符
修飾符可以串聯,代碼會以串聯的順序產生。
修飾符 | 作用 |
---|---|
.stop | 調用 event.stopPropagation()。 |
.prevent | 調用 event.preventDefault()。 |
.capture | 添加事件偵聽器時使用 capture 模式。 |
.self | 只當事件是從偵聽器綁定的元素本身觸發時才觸發回調。 |
.once | 只觸發一次回調。 |
Vue 還對應 addEventListener 中的 passive 選項提供了 .passive 修飾符,能夠提升移動端的性能,但是要避免和.prevent一起使用。
按鍵修飾符...
在監聽鍵盤事件時,我們經常需要檢查常見的鍵值。Vue 允許為 v-on 在監聽鍵盤事件時添加按鍵修飾符。
全部的按鍵別名:.enter、.tab、.delete (捕獲“刪除”和“退格”鍵)、.esc、.space、.up、.down、.left、.right
自定義按鍵修飾符別名
// 可以使用 `v-on:keyup.f1` Vue.config.keyCodes.f1 = 112
自動匹配按鍵修飾符
系統修飾鍵
.ctrl、.alt、.shift、.meta。
在和 keyup 事件一起用時,事件觸發時修飾鍵必須處于按下狀態。換句話說,只有在按住 ctrl 的情況下釋放其它按鍵,才能觸發 keyup.ctrl。而單單釋放 ctrl 也不會觸發事件。
Do something
.exact 修飾符允許你控制由精確的系統修飾符組合觸發的事件。
鼠標按鈕修飾符
.left、.right、.middle
僅響應特定的鼠標按鈕
可以用 v-model 指令在表單 及 元素上創建雙向數據綁定。
v-model僅為v-on:input和v-bind:value的語法糖而已。
注意:v-model 會忽略所有表單元素的 value、checked、selected 特性的初始值而總是將 Vue 實例的數據作為數據來源。你應該通過 JavaScript 在組件的 data 選項中聲明初始值。
文本/多行文本
Message is: {{ message }}
復選框
Checked names: {{ checkedNames }}
new Vue({ el: "#example-3", data: { checkedNames: [] } }) //Checked names: [ "Jack", "John", "Mike" ]
單選按鈕
Picked: {{ picked }}
new Vue({ el: "#example-4", data: { picked: "" } }) //Picked: Two
選擇框
Selected: {{ selected }}
new Vue({ el: "...", data: { selected: "" } }) //Selected: B
為多選時則返回一個數組Selected: [ "A", "B" ]
值綁定復選框
單選按鈕
選擇框的選項
修飾符.lazy,默認input事件觸發,使用此修飾則改為change事件觸發
.number將輸入的值轉換為數值
.trim過濾掉輸入內容的首尾空白字符
10.組件 簡介
組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。組件是具有特殊功能的自定義元素。
所有的 Vue 組件同時也都是 Vue 的實例,所以可接受相同的選項對象 (除了一些根級特有的選項) 并提供相同的生命周期鉤子。
注冊組件 全局組件局部組件//注意確保在初始化根實例之前注冊組件 // 注冊 Vue.component("my-component", { template: " A custom component!" })
var Child = { template: "自動注冊A custom component!" } new Vue({ // ... components: { //將只在父組件模板中可用 "my-component": Child } })
webpack 的 vue cli3+
import Vue from "vue" import upperFirst from "lodash/upperFirst" import camelCase from "lodash/camelCase" const requireComponent = require.context( // 其組件目錄的相對路徑 "./components", // 是否查詢其子目錄 false, // 匹配基礎組件文件名的正則表達式 /Base[A-Z]w+.(vue|js)$/ ) requireComponent.keys().forEach(fileName => { // 獲取組件配置 const componentConfig = requireComponent(fileName) // 獲取組件的 PascalCase 命名 const componentName = upperFirst( camelCase( // 剝去文件名開頭的 `"./` 和結尾的擴展名 fileName.replace(/^./(.*).w+$/, "$1") ) ) // 全局注冊組件 Vue.component( componentName, // 如果這個組件選項是通過 `export default` 導出的, // 那么就會優先使用 `.default`, // 否則回退到使用模塊的根。 componentConfig.default || componentConfig ) })
data必須是帶return的函數
如果將組件用于像 以下類型模板無此限制:、JavaScript 內聯模板字符串、.vue 組件 可以包含、、、
內只允許有一個根元素
可以有多個
、支持src導入 父組件向子組件傳遞數據。 如果你想把一個對象的所有屬性作為 prop 進行傳遞,可以使用不帶任何參數的 v-bind 為組件的 prop 指定驗證規則,會在組件實例創建之前進行校驗。如果傳入的數據不符合要求,Vue 會發出警告。 type 可以是下面原生構造器:String、Number、Boolean、Function、Object、Array、Symbol 組件可以接收任意傳入的特性,這些特性都會被添加到組件的根元素上,且會做合并處理。 子組件向父組件傳遞數據。 使用 $on(eventName) 監聽事件 使用 $emit(eventName) 觸發事件 {{ total }} .sync @update的語法糖 等價于 v-model(僅適用于表單輸入組件) v-on:input和v-bind:value的語法糖 等價于 簡單場景bus.js
注: 還可以使用$ref、$parent、$child進行通信,不過不推薦。 復雜的場景請使用vuex 為了讓組件可以組合,我們需要一種方式來混合父組件的內容與子組件自己的模板。這個過程被稱為內容分發。 除非子組件模板包含至少一個 最初在 這是一些初始內容 這是更多的初始內容 這是一些初始內容 這是更多的初始內容 仍然可以有一個匿名插槽,它是默認插槽,作為找不到匹配的內容片段的備用插槽。如果沒有默認插槽,這些找不到匹配的內容片段將被拋棄。 主要內容的一個段落。 另一個主要段落。 這里有一些聯系信息 主要內容的一個段落。 另一個主要段落。 和普通的插槽對比,能夠傳遞數據。 通過使用保留的 把切換出去的組件保留在內存中,保留其狀態或避免重新渲染 組件復用性,松耦合 謹慎使用ref 在大型應用中使用異步加載 PascalCase聲明, kebab-case使用 為遞歸組件添加name 對低開銷的靜態組件使用 v-once Vue 在插入、更新或者移除 DOM 時,提供多種不同方式的應用過渡效果。 適用場景:條件渲染 (使用 v-if)、條件展示 (使用 v-show)、動態組件、組件根節點 hello v-enter:定義進入過渡的開始狀態。在元素被插入時生效,在下一個幀移除。 v-enter-active:定義過渡的狀態。在元素整個過渡過程中作用,在元素被插入時生效,在 transition/animation 完成之后移除。這個類可以被用來定義過渡的過程時間,延遲和曲線函數。 v-enter-to: 2.1.8版及以上 定義進入過渡的結束狀態。在元素被插入一幀后生效 (與此同時 v-enter 被刪除),在 transition/animation 完成之后移除。 v-leave: 定義離開過渡的開始狀態。在離開過渡被觸發時生效,在下一個幀移除。 v-leave-active:定義過渡的狀態。在元素整個過渡過程中作用,在離開過渡被觸發后立即生效,在 transition/animation 完成之后移除。這個類可以被用來定義過渡的過程時間,延遲和曲線函數。 v-leave-to: 2.1.8版及以上 定義離開過渡的結束狀態。在離開過渡被觸發一幀后生效 (與此同時 v-leave 被刪除),在 transition/animation 完成之后移除。 動畫在css中使用animation即可,其他和過渡類似。 我們可以通過以下特性來自定義過渡類名: hello 可以通過 appear 特性設置節點在初始渲染的過渡 當有相同標簽名的元素切換時,建議給元素設置key。 in-out:新元素先進行過渡,完成之后當前元素過渡離開。 out-in:當前元素先進行過渡,完成之后新元素過渡進入。 多個組件的過渡使用動態組件 使用 它會以一個真實元素呈現:默認為一個 。你也可以通過 tag 特性更換為其他元素。 內部元素 總是需要 提供唯一的 key 屬性值 也可以通過 move-class 屬性手動設置 創建可復用過度組件,將 動態過渡,通過動態綁定name實現 混合 (mixins) 是一種分發 Vue 組件中可復用功能的非常靈活的方式。混合對象可以包含任意組件選項。當組件使用混合對象時,所有混合對象的選項將被混入該組件本身的選項。 當組件和混合對象含有同名選項時,這些選項將以恰當的方式混合。比如,同名鉤子函數將混合為一個數組,因此都將被調用。另外,混合對象的 鉤子將在組件自身鉤子 之前 調用 。 值為對象的選項,例如 methods, components 和 directives,將被混合為同一個對象。兩個對象鍵名沖突時,取組件對象的鍵值對。
Vue.extend() 也使用同樣的策略進行合并。 除了核心功能默認內置的指令 (v-model 和 v-show),Vue 也允許注冊自定義指令。 一個指令定義對象可以提供如下幾個鉤子函數 (均為可選):
bind:只調用一次,指令第一次綁定到元素時調用。在這里可以進行一次性的初始化設置。
inserted:被綁定元素插入父節點時調用 (僅保證父節點存在,但不一定已被插入文檔中)。
update:所在組件的 VNode 更新時調用,但是可能發生在其子 VNode 更新之前。指令的值可能發生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新 (詳細的鉤子函數參數見下)。
componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調用。
unbind:只調用一次,指令與元素解綁時調用。 指令鉤子函數會被傳入以下參數:
el:指令所綁定的元素,可以用來直接操作 DOM 。
binding:一個對象,包含以下屬性:
name:指令名,不包括 v- 前綴。
value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
expression:字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中,表達式為 "1 + 1"。
arg:傳給指令的參數,可選。例如 v-my-directive:foo 中,參數為 "foo"。
modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }。
vnode:Vue 編譯生成的虛擬節點。移步 VNode API 來了解更多詳情。
oldVnode:上一個虛擬節點,僅在 update 和 componentUpdated 鉤子中可用。 https://cn.vuejs.org/v2/guide... 數據對象: 過濾器可以用在兩個地方:雙花括號插值和 v-bind 表達式。 過濾器可以串聯,依次執行,前面的輸出作為后面一個的輸入。 過濾器可以接收參數(管道符前面的值作為第一個參數,括號內的第一個參數為第二個,依次類推) 直接用 引入(本地或者cdn) npm npm install vue
必須要通過 Vue.use() 明確地安裝路由功能,且要通過 router 配置參數注入Vue實例,從而讓整個應用都有路由功能。 將頁面組件(components)映射到路由(routes),然后告訴 vue-router 在哪里渲染它們
to: 屬性指定目標地址,默認渲染成帶有正確鏈接的 標簽,
replace:相當于router.replace() 不會留下 history 記錄
append:設置 append 屬性后,則在當前(相對)路徑前添加基路徑。例如,我們從 /a 導航到一個相對路徑 b,如果沒有配置 append,則路徑為 /b,如果配了,則為 /a/b
tag: 屬性生成別的標簽.。另外,當目標路由成功激活時,鏈接元素自動設置一個表示激活的 CSS 類名。
active-class:鏈接激活時使用的 CSS 類名。默認值可以通過路由的構造選項 linkActiveClass 來全局配置。 將激活 class 應用在外層元素: 在這種情況下, 將作為真實的鏈接(它會獲得正確的 href 的),而 "激活時的CSS類名" 則設置到外層的 。 路由視圖容器 如果 動態路徑參數params
動態路徑查詢參數query
區別:params定義了就是路由的一部分,就必須要傳,否則匹配失敗,query可以缺省 當路由參數變化時,組件的生命周期鉤子不會再被調用。 watch(監測變化) $route 對象: 使用beforeRouteUpdate 守衛: 同一個路徑可以匹配多個路由時,誰先定義的,誰的優先級就最高。 以 / 開頭的嵌套路徑會被當作根路徑。 這讓你充分的使用嵌套組件而無須設置嵌套的路徑。 如果想在父路由渲染內容,可以定義一個空的子路由。 導航到不同的 URL,會向 history 棧添加一個新的記錄。 onComplete:在導航成功完成 (在所有的異步鉤子被解析之后) 調用 onAbort:在導航終止 (導航到相同的路由、或在當前導航完成之前導航到另一個不同的路由) 調用 和router.push功能一樣,唯一區別就是不會向 history 添加新記錄 前進或后退nN步,類似 window.history.go(n) /a 的別名是 /b,意味著,當用戶訪問 /b 時,URL 會保持為 /b,但是路由匹配則為 /a,就像用戶訪問 /a 一樣 使用 props 將組件和路由解耦 如果 props 被設置為 true,route.params 將會被設置為組件屬性 如果 props 是一個對象,它會被按原樣設置為組件屬性。當 props 是靜態的時候有用。 你可以創建一個函數返回 props。這樣你便可以將參數轉換成另一種類型,將靜態值與基于路由的值結合等等。 vue-router 默認 hash 模式。 開啟history 模式,將充分利用 history.pushState API 來完成 URL 跳轉而無須重新加載頁面,但需要后端配合。 vue-router 提供的導航守衛主要用來通過跳轉或取消的方式守衛導航。
to: Route: 即將要進入的目標 路由對象
from: Route: 當前導航正要離開的路由
next: Function: 一定要調用該方法來 resolve 這個鉤子。執行效果依賴 next 方法的調用參數。
next(): 進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是 confirmed (確認的)。
next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了(可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到 from 路由對應的地址。
next("/") 或者 next({ path: "/" }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。你可以向 next 傳遞任意位置對象,且允許設置諸如 replace: true、name: "home" 之類的選項以及任何用在 router-link 的 to prop 或 router.push 中的選項。
next(error): (2.4.0+) 如果傳入 next 的參數是一個 Error 實例,則導航會被終止且該錯誤會被傳遞給 router.onError() 注冊過的回調。 beforeRouteEnter 守衛 不能 訪問 this,因為守衛在導航確認前被調用,因此即將登場的新組件還沒被創建。可以通過傳一個回調給 next來訪問組件實例。 導航被觸發。 在失活的組件里調用離開守衛。 調用全局的 beforeEach 守衛。 在重用的組件里調用 beforeRouteUpdate 守
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。 轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100897.html 摘要:升級的區別與的斷層式升級不同,延續了自己的風格。在命名方式和上有一些區別,掌握它們是你升級整個項目的關鍵。以下內容都是來源于個人項目的一些經驗之談,并非系統性的闡述。總目錄前端經驗收集器轉載自個人建了前端學習群,旨在一起學習前端。
升級的區別
與angular的斷層式升級不同,vue延續了自己的風格。在命名方式和API上有一些區別,掌握它們是你升級整個項目的關鍵。以下內容都是來源于個人... 摘要:菜鳥教程這是一個屬性其值是字符串菜鳥教程同上這是一個屬性其值是字符串用于定義的函數,可以通過來返回函數值。它們都有前綴,以便與用戶定義的屬性區分開來。
開篇語
我最近學習了js,取得進步,現在學習vue.js.建議新手學習,請不要用npm的方式(vue-cli,vue腳手架),太復雜了. 請直接下載vue.js文件本地引入,就上手學習吧參照菜鳥教程網站的vue.js教程http://... 摘要:請記住,會告訴瀏覽器你不想阻止事件的默認行為。而單單釋放也不會觸發事件。修飾符修飾符允許你控制由精確的系統修飾符組合觸發的事件。當一個被銷毀時,所有的事件處理器都會自動被刪除。
1、監聽事件
用 v-on 指令監聽 DOM 事件,并在觸發時運行一些 JavaScript 代碼。
Add 1
The button above has been clicked {{ counte... 摘要:復選框當選中時當沒有選中時這里的和特性并不會影響輸入控件的特性,因為瀏覽器在提交表單時并不會包含未被選中的復選框。
1、基礎用法
v-model指令可以實現表單元素和Model中數據的雙向數據綁定。只能運用在表單元素中(input、radio、text、address、email、select、checkbox、textarea)
可以用 v-model 指令在表單 、 及 元素上... 摘要:組件名在注冊一個組件的時候,我們始終需要給它一個名字。局部注冊全局注冊往往是不夠理想的。基礎組件的自動化全局注冊可能你的許多組件只是包裹了一個輸入框或按鈕之類的元素,是相對通用的。記住全局注冊的行為必須在根實例通過創建之前發生。
1、組件名
在注冊一個組件的時候,我們始終需要給它一個名字。
Vue.component(my-component-name, { /* ... */ })
... 摘要:父子組件通信父組件通過向下傳遞數據給子組件,子組件通過給父組件發送消息。是一個對象而不是字符串數組時,它包含驗證要求。狀態管理由于多個狀態分散的跨越在許多組件和交互間,大型應用的復雜度也隨之增長。提供了,可以通過文檔學習。
什么是vue
vue是一個前端框架,主要兩個特點:數據綁定、組件化。
安裝環境
根據教程安裝環境:node.js、npm、webpack、vue-cli主要的命... 閱讀 2696·2023-04-25 21:26 閱讀 1514·2021-11-25 09:43 閱讀 1949·2019-08-30 15:52 閱讀 932·2019-08-30 14:05 閱讀 2614·2019-08-29 16:10 閱讀 414·2019-08-29 13:48 閱讀 1860·2019-08-29 12:47 閱讀 1299·2019-08-23 18:04、
、
、 這樣的元素里面,為了遵循規范,應該使用is:
Vue.component("child", {
// 聲明 props
props: ["message"],
// 就像 data 一樣,prop 也可以在模板中使用
// 同樣也可以在 vm 實例中通過 this.message 來使用
template: "{{ message }}"
})
動態 Prop:
todo: {
text: "Learn Vue",
isComplete: false
}
字面量語法 vs 動態語法
驗證
Vue.component("example", {
props: {
// 基礎類型檢測 (`null` 指允許任何類型)
propA: Number,
// 可能是多種類型
propB: [String, Number],
// 必傳且是字符串
propC: {
type: String,
required: true
},
// 數值且有默認值
propD: {
type: Number,
default: 100
},
// 數組/對象的默認值應當由一個工廠函數返回
propE: {
type: Object,
default: function () {
return { message: "hello" }
}
},
// 自定義驗證函數
propF: {
validator: function (value) {
return value > 10
}
}
}
})
Vue.component("button-counter", {
template: "",
data: function () {
return {
counter: 0
}
},
methods: {
incrementCounter: function () {
this.counter += 1
this.$emit("increment")
}
},
})
new Vue({
el: "#counter-event-example",
data: {
total: 0
},
methods: {
incrementTotal: function () {
this.total += 1
}
}
})
父子雙向通信
// 通過 input 事件帶出數值
this.$emit("input", Number(formattedValue))
this.$emit("input", Number(formattedValue))
非父子組件通信
var bus = new Vue()
// 觸發組件 A 中的事件
bus.$emit("id-selected", 1)
// 在組件 B 創建的鉤子中監聽事件
bus.$on("id-selected", function (id) {
// ...
})
編譯作用域: 父組件模板的內容在父組件作用域內編譯;子組件模板的內容在子組件作用域內編譯。
具名插槽
我是子組件的標題
我是父組件的標題
我是父組件的標題
我是子組件的標題
作用域插槽
這里可能是一個頁面標題
這里可能是一個頁面標題
動態組件
var vm = new Vue({
el: "#example",
data: {
currentView: "home"
},
components: {
home: { /* ... */ },
posts: { /* ... */ },
archive: { /* ... */ }
}
})
keep-alive
注意事項
new Vue({
el: "#demo",
data: {
show: true
}
})
.fade-enter-active, .fade-leave-active {
transition: opacity .5s;
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
opacity: 0;
}
過渡的類名
enter-class、enter-active-class、enter-to-class (2.1.8+)、leave-class、leave-active-class、leave-to-class (2.1.8+)
設定持續時間
JavaScript 鉤子
// ...
methods: {
// --------
// 進入中
// --------
beforeEnter: function (el) {
// ...
},
// 此回調函數是可選項的設置,done 是必須的
// 與 CSS 結合時使用
enter: function (el, done) {
// ...
done()
},
afterEnter: function (el) {
// ...
},
enterCancelled: function (el) {
// ...
},
// --------
// 離開時
// --------
beforeLeave: function (el) {
// ...
},
// 此回調函數是可選項的設置,done 是必須的
// 與 CSS 結合時使用
leave: function (el, done) {
// ...
done()
},
afterLeave: function (el) {
// ...
},
// leaveCancelled 只用于 v-show 中
leaveCancelled: function (el) {
// ...
}
}
初始渲染的過渡
多個元素的過渡
多個組件的過渡
列表過渡
12.可復用性和組合
混合
// 定義一個混合對象
var myMixin = {
created: function () {
this.hello()
},
methods: {
hello: function () {
console.log("hello from mixin!")
}
}
}
// 定義一個使用混合對象的組件
var Component = Vue.extend({
mixins: [myMixin]
})
// 注冊一個全局自定義指令 `v-focus`
Vue.directive("focus", {
// 當被綁定的元素插入到 DOM 中時……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
// 注冊一個局部自定義指令
directives: {
focus: {
// 指令的定義
inserted: function (el) {
el.focus()
}
}
}
//使用
鉤子函數
// @returns {VNode}
createElement(
// {String | Object | Function}
// 一個 HTML 標簽字符串,組件選項對象,或者
// 解析上述任何一種的一個 async 異步函數,必要參數。
"div",
// {Object}
// 一個包含模板相關屬性的數據對象
// 這樣,您可以在 template 中使用這些屬性。可選參數。
{
// (詳情見下面的數據對象)
},
// {String | Array}
// 子節點 (VNodes),由 `createElement()` 構建而成,
// 或使用字符串來生成“文本節點”。可選參數。
[
"先寫一些文字",
createElement("h1", "一則頭條"),
createElement(MyComponent, {
props: {
someProp: "foobar"
}
})
]
)
{
// 和`v-bind:class`一樣的 API
"class": {
foo: true,
bar: false
},
// 和`v-bind:style`一樣的 API
style: {
color: "red",
fontSize: "14px"
},
// 正常的 HTML 特性
attrs: {
id: "foo"
},
// 組件 props
props: {
myProp: "bar"
},
// DOM 屬性
domProps: {
innerHTML: "baz"
},
// 事件監聽器基于 `on`
// 所以不再支持如 `v-on:keyup.enter` 修飾器
// 需要手動匹配 keyCode。
on: {
click: this.clickHandler
},
// 僅對于組件,用于監聽原生事件,而不是組件內部使用
// `vm.$emit` 觸發的事件。
nativeOn: {
click: this.nativeClickHandler
},
// 自定義指令。注意,你無法對 `binding` 中的 `oldValue`
// 賦值,因為 Vue 已經自動為你進行了同步。
directives: [
{
name: "my-custom-directive",
value: "2",
expression: "1 + 1",
arg: "foo",
modifiers: {
bar: true
}
}
],
// Scoped slots in the form of
// { name: props => VNode | Array
過濾器
{{ message | capitalize }}
//定義局部過濾器
filters: {
capitalize: function (value) {
if (!value) return ""
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
//定義全局過濾器
Vue.filter("capitalize", function (value) {
if (!value) return ""
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
})
{{ message | filterA | filterB }}
{{ message | filterA("arg1", arg2) }}
13.Vue-Router
安裝
動態路由匹配
//定義
routes: [
// 動態路徑參數 以冒號開頭
{ path: "/user/:id", component: User }
]
//調用
$route.params.id
//定義
routes: [
// 動態路徑參數 以冒號開頭
{ path: "/user?id=6456456", component: User }
]
//調用
$route.query.id
想對路由參數的變化作出響應的話,有以下兩種方式:const User = {
template: "...",
watch: {
"$route" (to, from) {
// 對路由變化作出響應...
}
}
}
const User = {
template: "...",
beforeRouteUpdate (to, from, next) {
// react to route changes...
// don"t forget to call next()
}
}
匹配優先級
因此,404類的頁面一定要放在最后,路由是按照聲明順序匹配,如果不是最后則404之后的頁面都會跳轉到404。const router = new VueRouter({
routes: [
{ path: "/user/:id", component: User,
children: [
{
// 當 /user/:id/profile 匹配成功,
// UserProfile 會被渲染在 User 的
在 Vue 實例內部,調用 this.$router.push// 字符串
router.push("home")
// 對象
router.push({ path: "home" })
// 命名的路由
router.push({ name: "user", params: { userId: 123 }})
// 帶查詢參數,變成 /register?plan=private
router.push({ path: "register", query: { plan: "private" }})
// 在瀏覽器記錄中前進一步,等同于 history.forward()
router.go(1)
// 后退一步記錄,等同于 history.back()
router.go(-1)
重定向
const router = new VueRouter({
routes: [
//path
{ path: "/a", redirect: "/b" },
//name
{ path: "/a", redirect: { name: "foo" }},
//方法
{ path: "/a", redirect: to => {
// 方法接收 目標路由 作為參數
// return 重定向的 字符串路徑/路徑對象
}}
]
})
別名
const router = new VueRouter({
routes: [
{ path: "/a", component: A, alias: "/b" }
]
})
路由組件傳參
const User = {
props: ["id"],
template: "
const router = new VueRouter({
routes: [
{ path: "/promotion/from-newsletter", component: Promotion, props: { newsletterPopup: false } }
]
})
const router = new VueRouter({
routes: [
{ path: "/search", component: SearchUser, props: (route) => ({ query: route.query.q }) }
]
})
HTML5 History 模式
const router = new VueRouter({
mode: "history",
routes: [...]
})
導航守衛
//前置守衛:確保要調用 next 方法,否則鉤子就不會被 resolved。
router.beforeEach((to, from, next) => {
// ...
})
//后置守衛
router.afterEach((to, from) => {
// ...
})
//解析守衛:在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之后,解析守衛就被調用
router.beforeResolve((to, from) => {
// ...
})
參數說明
//與全局前置守衛的方法參數是一樣的
const router = new VueRouter({
routes: [
{
path: "/foo",
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})
組件內的守衛
const Foo = {
template: `...`,
beforeRouteEnter (to, from, next) {
// 在渲染該組件的對應路由被 confirm 前調用
// 不!能!獲取組件實例 `this`
// 因為當守衛執行前,組件實例還沒被創建
},
beforeRouteUpdate (to, from, next) {
// 在當前路由改變,但是該組件被復用時調用
// 舉例來說,對于一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,
// 由于會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調用。
// 可以訪問組件實例 `this`
},
beforeRouteLeave (to, from, next) {
// 導航離開該組件的對應路由時調用
// 可以訪問組件實例 `this`
}
}
beforeRouteEnter (to, from, next) {
next(vm => {
// 通過 `vm` 訪問組件實例
})
}
解析流程
相關文章
Vue 筆記三:Vue2.0與1.0的區別
(原創)vue 學習筆記
vue2.0學習筆記(事件處理)
vue2.0學習筆記(表單輸入綁定)
vue2.0學習筆記(組件注冊)
Vue2.0 學習筆記
發表評論
0條評論
pumpkin9
男|高級講師
TA的文章
閱讀更多
tensorflow2.4.1
能讓你更早下班的Python垃圾回收機制
css 特殊屬性
JavaScript實現 滿天星 導航欄
使用H5新標簽重構舊項目時的思考
canvas 實現 github404動態效果
用PerformanceTiming來檢測頁面性能
前端必備基礎