日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue笔记整理与总结

發(fā)布時(shí)間:2025/3/21 vue 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue笔记整理与总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Vue

一、 簡介:(為什么使用vue)

1、 與angular相比優(yōu)點(diǎn):

a) api簡單,快速上手,學(xué)習(xí)成本低;
b) Angular 使用雙向綁定,Vue 也支持雙向綁定,不過為單向數(shù)據(jù)流,數(shù)據(jù)從父組件單向傳給子組件;
c) Vue.js 中指令和組件分得更清晰。指令只封裝 DOM 操作,而組件代表一個(gè)自給自足的獨(dú)立單元 —— 有自己的視圖和數(shù)據(jù)邏輯。在 Angular 中兩者有不少相混的地方
d) Angular的臟檢查機(jī)制,造成了如果項(xiàng)目龐大之后性能降低問題;每一次更新數(shù)據(jù),都導(dǎo)致所有的數(shù)據(jù)綁定,進(jìn)行一次遍歷;
Vue的數(shù)據(jù)變化更新是根據(jù)依賴追蹤的觀察系統(tǒng)并且異步列隊(duì)去更新,數(shù)據(jù)變化都是獨(dú)立的觸發(fā)隊(duì)列中相應(yīng)的事件;
e) 渲染層創(chuàng)建了虛擬dom(輕量級,2.0),減少了內(nèi)存開銷和加快了渲染速度;
f) 組件式開發(fā),每個(gè)組件都具有生命周期,便于自己狀態(tài)的維護(hù);實(shí)現(xiàn)了代碼的高復(fù)用性;

2、 與react相比:

λ 共同點(diǎn):
a) 使用 Virtual DOM
b) 提供了響應(yīng)式(Reactive)和組件化(Composable)的視圖組件
c) 將注意力集中保持在核心庫,而將其他功能如路由和全局狀態(tài)管理交給相關(guān)的庫
λ 優(yōu)勢:
″ 性能:
a) vue的更新渲染過程是自動(dòng)追蹤的,而react如果想要提高更新的性能需要通過shouldComponentUpdate鉤子函數(shù)對數(shù)據(jù)進(jìn)行對比;
b) 對于組件的語法,在vue中既可以支持jsx語法,將css和html都寫入js文件中,又可以使用template模板進(jìn)行編譯,在vue中推薦使用template模板進(jìn)行編譯,減少學(xué)習(xí)成本,更加符合前端開發(fā)語法;而react僅僅支持jsx語法,jsx的優(yōu)點(diǎn):一、開發(fā)工具對jsx的支持比其他的vue模板更先進(jìn);
c) 對于css的支持:
vue中可以直接在style中寫css語法,可以支持媒體查詢,等等一切css屬性,并且可以通過scoped進(jìn)行組件作用域的封閉;
react的組件中如果進(jìn)行css樣式的隔離,只能寫入js文件中,比較簡單的樣式可以進(jìn)行支持,但是如果比較復(fù)雜的則無法支持;
″ 規(guī)模:
共同點(diǎn):
都提供了路由和狀態(tài)管理機(jī)制;
都有自己的自動(dòng)化構(gòu)建工具;
不同點(diǎn):
react的學(xué)習(xí)成本比較高,需要掌握jsx語法和es2015;雖然支持前端babel進(jìn)行編譯,但是不適合生產(chǎn)環(huán)境;
vue向下擴(kuò)展可以像jq那樣使用在前端項(xiàng)目中,向上擴(kuò)展可以像react一樣進(jìn)行前端的自動(dòng)化構(gòu)建;
″ 本地渲染:(跨平臺(tái))
reactNative
weex

3、 總結(jié)vue:

優(yōu)點(diǎn):
a) MVVM的開發(fā)模式,從dom中解脫出來,雙向數(shù)據(jù)綁定;
b) 數(shù)據(jù)更新采用異步事件機(jī)制;
c) 采用單向數(shù)據(jù)流;
d) 組件式開發(fā);
e) 采用虛擬dom
f) 支持模板和jsx兩種開發(fā)模式;
g) 可以進(jìn)行服務(wù)端渲染;
h) 擴(kuò)展性強(qiáng),既可以向上又可以向下擴(kuò)展
缺點(diǎn):
a) 不兼容IE8以下版本
b) 生態(tài)圈不繁榮,開源社區(qū)不活躍;

二、 安裝與使用:

1、 直接使用CDN引入:

<script src="https://unpkg.com/vue&quot;></script>

2、 下載到本地:

https://vuejs.org/js/vue.js

3、 自動(dòng)化構(gòu)建工具:

Vue.js 有一款官方的腳手架生成工具 vue-cli:

λ 全局安裝
npm install –g vue-cli

λ 創(chuàng)建項(xiàng)目
vue init webpack myproject

λ 安裝依賴包
npm install

λ 目錄如下:
build: 用于存放 webpack 相關(guān)配置和腳本。
config: 主要存放配置文件,用于區(qū)分開發(fā)環(huán)境、測試環(huán)境、線上環(huán)境的不同。
src: 項(xiàng)目源碼及需要引用的資源文件。
static: 不需要 webpack 處理的靜態(tài)資源。
test: 用于存放測試文件;
λ 啟動(dòng)服務(wù):
正常開發(fā)時(shí),就會(huì)運(yùn)行命令npm run dev,啟動(dòng)一個(gè)小型的express 服務(wù)。在這個(gè) express 服務(wù)中,會(huì)使用webpack-dev-middleware 和 webpack-hot-middleware 這兩個(gè) 中間件,來進(jìn)行項(xiàng)目的熱部署,即每次修改 src 中的文件后,不需要再按瀏覽器的刷新來更新 代碼,啟動(dòng)的 server 服務(wù)會(huì)自動(dòng)監(jiān)聽文件的變化并編譯,通知瀏覽器自動(dòng)刷新。
λ 分析packjson文件:

"scripts": {"dev": "node build/dev-server.js","start": "node build/dev-server.js --open","build": "node build/build.js","e2e": "node test/e2e/runner.js","test": "npm run e2e","lint": "eslint --ext .js,.vue src test/e2e/specs"},

dev:為本地開發(fā)的啟動(dòng)項(xiàng);
start:和dev一樣;
build:打包線上部署代碼
e2e:這個(gè)代表端對端測試,確切的來說就是前端的一個(gè)自動(dòng)化測試;這里使用的是java的nightwatch自動(dòng)化測試工具,使用測試需要進(jìn)行java的全局安裝

三、 實(shí)例:

1、一個(gè) Vue 實(shí)例其實(shí)正是一個(gè) MVVM 模式中所描述的 ViewModel - 因此在文檔中經(jīng)常會(huì)使用 vm 這個(gè)變量名。
2、在實(shí)例化 Vue 時(shí),需要傳入一個(gè)選項(xiàng)對象,它可以包含數(shù)據(jù)、模板、掛載元素、方法、生命周期鉤子等選項(xiàng) ;
(1)模板:

三個(gè)屬性:template、el、replace(2.0)已經(jīng)刪除,規(guī)定template中必須有個(gè)根節(jié)點(diǎn);Replace:為true時(shí)不會(huì)保留原dom節(jié)點(diǎn),直接將原節(jié)點(diǎn)替換,如果是false則,保留原節(jié)點(diǎn)

(2)數(shù)據(jù):

可以對外部數(shù)據(jù)進(jìn)行代理,外部傳入的數(shù)據(jù)如果為對象,對此數(shù)據(jù)進(jìn)行的淺拷貝,此時(shí)我們成為數(shù)據(jù)的響應(yīng)式;對于初始化后,進(jìn)行的數(shù)據(jù)添加無效,要想對于初始后添加的數(shù)據(jù)生效,需要使用$set(),不過不推薦這么,盡量在數(shù)據(jù)初始化時(shí),就對所有需要的數(shù)據(jù)進(jìn)行添加,可以用undefined和null進(jìn)行占位;$watch方法對于實(shí)例對象的數(shù)據(jù)進(jìn)行監(jiān)聽,并在回掉中接受舊數(shù)據(jù)和新數(shù)據(jù);

(3)方法:

Methods對象來定義方法,并且使用v-on指令來監(jiān)聽DOM事件;自定義事件:$emit、$on、($broadcast、$dispatch在2.0中已經(jīng)刪除)

(4)生命周期:

在vue實(shí)例創(chuàng)建時(shí)一系列的初始化步驟:beforeCreate、created、beforeMount、mounted、beforeDestroy、destroyed 、beforeUpdate、updated、activated、deactivated (5)數(shù)據(jù)綁定:傳統(tǒng)的web項(xiàng)目,往往是通過后端模板引擎來進(jìn)行數(shù)據(jù)和視圖的渲染,例如:php的smarty、java的velocity、node的express、也就是傳統(tǒng)的服務(wù)端渲染,導(dǎo)致前后端語言混雜在一起,造成渲染后期進(jìn)行視圖更改是,只能通過dom;a、文本插值使用{{}}大括號,單次賦值:{{*}} (2.0中使用v-once=””) b、 屬性插值{{}} (2.0 v-bind:id=””)c、表達(dá)式{{}} (6)指令:

a、參數(shù):v-bind:src=”attr”,給屬性綁定值;
或者可以這樣寫:src=”{{attr}}”
或者可以這樣寫 :src=“attr”

b、v-on

四、 計(jì)算屬性:

####三種對于數(shù)據(jù)變化監(jiān)聽機(jī)制:
1、 computed:一個(gè)屬性依賴于多個(gè)屬性時(shí),推薦使用
2、 watch():多個(gè)屬性依賴一個(gè)屬性是,推薦使用
3、 Set、get:set對一個(gè)屬性設(shè)置值時(shí),會(huì)自動(dòng)的調(diào)用相應(yīng)的回掉函數(shù),get的回調(diào)函數(shù)會(huì)根據(jù),函數(shù)內(nèi)部依賴的屬性的改變而自動(dòng)改變

五、 條件渲染:

1、 v-if

2、 template v-if

如果在一個(gè)判斷中要對多個(gè)元素進(jìn)行渲染,則需要配合template標(biāo)簽;

3、 v-else

4、 v-else-if

多次進(jìn)行鏈?zhǔn)降氖褂?/p>

5、 key管理可復(fù)用的元素:

Vue 會(huì)盡可能高效地渲染元素,通常會(huì)復(fù)用已有元素而不是從頭開始渲染
在這里用key進(jìn)行元素的唯一標(biāo)識(shí)賦值,降低元素的復(fù)用性;

6、 v-if與v-show

v-if 是“真正的”條件渲染,因?yàn)樗鼤?huì)確保在切換過程中條件塊內(nèi)的事件監(jiān)聽器和子組件適當(dāng)?shù)乇讳N毀和重建
v-if 有更高的切換開銷,而 v-show 有更高的初始渲染開銷

7、 v-if與v-for一起使用

當(dāng) v-if 與 v-for 一起使用時(shí),v-for 具有比 v-if 更高的優(yōu)先級;如果想讓v-if優(yōu)先級更高,則需要在外套一層標(biāo)簽;進(jìn)行v-if的渲染

六、 列表渲染:

A、數(shù)組:

1、 常用寫法:
v-for=”item in items”
v-for=”(item,index) in items”
2、 結(jié)合template使用:
帶有 v-for 的 <template> 標(biāo)簽來渲染多個(gè)元素塊

B、對象:

1、 常用寫法:
v-for="value in object"
v-for="(value, key) in object"
v-for="(value, key, index) in object"

C、整數(shù)迭代:

1、 常用寫法:
v-for="n in 10"

D、組件:

1、 常用寫法:
<my-component v-for="item in items" :key="item.id"></my-component>

E、key:

當(dāng) Vue.js 用 v-for 正在更新已渲染過的元素列表時(shí),它默認(rèn)用 “就地復(fù)用” 策略,默認(rèn)的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時(shí) DOM 狀態(tài)。為了給 Vue 一個(gè)提示,以便它能跟蹤每個(gè)節(jié)點(diǎn)的身份,從而重用和重新排序現(xiàn)有元素,你需要為每項(xiàng)提供一個(gè)唯一 key 屬性。
注:如果加key值,列表重新渲染的元素,是從key變化的第一個(gè)元素起到key值變化的最后一個(gè)元素結(jié)束,中間所有的元素都是重新渲染,不管中間元素的key值變化與否;

F、變異方法,觸發(fā)視圖更新:

Push、pop、shift、unshift、splice、sort、reverse

G、重塑數(shù)組、顯示過濾/排序結(jié)果

對于非變異的數(shù)組方法,在操作數(shù)組時(shí),一般是采用重新賦值的方式,操作做完原數(shù)組,再將結(jié)果賦給原屬性;如:filter、concat、slice

evenNumbers: function () {return this.numbers.filter(function (number) {return number % 2 === 0}) }

七、 方法與事件:

1、 方法處理器:

v-on 指令監(jiān)聽 DOM 事件

2、 內(nèi)聯(lián)語句處理器:

方法的調(diào)用方式,可以直接出入?yún)?shù),或$event當(dāng)前事件傳入

3、 事件修飾符:

.stop:等同于調(diào)用event.stopPropagetion()
.prevent:等同于調(diào)用event.preventDefault()
.capture:使用capture模式添加事件監(jiān)聽器,使用事件捕獲模式
.self:只當(dāng)事件是從監(jiān)聽元素本身時(shí)才會(huì)觸發(fā)回調(diào);
.once:事件將只會(huì)觸發(fā)一次;

4、 按鍵修飾符:

KeyCode: (鍵值)
<input v-on:keyup.13="submit">
按鍵別名:
enter、tab、delete、esc、space、up、down、left、right

八、 表單控件綁定:

1、 v-model 會(huì)忽略所有表單元素的 value、checked、selected 特性的初始值。

2、 text、textarea

3、 復(fù)選框:

單選:(值為true/false)
<input type="checkbox" id="checkbox" v-model="checked">
多選:(值為數(shù)組格式,數(shù)組中每一項(xiàng)為input的value值)
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<input type="checkbox" id="john" value="John" v-model="checkedNames">

4、 單選按鈕

值為字符串,當(dāng)前選中元素的value值;
<input type="radio" id="one" value="One" v-model="picked">
<input type="radio" id="two" value="Two" v-model="picked">

5、 選擇列表

單選列表:(值為字符串)
<select v-model="selected">

<option disabled value="">請選擇</option> <option>A</option> <option>B</option> <option>C</option>

</select>
注:如果 v-model 表達(dá)初始的值不匹配任何的選項(xiàng),<select> 元素就會(huì)以”未選中”的狀態(tài)渲染。在 iOS 中,這會(huì)使用戶無法選擇第一個(gè)選項(xiàng),因?yàn)檫@樣的情況下,iOS 不會(huì)引發(fā) change 事件。因此,像以上提供 disabled 選項(xiàng)是建議的做法

多選列表:
a) 值為一個(gè)數(shù)組格式
b) 多選時(shí),需要ctrl配合
c) 無實(shí)際意義
d) 比單選列表多一個(gè)multiple屬性
<select v-model="selected" multiple style="width: 50px">

<option>A</option> <option>B</option> <option>C</option>

</select>

6、 綁定value:

(當(dāng)單選或復(fù)選框選中時(shí),此時(shí)的model值一般為boolen值,但是根據(jù)業(yè)務(wù)需求,有時(shí)我們需要?jiǎng)討B(tài)綁定值,用法如下)
a) 復(fù)選框:
<input type="checkbox" v-model="toggle" v-bind:true-value="a" v-bind:false-value="b">
// 當(dāng)選中時(shí)
vm.toggle === vm.a
// 當(dāng)沒有選中時(shí)
vm.toggle === vm.b
b) 單選框:
<input type="radio" v-model="pick" v-bind:value="a">
// 當(dāng)選中時(shí)
vm.pick === vm.a

7、 修飾符

lazy:在 change 事件中同步
number:自動(dòng)將用戶的輸入值轉(zhuǎn)為 Number 類型
trim:自動(dòng)過濾用戶輸入的首尾空格

九、 過渡:

通過 Vue.js 的過渡系統(tǒng),可以在元素從 DOM 中插入或移除時(shí)自動(dòng)應(yīng)用過渡效果。Vue.js 會(huì)在適當(dāng)?shù)臅r(shí)機(jī)為你觸發(fā) CSS 過渡或動(dòng)畫,你也可以提供相應(yīng)JavaScript 鉤子函數(shù)在過渡過程中執(zhí)行自定義的 DOM 操作。

1、 經(jīng)常使用工具:

在 CSS 過渡和動(dòng)畫中自動(dòng)應(yīng)用 class
可以配合使用第三方 CSS 動(dòng)畫庫,如 Animate.css
在過渡鉤子函數(shù)中使用 JavaScript 直接操作 DOM
可以配合使用第三方 JavaScript 動(dòng)畫庫,如 Velocity.js

2、 Vue 提供了 transition 的封裝組件,與下面情況一起使用:

v-if
v-show
動(dòng)態(tài)組件 (介紹見組件)
在組件的根節(jié)點(diǎn)上,并且被 Vue 實(shí)例 DOM 方法(如 vm.$appendTo(el))觸發(fā)。

3、 vue對transition組件的處理方式:

a) 自動(dòng)嗅探目標(biāo)元素是否應(yīng)用了 CSS 過渡或動(dòng)畫,如果是,在恰當(dāng)?shù)臅r(shí)機(jī)添加/刪除 CSS 類名。
b) 如果過渡組件提供了 JavaScript 鉤子函數(shù),這些鉤子函數(shù)將在恰當(dāng)?shù)臅r(shí)機(jī)被調(diào)用
c) 如果沒有找到 JavaScript 鉤子并且也沒有檢測到 CSS 過渡/動(dòng)畫,DOM 操作(插入/刪除)在下一幀中立即執(zhí)行。

4、 類名的添加和切換取決于 transition 特性的值。比如 <transition name="fade">,會(huì)有六個(gè) CSS 類名:

A. 當(dāng)dom插入時(shí):
1) fade-enter: 定義進(jìn)入過渡的開始狀態(tài)。在元素被插入時(shí)生效,在下一個(gè)幀移除
2) fade-enter-active: 定義過渡的狀態(tài)。在元素整個(gè)過渡過程中作用,在元素被插入時(shí)生效,在 transition/animation 完成之后移除。 這個(gè)類可以被用來定義過渡的過程時(shí)間,延遲和曲線函數(shù)。
3) fade-enter-to: 2.1.8版及以上 定義進(jìn)入過渡的結(jié)束狀態(tài)。在元素被插入一幀后生效(于此同時(shí) v-enter 被刪除),在 transition/animation 完成之后移除。
B. 當(dāng)dom移除時(shí):
1) fade-leave: 定義離開過渡的開始狀態(tài)。在離開過渡被觸發(fā)時(shí)生效,在下一個(gè)幀移除。
2) fade-leave-active: 定義過渡的狀態(tài)。在元素整個(gè)過渡過程中作用,在離開過渡被觸發(fā)后立即生效,在 transition/animation 完成之后移除。 這個(gè)類可以被用來定義過渡的過程時(shí)間,延遲和曲線函數(shù)。
3) fade-leave-to: 2.1.8版及以上 定義離開過渡的結(jié)束狀態(tài)。在離開過渡被觸發(fā)一幀后生效(于此同時(shí) v-leave 被刪除),在 transition/animation 完成之后移除。

注:如果一個(gè)動(dòng)畫在dom插入和刪除時(shí)執(zhí)行的效果正好相反,則只需要將v-enter和v-leave-to的樣式設(shè)置成一樣就可以;不需要對v-enter-to和v-leave進(jìn)行設(shè)置,對于v-enter-active和v-leave-active可以進(jìn)行相應(yīng)的過渡時(shí)間和過渡曲線的設(shè)置;

5、 通過css的animation屬性來實(shí)現(xiàn)過渡的效果:

CSS 動(dòng)畫用法同 CSS 過渡,區(qū)別是在動(dòng)畫中 v-enter 類名在節(jié)點(diǎn)插入 DOM 后不會(huì)立即刪除,而是在 animationend 事件觸發(fā)時(shí)刪除;

注:對于animation的使用,可以直接在定義一個(gè)動(dòng)畫,然后再v-enter-active和v-leave-active中用animation屬性定義動(dòng)畫的曲線和時(shí)間即可;

6、 自定義過渡類名結(jié)合第三方動(dòng)畫庫如Animate.css:

http://cdn.bootcss.com/animat...

自定義的類名屬性有:
enter-class
enter-active-class
enter-to-class (2.1.8+)
leave-class
leave-active-class
leave-to-class (2.1.8+)

注:他們的優(yōu)先級高于普通的類名;
使用方法:
將上述屬性添加到transition元素上,屬性值為第三方庫的動(dòng)畫名,可以不書寫name屬性定義的過渡名稱,一般只使用enter-active-class和leave-active-class就可以滿足需求書寫方式:
注:屬性值中一定要加入animated屬性值,否則不生效;
如:
enter-active-class="animated bounce"

7、 css樣式中與第三方動(dòng)畫庫的結(jié)合:

將動(dòng)畫定義到v-enter-active和v-leave-active類名上:
如:

.animations-enter-active,.animations-leave-active {animation: bounce 1s;}

8、 同時(shí)使用transitions和animations時(shí)顯示的聲明過渡類型

Vue 為了知道過渡的完成,dom要顯示原有的樣式,必須設(shè)置相應(yīng)的事件監(jiān)聽器,它可以是 transitionend 或 animationend ,這取決于給元素應(yīng)用的 CSS 規(guī)則。如果你使用其中任何一種,Vue 能自動(dòng)識(shí)別類型并設(shè)置監(jiān)聽。
有時(shí)候同時(shí)使用transition 和animation ,而執(zhí)行完畢的時(shí)間不統(tǒng)一,會(huì)造成后者無法將動(dòng)畫執(zhí)行完畢,此時(shí)可以用type屬性在transition元素上進(jìn)行相應(yīng)的設(shè)置需要 Vue 監(jiān)聽的類型,屬性值為transition 或animation

9、 顯示定義過渡效果的持續(xù)時(shí)間

應(yīng)用場景:
Vue 會(huì)等待其在過渡效果的根元素第一個(gè) transitionend 或 animationend 事件觸發(fā)后,結(jié)束過渡效果;一些嵌套的內(nèi)部元素相比于過渡效果的根元素有延遲的或更長的過渡效果。
使用方式:
<transition :duration="1000">...</transition>
<transition :duration="{ enter: 500, leave: 800 }">...</transition>

10、 js中的鉤子函數(shù)

beforeEnter、enter、afterEnter、enterCancelled、beforeLeave、leave、afterLeave、leaveCancelled

結(jié)合第三方j(luò)s動(dòng)畫庫:<script src="https://cdnjs.cloudflare.com/...;></script>
動(dòng)畫的書寫格式:
Velocity的參數(shù):第一個(gè)為動(dòng)畫掛載的元素,第二個(gè)為定義的動(dòng)畫css樣式,第三個(gè)參數(shù)為動(dòng)畫的時(shí)間或者回調(diào)函數(shù)
如:
Velocity(el,{fontSize:’1.5em’},{duration:300,complete:done})

常用鉤子函數(shù)為:beforeEnter 、enter、beforeLeave 、leave分別定義,元素進(jìn)入時(shí)的動(dòng)畫和元素離開時(shí)的動(dòng)畫;
beforeEnter:定義元素進(jìn)入時(shí)的初始樣式;
enter:定義元素進(jìn)入過程的動(dòng)畫樣式(一般第三方庫的動(dòng)畫使用在此鉤子中)
beforeLeave:定義元素離開是的初始樣式;
leave:定義元素離開過程的動(dòng)畫樣式(一般第三方庫的動(dòng)畫使用在此鉤子中)
注:一定注意在enter、leave鉤子中一定使用done的方法的調(diào)用,否則動(dòng)畫將無效;

11、 初始渲染的過渡;

通過appear屬性的添加實(shí)現(xiàn)初始渲染的過渡

12、 在一個(gè)transition元素中對多個(gè)標(biāo)簽動(dòng)畫的實(shí)現(xiàn):

需要給每一個(gè)元素添加一個(gè)key標(biāo)簽,防止元素的復(fù)用(不產(chǎn)生任何動(dòng)畫)
過渡模式:
場景:在兩個(gè)元素的切換過程中,進(jìn)入元素和離開元素的過渡同時(shí)進(jìn)行,將會(huì)導(dǎo)致效果偏差;
解決:
可以在過渡的標(biāo)簽上添加過渡模式:(mode)
in-out: 新元素先進(jìn)行過渡,完成之后當(dāng)前元素過渡離開。(一般不用)
out-in: 當(dāng)前元素先進(jìn)行過渡,完成之后新元素過渡進(jìn)入。

13、 多個(gè)組件的過渡

一般使用動(dòng)態(tài)組件的方式實(shí)現(xiàn)不同組件間的切換,然后在切換過程中實(shí)現(xiàn)過渡效果;
注:動(dòng)態(tài)組件的切換不存在標(biāo)簽的復(fù)用問題

14、 列表過渡:

1) 列表的進(jìn)入和離開過渡
使用transition-group組件,不同于transition組件,會(huì)以一個(gè)真實(shí)元素呈現(xiàn),默認(rèn)為span元素,也可以通過tag特性更換為其他元素;
內(nèi)部元素必須提供唯一的key值
2) 列表的位移過渡
v-move特性可以在元素的改變定位的過程中應(yīng)用,可以通過name屬性自定義前綴,也可以通過move-class手動(dòng)設(shè)置

十、 組件

組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。

(一) 組件注冊:

組件構(gòu)造器:Vue.extend({ }),2.0中可以不使用構(gòu)造器進(jìn)行構(gòu)造,直接寫入對象;
規(guī)則:對于自定義標(biāo)簽名,Vue.js 不強(qiáng)制要求遵循 W3C 規(guī)則 (小寫,并且包含一個(gè)短杠),盡管遵循這個(gè)規(guī)則比較好
1、 全局注冊:
全局注冊需要在根實(shí)例初始化前注冊,這樣才能使組件在任意實(shí)例中被使用,方式:Vue.component(“組件名”,組件)
2、 局部注冊:
組件只能在被注冊的組件中使用,而無法在其他組件中使用.
3、 注冊語法糖:
全局注冊和局部注冊(使用components屬性,值為對象,組件名和組件定義對象是鍵值對的關(guān)系);

(二) 組件選項(xiàng):

1、 template:注意分析模板,is使用;

2、 el和data兩個(gè)屬性,不可以直接賦值,比如data如果直接賦值,組件使用多次的時(shí)候,多個(gè)組件將公用一個(gè)對象;如果一個(gè)改變,則所有都會(huì)改變;所以使用function方式,每次return出一個(gè)新的對象;el類似;由于el很少直接在組件中掛載,所以可以忽略;
3、 props:
組件間的作用域是孤立的,這里跟angular的指令作用域有所不同,angular指令的默認(rèn)作用域是公用的,不管是在子指令還是父指令中定義的;在vue中,props起到了父組件向下與子組件間的橋梁作用;子組件給父組件發(fā)送消息,需要events;
ν 駝峰命名:html的屬性不區(qū)分大小寫;

ν 動(dòng)態(tài)props:
通過v-bind進(jìn)行綁定;
如果要進(jìn)行數(shù)值的傳遞,必須通過動(dòng)態(tài)綁定,否則直接傳遞過去的是個(gè)字符串;
ν props的接受:
在子組件中使用props屬性進(jìn)行接受,props的值可以為數(shù)組(不可做校驗(yàn)),可以為對象(可以做校驗(yàn))
ν props數(shù)據(jù)的處理:
不應(yīng)該在子組件中進(jìn)行prop值的改變,因?yàn)閜rop的值是隨父組件進(jìn)行更變,如果在組件中直接對prop進(jìn)行改變,vue則會(huì)拋出警告
正確的處理方式:
a) 定義一個(gè)局部變量,并用 prop 的值初始化它:(只會(huì)在初始化時(shí),進(jìn)行一次賦值,后期不會(huì)動(dòng)態(tài)改變)
props: ['initialCounter'],

data: function () {return { counter: this.initialCounter } }

b) 定義一個(gè)計(jì)算屬性,處理prop的值并返回:(進(jìn)行屬性值的動(dòng)態(tài)跟蹤)
props: ['size'],

computed: {normalizedSize: function () {return this.size.trim().toLowerCase()} }

ν 綁定類型:
1) 默認(rèn)時(shí)一直跟隨父組件值得變化而變化,
2) .sync:雙向綁定(取消);在2.3.0以后,再次以事件監(jiān)聽實(shí)現(xiàn)雙向數(shù)據(jù)流;如:
父組件:
<comp :foo="bar" @updata="val => bar = val"></comp>
子組件:
this.$emit('update:foo', newValue)
3) .once:單次綁定,子組件接受一次父組件傳遞的數(shù)據(jù)后,單獨(dú)對這份數(shù)據(jù)進(jìn)行維護(hù);(2.0版本后取消此修飾符)
注:如果prop傳遞的是一個(gè)引用類型的數(shù)據(jù),如對象或數(shù)組,即使單向綁定,子組件也會(huì)影響父組件;(傳遞為單向傳遞)
ν Props驗(yàn)證:
1) 基礎(chǔ)類型檢測:prop:Number,接受的參數(shù)為原生的構(gòu)造器:String、Number、Boolen、Function、Object、Aarry、Symbol、Null(意味著任何類型都行)
2) 可以為多種類型:props:[Number,String]
3) 參數(shù)必須:props:{type:Number,required:true} 對象的寫法
4) 參數(shù)默認(rèn):props {type:Number,default:0} 對象的寫法
5) 綁定類型:props:{twoWay:true} 校驗(yàn)數(shù)據(jù)綁定類型,如果非雙向綁定會(huì)拋出一條警告;(這個(gè)不用了)
6) 自定義驗(yàn)證函數(shù):props:{validator:function(val){ return val>1},這樣就可以驗(yàn)證一個(gè)數(shù)值是否大于1;

(三) 非Prop屬性:

1、 在組件上使用自定義屬性,如果不在子組件中使用props進(jìn)行接受,則此屬性會(huì)被默認(rèn)添加到組件的根元素上;
2、 在組件上使用html元素已有的屬性,如class、style等,則組件上的屬性值,會(huì)和組件的根節(jié)點(diǎn)的相應(yīng)屬性值進(jìn)行合并等特性;如type等屬性值,會(huì)進(jìn)行覆蓋或替換;如:組件中的input的type為number,使用組件時(shí)傳入的type值為text,則組件內(nèi)部的input的type值將被替換為text;

(四) 組件間通信:

1、 直接訪問:
1)?父組件實(shí)例children:包含所有子組件實(shí)例
3)?:組件所在的根實(shí)例;這三個(gè)屬性都掛載在組件的上,不推薦這樣做,會(huì)造成父子組件間的強(qiáng)耦合;、自定義事件監(jiān)聽:組件實(shí)例化時(shí),在組件的標(biāo)簽上使用進(jìn)行事件的監(jiān)聽;、自定義事件觸發(fā)機(jī)制:emit:在實(shí)例本身上觸發(fā)事件在子組件的鉤子函數(shù)中去觸發(fā)事件;
4、 子組件索引:
通過ref指令,綁定一個(gè)子組件,可以在父組件中使用this.$refs.屬性名 的方式獲取子組件;
5、 非父子通信:
思想:建立一個(gè)空的vue實(shí)例作為中央事件總線,即全局的vue實(shí)例;
代碼如下:

var bus = new Vue() // 觸發(fā)組件 A 中的事件 bus.$emit('id-selected', 1) // 在組件 B 創(chuàng)建的鉤子中監(jiān)聽事件 bus.$on('id-selected', function (id) {// ... })

(五) 內(nèi)容分發(fā):

1、 基礎(chǔ)用法:
提供一種混合父組件內(nèi)容與子組件自己模板的方式叫做內(nèi)容分發(fā);
Slot標(biāo)簽;
2、 使用需求:
當(dāng)子組件中的dom結(jié)構(gòu)以及展示的內(nèi)容由父組件決定時(shí)
3、 編譯作用域:
如果在子組件的模板中使用{{}}解析數(shù)據(jù),則模板會(huì)解析自己作用域中的數(shù)據(jù),而不是解析父組件作用中的數(shù)據(jù);
4、 默認(rèn)slot:
<slot>標(biāo)簽允許有一個(gè)匿名slot,不需要name值,作為找不到匹配的內(nèi)容片段的回退插槽,如果沒有默認(rèn)的slot,這些找不到匹配的內(nèi)容片段將被忽略;
5、 作用域插槽:
在父組件的slot模板中使用子組件中數(shù)據(jù);如:

//子組件 <div class="child"><slot text="hello from child"></slot> </div> //父組件 <div class="parent"><child><template scope="props"><span>hello from parent</span><span>{{ props.text }}</span></template></child> </div>

在父級中,具有特殊屬性 scope 的 <template> 元素必須存在,表示它是作用域插槽的模板。scope 的值對應(yīng)一個(gè)臨時(shí)變量名,此變量接收從子組件中傳遞的 props 對象;
在slot中可以動(dòng)態(tài)綁定屬性值,綁定的屬性需要在父組件的scope中進(jìn)行顯示聲明;

(六) 動(dòng)態(tài)組件:

1、基礎(chǔ)用法:
component 標(biāo)簽上 is 屬性決定了當(dāng)前采用的子組件,:is 是 v-bind:is 的縮寫,綁定了父 組件中 data 的 currentView 屬性。頂部的 ul 則起到導(dǎo)航的作用,點(diǎn)擊即可修改 currentView 值,也就修改 component 標(biāo)簽中使用的子組件類型,需要注意的事,currentView 的值需要 和父組件實(shí)例中的 components 屬性的 key 相對應(yīng)。(起到路由的作用)
2、keep-alive
在component 標(biāo)簽外層包裹一個(gè) keep-alive 標(biāo)簽,可以將切換出去的組件保留在內(nèi)存中,避免重新 渲染。

(七) 雜項(xiàng):

1、 異步組件:
局部定義組件寫法:

new Vue({components: { //使用webpack+es6'my-component': () => import('./my-async-component') //使用webpack+es5 'my-component': require(['./my-async-component'], resolve)} }) 使用webpack + es5的寫法:

2、 當(dāng)注冊組件 (或者 props) 時(shí),可以使用 kebab-case,camelCase,或 PascalCase。但是使用組件時(shí)只能用kebab-case這種寫法;html不識(shí)別大小寫;
3、 當(dāng)組件中包含大量靜態(tài)內(nèi)容時(shí),可以考慮使用 v-once 將渲染結(jié)果緩存起來

Vue.component('terms-of-service', {template: '\<div v-once>\<h1>Terms of Service</h1>\... a lot of static content ...\</div>\' })

4、 X-Templates
另一種定義模版的方式是在 JavaScript 標(biāo)簽里使用 text/x-template 類型
<script type="text/x-template" id="hello-world-template">
<p>Hello hello hello</p>
</script>

十一、 指令

1、 內(nèi)置指令:

1) V-bind
2) V-model
3) V-if/ v-else-if/v-else/v-show
4) V-for
5) V-on
6) V-text
7) V-html
8) v-pre 指令相對簡單,就是跳過編譯這個(gè)元素和子元素,顯示原始的 {{}}Mustache 標(biāo) 簽,用來減少編譯時(shí)間。
9) v-cloak 指令相當(dāng)于在元素上添加了一個(gè) [v-cloak] 的屬性,直到關(guān)聯(lián)的實(shí)例結(jié)束編譯。 官方推薦可以和 css 規(guī)則 [v-cloak]{ display :none } 一起使用,可以隱藏未編譯的 Mustache 標(biāo)簽直到實(shí)例準(zhǔn)備完畢
10) v-once 指令是 Vue.js 2.0 中新增的內(nèi)置指令,用于標(biāo)明元素或組件只渲染一次,即使隨 后發(fā)生綁定數(shù)據(jù)的變化或更新,該元素或組件及包含的子元素都不會(huì)再次被編譯和渲染。

2、 自定義指令基礎(chǔ):

1) 注冊:通過 Vue.directive(id, definition) 方法注冊一個(gè)全局自定義指令,接收參數(shù) id 和定義對象。id 是指令的唯一標(biāo)識(shí),定義對象則是指令的相關(guān)屬性及鉤子函數(shù)。
也可以通過在組件的 directives 選項(xiàng)注冊一個(gè)局部的自定 義指令
2) 指令的定義對象:
主要包含鉤子函數(shù):
bind: 只被調(diào)用一次,在指令第一次綁定到元素上時(shí)調(diào)用。用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作。
inserted: 被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用(父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)。
update : 所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其孩子的 VNode 更新之前。指令的值可能發(fā)生了改變也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新
componentUpdated: 所在組件的 VNode 及其孩子的 VNode 全部更新時(shí)調(diào)用。
unbind :指令從元素上解綁時(shí)調(diào)用,只調(diào)用一次。
注:如果我們只需要使用 update 函數(shù)時(shí),可以直接傳入一個(gè)函數(shù)代替定義對象;
指令綁定的值:
a) data 中的屬性,使用<div v-my-directive="constant string"/></div>
b) 綁定字符串需要加單引號,<div v-my-direcitve="'constant string'"></div>
c) 利用字面修飾符后無需使用單引號

<div v-my-directive.literal="constant string"></div>

d) 受對象字面量或任意合法的 JavaScript 表達(dá)式:

<div v-my-directive="{ title : 'Vue.js', author : 'You'}" ></div> <div v-my-directive="isExist ? 'yes' : 'no'" ></div>

3) 指令的實(shí)例屬性:
a) el: 指令所綁定的元素,可以用來直接操作 DOM 。
b) binding: 一個(gè)對象,包含以下屬性:
name: 指令名,不包括 v- 前綴。
value: 指令的綁定值, 例如: v-my-directive="1 + 1", value 的值是 2。
oldValue: 指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
expression: 綁定值的表達(dá)式形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
arg: 傳給指令的參數(shù)。例如 v-my-directive:foo, arg 的值是 "foo"。
modifiers: 一個(gè)包含修飾符的對象。 例如: v-my-directive.foo.bar, 修飾符對象 modifiers 的值是 { foo: true, bar: true }。
c) vnode: Vue 編譯生成的虛擬節(jié)點(diǎn),查閱 VNode API 了解更多詳情。
d) oldVnode: 上一個(gè)虛擬節(jié)點(diǎn),僅在 update 和 componentUpdated 鉤子中可用。

3、 指令與組件的區(qū)別:

組件一般是指一個(gè)獨(dú)立實(shí)體,組件之間的關(guān)系通常都是樹狀。
指令是一種Decorator模式,用以改寫某個(gè)組件的默認(rèn)行為,或者增強(qiáng)使其獲得額外功能,一般來說可以在同一個(gè)組件上疊加若干個(gè)指令,使其獲得多種功能。

十二、 vue-route

(一) 基本用法:

1、 router-link:

a) <router-link> 組件支持用戶在具有路由功能的應(yīng)用中(點(diǎn)擊)導(dǎo)航。 通過 to 屬性指定目標(biāo)地址,默認(rèn)渲染成帶有正確鏈接的?標(biāo)簽,可以通過配置 tag 屬性生成別的標(biāo)簽,<router-link> 比起寫死的?會(huì)好一些;
b) props:路由參數(shù):
to:格式為字符串或者是對象;
寫法:

<router-link to="home">Home</router-link> <router-link :to="'home'">Home</router-link> <router-link :to="{ path: 'home' }">Home</router-link><router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link><router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link> replace: 設(shè)置 replace 屬性的話,當(dāng)點(diǎn)擊時(shí),會(huì)調(diào)用 router.replace() 而不是 router.push(),于是導(dǎo)航后不會(huì)留下 history 記錄

append: 在當(dāng)前(相對)路徑前添加基路徑。例如,我們從 /a 導(dǎo)航到一個(gè)相對路徑 b,如果沒有配置 append,則路徑為 /b,如果配了,則為 /a/b
注:另一個(gè)路徑不允許加/;

tag:將touter-link轉(zhuǎn)換為另外一種標(biāo)簽;

active-class:設(shè)置 鏈接激活時(shí)使用的 CSS 類名。默認(rèn)值可以通過路由的構(gòu)造選項(xiàng) linkActiveClass 來全局配置。

2、 router-view

渲染對應(yīng)的路由配置中 components 下的相應(yīng)組件;可以和<transition> 、 <keep-alive>等配合使用,兩個(gè)結(jié)合一起用,要確保在內(nèi)層使用 <keep-alive>:
<transition>
<keep-alive>

<router-view></router-view>

</keep-alive>
</transition>

3、 路由信息對象:

路由信息對象表示當(dāng)前激活的路由的狀態(tài)信息,是不可變得,每次成功的導(dǎo)航都會(huì)產(chǎn)生一個(gè)新的對象;
出現(xiàn)的地方:
λ 組件內(nèi)部的鉤子函數(shù)中;
λ 導(dǎo)航的鉤子函數(shù)中
λ watch監(jiān)聽的$route對象中的(to,from)參數(shù):
例:

watch: {'$route' (to, from) {} }

scrollBehavior 方法的參數(shù)
路由信息對象的屬性:
$route.path:字符串,對應(yīng)當(dāng)前路由的路徑,總是解析為絕對路徑,如 "/foo/bar"。

:包含了動(dòng)態(tài)片段和全匹配片段,如果沒有路由參數(shù),就是一個(gè)空對象。route.query:一個(gè) key/value 對象,表示 URL 查詢參數(shù)。例如,對于路徑 /foo?user=1,則有?,如果沒有查詢參數(shù),則是個(gè)空對象。route.matched:一個(gè)數(shù)組,包含當(dāng)前路由的所有嵌套路徑片段的 路由記錄 。路由記錄就是 routes 配置數(shù)組中的對象副本(還有在 children 數(shù)組)
$route.name:當(dāng)前路由的名稱

4、 router構(gòu)造配置

mode: 配置路由模式:hash | history | abstract
base:應(yīng)用的基路徑。例如,如果整個(gè)單頁應(yīng)用服務(wù)在 /app/ 下,然后 base 就應(yīng)該設(shè)為 "/app/"。(這里有坑)
linkActiveClass: 全局配置 <router-link> 的默認(rèn)『激活 class 類名

5、 router實(shí)例:

屬性:
router.app: 配置了 router 的 Vue 根實(shí)例。
router.mode: 路由使用的 模式。
router.currentRoute:當(dāng)前路由信息對象;

方法:
router.push(location) :進(jìn)行路由的跳轉(zhuǎn),并且保存到瀏覽器的history中
router.replace(location):進(jìn)行路由的替換,不會(huì)將上次的路由保存到history中
router.go(n):執(zhí)行瀏覽器的前進(jìn)動(dòng)作,n代表前進(jìn)的步數(shù),負(fù)數(shù)代表后退
router.back(): 執(zhí)行瀏覽器的后退動(dòng)作
router.forward()
router.addRoutes(routes): 動(dòng)態(tài)添加更多的路由規(guī)則。參數(shù)必須是一個(gè)符合 routes 選項(xiàng)要求的數(shù)組

6、 動(dòng)態(tài)路由匹配:

書寫方式:

{ path: '/user/:id', component: User } { path: '/user/:username/post/:post_id', component: User }

上述的動(dòng)態(tài)值通過?去接受路由參數(shù)的變化:使用路由參數(shù)時(shí),例如從導(dǎo)航到,原來的組件實(shí)例會(huì)被復(fù)用。因?yàn)閮蓚€(gè)路由都渲染同個(gè)組件,比起銷毀再創(chuàng)建,復(fù)用則顯得更加高效。不過,這也意味著組件的生命周期鉤子不會(huì)再被調(diào)用;解決辦法:(監(jiān)測變化)route 對象:

7、 嵌套路由:

在 VueRouter 的參數(shù)中使用 children 配置,屬性值為路由對象數(shù)組;
注意:在子路由的path屬性中設(shè)置路由地址時(shí),不可以加“/”,否則將會(huì)以根路由進(jìn)行添加;

8、 多視圖多組件渲染:

多視圖對應(yīng)多組件,使用的路由對象屬性為:components;
例:
html:
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>
js:

{path: '/',components: {default: Foo,a: Bar,b: Baz} }

9、 重定向:

屬性為redirect,屬性值可以為{name:“foo”}或“foo”或者為一個(gè)方法的返回值
例:
{ path: '/a', redirect: { name: 'foo' }}

10、 別名:

例:{ path: '/a', component: A, alias: '/b' }
當(dāng)用戶訪問/b時(shí),路由顯示的是/b,其實(shí)規(guī)則為/a

11、 路由的鉤子函數(shù):

1) 全局鉤子:(一般不使用)
使用router的實(shí)例對象進(jìn)行注冊;當(dāng)一個(gè)導(dǎo)航觸發(fā)時(shí),全局的 beforeEach鉤子按照創(chuàng)建順序調(diào)用。鉤子是異步解析執(zhí)行,此時(shí)導(dǎo)航在所有鉤子 resolve 完之前一直處于 等待中
三個(gè)參數(shù):
next(): 進(jìn)行管道中的下一個(gè)鉤子
next(false): 中斷當(dāng)前的導(dǎo)航。重置到 from 路由對應(yīng)的地址
next('/') 或next({ path: '/' }):當(dāng)前導(dǎo)航被中斷,重定向到另一個(gè)新的導(dǎo)航:
例:
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {})

2) 路由的獨(dú)享鉤子:
在路由的配置項(xiàng)中定義:beforeEnter屬性;

{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {}}

3) 組件內(nèi)的路由鉤子:
beforeRouteEnter:路由跳轉(zhuǎn)之前執(zhí)行,不能獲取this,組件實(shí)例還沒有創(chuàng)建;
beforeRouteUpdate:路由重新跳轉(zhuǎn)之前,該方法在組件復(fù)用時(shí)調(diào)用,該鉤子函數(shù)中可以訪問組件的實(shí)例this
beforeRouteLeave:離開該組件的對應(yīng)路由時(shí)調(diào)用,可以訪問實(shí)例this,一般在用戶未保存信息時(shí),不允許跳轉(zhuǎn)相應(yīng)的路由,next(false)阻止;

關(guān)于beforeRouteEnter鉤子不能訪問this,可以通過一個(gè)回調(diào)給next來訪問組件實(shí)例,例:

beforeRouteEnter (to, from, next) {next(vm => {// 通過 `vm` 訪問組件實(shí)例}) }

12、 數(shù)據(jù)的獲取

1) 導(dǎo)航完成之后獲取:先完成導(dǎo)航,然后在接下來的組件生命周期鉤子中獲取數(shù)據(jù)。在數(shù)據(jù)獲取期間顯示『加載中』之類的指示。
2) 導(dǎo)航完成之前獲取:導(dǎo)航完成前,在路由的 enter 鉤子中獲取數(shù)據(jù),在數(shù)據(jù)獲取成功后執(zhí)行導(dǎo)航。
注:
導(dǎo)航完成之后獲取需要借助組件的watch屬性,在動(dòng)態(tài)路由中組件復(fù)用時(shí),進(jìn)行數(shù)據(jù)的重新請求;
導(dǎo)航完成之前獲取借助beforeRouteUpdate, 在動(dòng)態(tài)路由中組件復(fù)用時(shí),進(jìn)行數(shù)據(jù)的重新請求;

13、 組件的懶加載

1、 vue的異步組件和webpack的require.ensure()相結(jié)合,例:

var index = resolve => require.ensure(['@/components/index'], () => resolve(require('@/components/index')))

2、 采用amd風(fēng)格的require,例:

var?Hello =?resolve?=>?require(['@/components/Hello'], resolve)

3、 把組件按組分塊:
提供 require.ensure 第三個(gè)參數(shù)作為 chunk 的名稱,Webpack 將相同 chunk 下的所有異步模塊打包到一個(gè)異步塊里面 —— 這也意味著我們無須明確列出 require.ensure 的依賴(傳空數(shù)組就行)
例:

const Foo = resolve => require.ensure([], () => resolve (require('./Foo.vue')), 'group-foo') const Bar = resolve => require.ensure([], () => resolve (require('./Bar.vue')), 'group-foo') const Baz = resolve => require.ensure([], () => resolve (require('./Baz.vue')), 'group-foo')

十三、 狀態(tài)管理:(vuex)

1、 簡介:

a) 在一些大型應(yīng)用中,有時(shí)我們會(huì)遇到單頁面中包含著大量的組件及復(fù)雜的數(shù)據(jù)結(jié)構(gòu),而 且可能各組件還會(huì)互相影響各自的狀態(tài),在這種情況下組件樹中的事件流會(huì)很快變得非常復(fù) 雜,也使調(diào)試變得異常困難。為了解決這種情況,我們往往會(huì)引入狀態(tài)管理這種設(shè)計(jì)模式,來 降低這種情況下事件的復(fù)雜程度并且使調(diào)試變得可以追蹤。
b) 每個(gè)組件都會(huì)擁有自己的狀態(tài),也可以理解成自身實(shí)例中的 data 對 象。用戶在操作的過程中,會(huì)通過一些交互行為,例如點(diǎn)擊、輸入、拖動(dòng)等修改組件的 狀態(tài),而此時(shí)往往需要將用戶引起的狀態(tài)變化通知到其他相關(guān)組件,讓他們也進(jìn)行對應(yīng) 的修改。由于 Vue.js 本身的事件流是依賴于 DOM 結(jié)構(gòu)的,組件修改狀態(tài)后需要經(jīng)過 一系列冒泡才能達(dá)到頂部的組件,而且如果需要修改兄弟組件的狀態(tài)還需要共同的父組 件再進(jìn)行一次廣播。這種方式無疑是低效而且不易維護(hù)的,我們也很難去追蹤事件流的 走向。
c) vuex 和 redux 間的差異表示關(guān)注,redux 是 React 生態(tài)環(huán)境中最流行的 Flux 實(shí)現(xiàn)。Redux 事實(shí)上無法感知視圖層,所以它能夠輕松的通過一些簡單綁定和Vue一起使用。vuex區(qū)別在于它是一個(gè)專門為 vue 應(yīng)用所設(shè)計(jì)。這使得它能夠更好地和vue進(jìn)行整合,同時(shí)提供簡潔的API和改善過的開發(fā)體驗(yàn)。

2、 配置使用:

安裝vuex,在main.js中引入vuex進(jìn)行使用;

import vuex from “vuex”, Vue.use(vuex)

實(shí)例化Vuex:

const store = new Vuex.Store({state: {count: 0},mutations: {increment (state) {state.count++}} })

將vuex掛載到Vue實(shí)例中:

const app = new Vue({el: '#app',// 把 store 對象提供給 “store” 選項(xiàng),這可以把 store 的實(shí)例注入所有的子組件store,components: { Counter },template: `<div class="app"><counter></counter></div>` })

現(xiàn)在,你可以通過 store.state 來獲取狀態(tài)對象,以及通過 store.commit 方法觸發(fā)狀態(tài)變更,我們通過提交 mutation 的方式,而非直接改變 this.$store.state.count,是因?yàn)槲覀兿胍鞔_地追蹤到狀態(tài)的變化

3、 核心概念:

a) state:
ν 數(shù)據(jù)的定義以及存放數(shù)據(jù)的屬性,類似于組件內(nèi)部的data屬性;所有在vuex使用的數(shù)據(jù)都必須在此屬性中進(jìn)行定義與聲明;不建議將應(yīng)用所有的數(shù)據(jù)都放入state,交互性低,比較單一使用的數(shù)據(jù),建議放在組件內(nèi)部定義;
ν mapState輔助函數(shù)
寫法:
對象寫法:

computed:mapState({ //寫法一:箭頭函數(shù)可使代碼更簡潔 count:state=> state.count //寫法二:傳字符串參數(shù) 'count' 等同于 `state => state.count` count:state=> state.count //寫法三:為了能夠使用 `this` 獲取局部狀態(tài),必須使用常規(guī)函數(shù) count(state){ return state.count+this.a } })

數(shù)組寫法:
當(dāng)映射的計(jì)算屬性的名稱與 state 的子節(jié)點(diǎn)名稱相同時(shí)

computed:mapState([ “count” ])

ν 對象展開運(yùn)算符:
注意運(yùn)用此方法時(shí),因?yàn)閷ο髷U(kuò)展運(yùn)算符是在es提案的stage-3階段,由于babel進(jìn)行轉(zhuǎn)碼時(shí),在webpack中默認(rèn)配置的是es-2015,所以需要借助babel-plugin-transform-object-rest-spread插件進(jìn)行編譯;
在babel的配置文件中如下配置:
"plugins": ["transform-runtime", "transform-object-rest-spread"],

在computed屬性中的寫法如下:
...mapState({

// ...

})
上面的mapState的參數(shù)可以是對象,也可以是數(shù)組,跟mapState輔助函數(shù)中的配置一樣
b) Getters:
應(yīng)用場景:
有時(shí)候,我們需要對state數(shù)據(jù)進(jìn)行一些操作后再在組件中進(jìn)行使用,如果多個(gè)組件都需要操作后的這個(gè)數(shù)據(jù),我們可能會(huì)在多個(gè)組件computed中都對state進(jìn)行操作一次;
解決辦法:
使用getters:

getters: {doneTodos: state => {return state.todos.filter(todo => todo.done)}}

組件中使用,跟state的使用一樣,可以使用輔助函數(shù),或者對象展開運(yùn)算符
c) Mutations:
更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutations 非常類似于事件:每個(gè) mutation 都有一個(gè)字符串的 事件類型 (type) 和 一個(gè) 回調(diào)函數(shù) (handler)。這個(gè)回調(diào)函數(shù)就是我們實(shí)際進(jìn)行狀態(tài)更改的地方,并且它會(huì)接受 state 作為第一個(gè)參數(shù);
定義的方式跟getters一樣,例:

mutations: {increment (state) {// 變更狀態(tài)state.count++}}

回調(diào)函數(shù)的第一個(gè)參數(shù)為state,第二個(gè)參數(shù)可以動(dòng)態(tài)傳入值,值的類型,可以為基本類型或?qū)ο?#xff1b;
提交載荷:
可以使用store.commit(‘increment’,10)
或store.commit({type:’increment’,amount:10})
遵循vue的數(shù)據(jù)相應(yīng)規(guī)則:
在對象上添加新屬性時(shí),使用 Vue.set(obj, 'newProp', 123)或者
state.obj = { ...state.obj, newProp: 123 }
mutation必須是同步函數(shù):
如果為異步,則無法跟蹤數(shù)據(jù)
在組件中直接提交(不推薦)

methods: {...mapMutations(['increment' // 映射 this.increment() 為 this.$store.commit('increment')]),...mapMutations({add: 'increment' // 映射 this.add() 為 this.$store.commit('increment')})}

d) actions:
action提交的是mutation,而不是直接更變狀態(tài)。
action可以包含任意異步操作。
注冊:

actions: {increment (context) {context.commit('increment')}}

i. 在actions的內(nèi)部可以獲取以一個(gè)context參數(shù)。這個(gè)參數(shù)相當(dāng)于一個(gè)store實(shí)例,但不是當(dāng)前應(yīng)用的store實(shí)例本身,因?yàn)槿绻捎胢odules方式進(jìn)行數(shù)據(jù)的管理時(shí),store實(shí)例是一個(gè)數(shù)組;
ii. 可以通過context參數(shù)獲取state或者getters等等,一般可以通過此參數(shù)來提交commit;

分發(fā)action:
應(yīng)用場景:當(dāng)一次action對應(yīng)的數(shù)據(jù)的更改,必須依賴另外一個(gè)action中的數(shù)據(jù)更改時(shí),必須在本此action中先去觸發(fā)另外一個(gè)action操作;另外一個(gè)action可能為同步,也可能為異步,如果為異步需要借助promise或者async函數(shù);
// 以載荷形式分發(fā)

store.dispatch('incrementAsync', {amount: 10 })// 以對象形式分發(fā) store.dispatch({type: 'incrementAsync',amount: 10 })

在組件中分發(fā)action:

methods: {...mapActions(['increment' // 映射 this.increment() 為 this.$store.dispatch('increment')]),...mapActions({add: 'increment' // 映射 this.add() 為 this.$store.dispatch('increment')})}

通過dispatch觸發(fā)異步action:
使用promise:

actionA ({ commit }) {return new Promise((resolve, reject) => {setTimeout(() => {commit('someMutation')resolve()}, 1000) }) }actionB ({ dispatch, commit }) {return dispatch('actionA').then(() => {commit('someOtherMutation')})}

使用async函數(shù):
getData、getOtherData返回的是promise,或者是axiso的數(shù)據(jù)請求函數(shù)

async actionA ({ commit }) {commit('gotData', await getData())}, async actionB ({ dispatch, commit }) {await dispatch('actionA') // 等待 actionA 完成commit('gotOtherData', await getOtherData())}

e) modules:
應(yīng)用場景:

  • 當(dāng)一個(gè)項(xiàng)目比較大時(shí),所有的數(shù)據(jù)與數(shù)據(jù)管理都放在同一個(gè)store中時(shí),此時(shí)的store對象就會(huì)變得比較臃腫;
  • 當(dāng)某個(gè)大型項(xiàng)目,幾個(gè)開發(fā)團(tuán)隊(duì)一起開發(fā)時(shí),同時(shí)操作一個(gè)store,可能會(huì)出現(xiàn)沖突等問題,每個(gè)團(tuán)隊(duì)負(fù)責(zé)的產(chǎn)品鏈的數(shù)據(jù)管理相對獨(dú)立時(shí),可以采用module的方式管理;
  • 定義:
    將 store 分割成模塊(module)。每個(gè)模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊——從上至下進(jìn)行同樣方式的分割
    如:

    const moduleA = {state: { ... },mutations: { ... },actions: { ... },getters: { ... } } const store = new Vuex.Store({modules: {a: moduleA,b: moduleB} }) store.state.a // -> moduleA 的狀態(tài)

    模塊的局部狀態(tài):
    對于模塊內(nèi)部的 mutation 和 getter,接收的第一個(gè)參數(shù)是模塊的局部狀態(tài)對象
    對于模塊內(nèi)部的 action,局部狀態(tài)通過 context.state 暴露出來, 根節(jié)點(diǎn)狀態(tài)則為 context.rootState
    在getter中根節(jié)點(diǎn)狀態(tài)會(huì)作為第三個(gè)參數(shù)暴露出來

    總結(jié)

    以上是生活随笔為你收集整理的vue笔记整理与总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    亚洲精品大片www | 最新av网站在线观看 | 久久神马影院 | 久久在线 | 日韩欧美亚州 | 日韩中文在线电影 | 97视频总站 | 99久久夜色精品国产亚洲96 | 中文字幕在线观看91 | 日b黄色片 | 亚洲精品国产成人 | 国产精品资源在线观看 | 欧美大片在线看免费观看 | 天天摸天天干天天操天天射 | 免费av网站观看 | 欧美国产日韩一区二区三区 | 国产精品一区二区久久久久 | 在线免费av电影 | 不卡视频在线 | 亚洲日韩欧美视频 | 免费毛片一区二区三区久久久 | 美女网站视频免费黄 | 人人dvd| 日韩在线观看的 | 亚洲精品在线观看免费 | 日韩欧美69 | 在线国产福利 | 日日夜av| www.国产高清 | 成人午夜av电影 | 欧洲高潮三级做爰 | 亚洲精品女 | 美女黄频视频大全 | 日韩性片 | 九九天堂 | 日本最新中文字幕 | 去干成人网| 欧美另类人妖 | 日韩一三区 | 精品久久久精品 | www.国产在线 | 成人国产一区二区 | 国产黄视频在线观看 | 日韩视频免费 | 一区二区三区国产欧美 | 久久丁香| 亚洲高清视频在线观看 | 欧美一区在线观看视频 | 伊人色综合网 | 国产精品嫩草影院9 | 国产视频在线一区二区 | 韩国av一区二区三区 | a精品视频 | 日韩欧美在线综合网 | 国产成人免费观看久久久 | 一区二区理论片 | 久久精品99久久 | 亚洲 精品在线视频 | 日韩精品免费在线播放 | 国产精品12| 99草视频在线观看 | 日韩剧| 久久成人高清 | 日日干av| 九九热国产视频 | 久久99精品国产麻豆婷婷 | 天天天在线综合网 | 亚洲精品国产精品乱码在线观看 | 在线看一级片 | 亚洲 欧美变态 另类 综合 | 1024手机基地在线观看 | 国内精品久久久久影院男同志 | 最新久久免费视频 | 97福利在线观看 | 久久久18| 亚洲精品久久久久www | 国产精品99久久久精品免费观看 | 国产精品21区 | 性色av免费观看 | 波多野结衣综合网 | 天堂中文在线播放 | 午夜精品一区二区三区免费视频 | japanesexxxhd奶水 91在线精品一区二区 | 免费日韩av片| 亚洲精品在线播放视频 | 永久免费在线 | 久久一精品 | 黄色成人在线观看 | 国产成人精品一区二区三区福利 | 亚洲综合爱 | 中文字幕亚洲欧美 | 毛片网站在线 | 91精品久久久久久综合乱菊 | 亚洲伊人天堂 | 久久精品美女视频网站 | 国产一级做a| 色网站免费在线观看 | 欧美色一色 | 久久黄色影视 | 天堂麻豆 | 久久午夜免费观看 | 久久综合9988久久爱 | 中文字幕免费高清在线 | 免费在线色视频 | 偷拍精偷拍精品欧洲亚洲网站 | 久久久网 | 国产精品久久麻豆 | 久久韩国免费视频 | 婷婷五情天综123 | 91亚洲精品乱码久久久久久蜜桃 | 日韩高清精品一区二区 | 国产福利精品在线观看 | 久久精品影片 | a天堂中文在线 | 九九有精品 | 亚洲欧洲一区二区在线观看 | 日三级在线 | 在线中文字幕一区二区 | 97超碰人人澡 | 成人在线免费看视频 | 欧美日韩精品在线免费观看 | 日韩 在线a | 久久国产精品二国产精品中国洋人 | 成人午夜电影在线播放 | 日韩午夜剧场 | 精品国产123| 久久精品1区 | 中文字幕在线观看一区二区 | 99免费国产 | 国产视频2 | 黄色av一区| h久久| 中文字幕区 | 亚洲精品国产精品国自产观看浪潮 | 久久精品小视频 | 国产男女无遮挡猛进猛出在线观看 | 亚洲欧美日韩在线一区二区 | 欧美天天干 | 黄色三级在线 | 91最新国产 | 一级黄色片在线观看 | 福利视频网站 | 国产在线观看免费av | 久久久久亚洲精品 | 精品一区 在线 | 午夜少妇| 日本在线观看一区 | 奇米7777狠狠狠琪琪视频 | 亚洲三级网 | 亚洲三级精品 | 久久久亚洲网站 | 日本韩国精品在线 | 美女av免费看 | 国产精品一区在线观看 | 欧美性春潮| 丝袜美腿在线播放 | 免费日韩视 | 久草在线观看 | 国产清纯在线 | 国产精品一区一区三区 | 精品久久免费 | 99在线精品视频观看 | 欧美精品一区二区免费 | 天天射天天爱天天干 | 日韩电影黄色 | 国产自制av | 中文字幕在线观看视频网站 | 日韩精品不卡在线 | 日韩欧美在线综合网 | 国产一区二区视频在线播放 | 日韩av午夜在线观看 | 免费在线观看亚洲视频 | 久久一区二 | 四虎免费av | 亚州人成在线播放 | 日本久久中文字幕 | 免费黄色看片 | 亚洲视屏一区 | 日韩中文字幕在线观看 | 色偷偷88欧美精品久久久 | 久久视频这里有精品 | 久久在线播放 | 99久热精品| 国产老妇av | 国产精品12 | 玖玖精品在线 | 97国产视频| 免费观看性生交大片3 | 日韩久久在线 | 色婷婷五 | 黄色网在线播放 | 国语自产偷拍精品视频偷 | 麻豆国产网站 | 婷婷色站 | 黄色大全免费网站 | 国产一级片网站 | 国产中文字幕三区 | 五月天久久| 国产露脸91国语对白 | 成人国产在线 | 天天色天天综合 | 婷婷激情五月综合 | 亚洲精品中文字幕在线 | 色成人亚洲网 | 色综合色综合久久综合频道88 | 五月婷在线播放 | 精品视频国产 | 精品在线二区 | 日韩欧美一区二区在线观看 | 麻豆91网站 | 天天操天天射天天爽 | 黄色在线免费观看网址 | 久久只精品99品免费久23小说 | 成人免费视频免费观看 | 99婷婷狠狠成为人免费视频 | 黄色aa久久 | 欧美电影在线观看 | 国产精品欧美久久久久天天影视 | 极品久久久久 | 亚洲免费视频观看 | 成人免费xxxxxx视频 | 国产精品视频99 | 久久久久女人精品毛片九一 | 麻豆国产精品va在线观看不卡 | 一区二区不卡视频在线观看 | 香蕉手机在线 | 久久成人人人人精品欧 | 狠狠的日日 | 国产精品高清一区二区三区 | 日韩精品一区二区三区视频播放 | 成人黄色国产 | 久久久www成人免费精品张筱雨 | 激情综合亚洲精品 | 亚洲h在线播放在线观看h | av中文字幕剧情 | 日一日操一操 | 日本黄色一级电影 | 夜夜爽88888免费视频4848 | 欧美日韩成人 | 麻花豆传媒一二三产区 | 日本资源中文字幕在线 | 欧美精品在线观看 | 高潮久久久久久久久 | 超碰在线免费97 | 久久噜噜少妇网站 | 国产精品观看视频 | 91亚洲精品在线观看 | 久久综合五月婷婷 | 国产精品精品国产 | 久久精品视频国产 | 国产一级电影免费观看 | 亚洲最新av在线网址 | 毛片随便看 | 欧美专区国产专区 | 亚洲毛片一区二区三区 | 97精品在线| 免费碰碰| 美腿丝袜一区二区三区 | 一区二区中文字幕在线观看 | 99久久久久久久久 | 中文字幕亚洲五码 | 国产亚洲精品久 | www.eeuss影院av撸 | 亚洲黄色在线播放 | 96视频在线 | 麻豆一级视频 | 婷婷激情综合五月天 | 狠狠色伊人亚洲综合网站野外 | 伊人影院av| 天天干天天干天天射 | 国产亚洲成人网 | 999在线精品 | 国产精品区在线观看 | 欧美国产高清 | 国产精品麻豆99久久久久久 | 69国产盗摄一区二区三区五区 | 在线视频你懂 | 国产福利一区二区三区在线观看 | www.99在线观看 | 国产精品视频区 | 成人免费精品 | 日韩最新在线视频 | 成人黄色电影在线观看 | 91精品视频免费在线观看 | 欧美日韩性生活 | 日韩理论在线播放 | 色wwwww| 成人性生交大片免费观看网站 | 97在线免费 | 国产在线p | 国产精品理论视频 | 人人要人人澡人人爽人人dvd | 色91av| 综合视频在线 | 久久久久久久久久网 | 中文字幕在线观看第一区 | 日韩免费电影网站 | 免费网站黄| 天天摸天天干天天操天天射 | 亚洲视频六区 | 在线视频一区二区 | 久久好看免费视频 | 久久综合久久鬼 | 久久激情精品 | 国产高清免费在线观看 | 中文字幕精品一区二区三区电影 | 久av在线 | 国产成人在线播放 | 在线有码中文 | 99热只有精品在线观看 | 婷婷丁香视频 | 奇米影视777四色米奇影院 | 人人爽人人看 | 亚洲精品日韩一区二区电影 | 国产经典 欧美精品 | 中文字幕在线播放一区二区 | 久久国产午夜精品理论片最新版本 | 国产高清免费av | 久久歪歪| 亚洲欧美日韩在线看 | 天天激情综合网 | 国产精品久久久久久久久久免费看 | 九七视频在线观看 | 九九久久影视 | 国产精品99爱 | 免费中文字幕 | 在线观看国产麻豆 | 狠狠天天 | 一区电影 | 91综合久久一区二区 | 国产精品永久免费观看 | 日韩欧美高清一区二区三区 | 欧美日韩亚洲在线观看 | 麻豆视频国产 | 精品一二三区视频 | 狠狠干天天色 | 超碰人人超 | 国产精品久久久一区二区 | 久久久人人人 | 91av小视频| 中文字幕91视频 | 波多野结衣一区二区三区中文字幕 | av网站免费线看精品 | 国产精品一区在线 | 国产成人一区二区三区在线观看 | 91九色最新地址 | 亚洲天堂网站视频 | 国产精品正在播放 | 欧美在线观看禁18 | 波多野结衣理论片 | 五月天亚洲综合 | 91爱爱网址 | 日韩中文字幕在线观看 | 国产成人在线看 | 欧洲成人免费 | 黄色亚洲免费 | 亚洲欧洲国产视频 | av免费试看 | 狠狠狠狠狠狠干 | 色五月激情五月 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 国际av在线| 亚洲婷婷伊人 | 久久深夜福利免费观看 | 亚洲午夜久久久久久久久电影网 | 欧洲精品一区二区 | 免费看黄在线 | 国产精彩视频一区 | 成人小视频在线观看免费 | 天堂在线一区 | 国产区精品 | 999久久a精品合区久久久 | 人人狠狠综合久久亚洲婷 | 国产手机av | 国产一区二区在线播放 | 午夜免费久久看 | 天天色天天综合网 | 97国产小视频 | 国产精品福利在线观看 | 成人一区二区三区在线观看 | 日韩三级视频在线观看 | 毛片一级免费一级 | 久久se视频| 日本黄色黄网站 | 操操综合 | 一区二区视频免费在线观看 | 日韩欧美在线中文字幕 | 国产一区二区手机在线观看 | 综合色天天 | 国产97色在线 | 在线观看中文字幕一区 | 国产美女在线免费观看 | 日韩av一区二区在线影视 | 久久久久久美女 | 亚洲五月花 | 中文字幕资源网 国产 | 在线综合色 | 91mv.cool在线观看 | 九九综合在线 | 久久精品中文字幕 | 色婷婷www| 一区二区三区日韩精品 | 丁香网婷婷 | 日韩黄色影院 | 人人玩人人弄 | 久久久久久久看片 | 久久人人爽爽人人爽人人片av | 亚洲不卡av一区二区三区 | 韩国三级一区 | 国产中文字幕视频在线观看 | 日韩在线电影 | 欧美一区二区三区在线观看 | 国产色拍拍拍拍在线精品 | 日本二区三区在线 | 在线国产99| 九九九九热精品免费视频点播观看 | 欧美成人手机版 | 久久久毛片| 中文字幕在线不卡国产视频 | 免费黄色激情视频 | 天天干天天看 | 中文字幕乱码一区二区 | 91手机视频在线 | 人人爽爽人人 | 美女网站久久 | 91视频免费看网站 | 欧美极品少妇xxxx | 国产 字幕 制服 中文 在线 | 丁香六月五月婷婷 | 久久精品中文字幕一区二区三区 | 九九精品在线观看 | 国产手机在线视频 | 国产一卡在线 | 午夜 免费| 国产成人黄色片 | 午夜精品久久久久久久99水蜜桃 | 91九色精品 | 国产一级不卡视频 | 五月婷婷电影网 | 成人av网站在线 | 色综合天天狠天天透天天伊人 | 色综合欧洲 | 亚洲一级黄色大片 | 国产精品99久久99久久久二8 | 国产日韩欧美视频在线观看 | 亚洲最大av网站 | 五月婷婷在线视频观看 | 色婷婷六月天 | 成年人免费看av | 麻豆视频免费播放 | 国产精品久久久久久久久大全 | 天天操人| 日p在线观看 | 麻豆成人精品 | 在线一区二区三区 | 亚洲精品综合一二三区在线观看 | 色播亚洲婷婷 | 国产91精品看黄网站在线观看动漫 | 日韩中文字幕在线 | 天天色影院 | 亚洲九九 | 96视频在线 | 日韩欧美在线视频一区二区三区 | 国产麻豆电影 | 337p日本欧洲亚洲大胆裸体艺术 | 日韩在线观看三区 | 日韩专区在线 | 久久成人免费视频 | 欧美福利精品 | 91在线播放综合 | 在线成人一区 | 日韩在线观看电影 | 激情婷婷色| 天天操天天弄 | 久久99国产精品久久99 | 欧美日韩国产在线一区 | 中文字幕在线看人 | 97人人人人| 日韩在线观看不卡 | av官网在线| 最近2019好看的中文字幕免费 | 色综合天天视频在线观看 | 美女在线免费观看视频 | 福利网在线 | 久久久久国产a免费观看rela | 国产精品久久久久av | 成年人免费av | 男女视频国产 | 国产精品男女啪啪 | 日韩欧美高清一区二区三区 | 国产中文字幕在线看 | 最近中文字幕视频完整版 | 99久久久国产精品免费99 | www.91成人| 精品国产理论 | 97爱爱爱| 国产 字幕 制服 中文 在线 | 又黄又网站 | 久久99久久精品国产 | 中文字幕精品三级久久久 | 国产精品久久久久久久免费观看 | 亚洲欧洲精品一区二区精品久久久 | 国产精品 中文在线 | 超碰97在线资源站 | 99国产情侣在线播放 | 4hu视频| 人人澡超碰碰 | 三级av网站 | 探花视频网站 | 亚洲综合在线发布 | 久久久久欧美精品999 | 久久五月婷婷丁香 | 手机看国产毛片 | 热99久久精品 | 国产精品久久久久久久免费大片 | 国产黄在线播放 | 久久这里有精品 | www.com.黄| 日韩av片无码一区二区不卡电影 | 欧美成人a在线 | 99夜色 | 免费观看91视频大全 | 99久久www免费 | 亚洲在线精品视频 | 福利视频 | 偷拍区另类综合在线 | 日本在线成人 | 又色又爽又黄高潮的免费视频 | 日韩欧美综合视频 | 亚洲国产操 | 欧美婷婷色 | 久久久久久久久国产 | 国产精品久久在线观看 | 国产专区日韩专区 | 午夜在线免费观看 | 99久久99久国产黄毛片 | 麻豆传媒在线视频 | 亚洲激情在线观看 | 欧美日韩亚洲在线观看 | 狠狠色噜噜狠狠狠狠2021天天 | 国产玖玖在线 | 在线视频 国产 日韩 | 国产精品久久久久久久久久久不卡 | 天堂av色婷婷一区二区三区 | 一区二区三区免费网站 | 免费情缘| 欧美午夜精品久久久久久孕妇 | 激情av在线资源 | 婷婷狠狠操 | 亚洲免费av在线播放 | 亚洲自拍av在线 | 丝袜制服天堂 | 四虎在线影视 | 国产黄色片网站 | 一级欧美一级日韩 | 亚洲精品乱码久久久久久蜜桃动漫 | 人人精品 | av色一区| 精品一区二区三区电影 | 亚洲国产影院av久久久久 | 黄色一级大片免费看 | 免费久久99精品国产 | 日韩网站免费观看 | 二区视频在线 | 国产精品久久久毛片 | 日韩电影在线观看一区二区 | 国产精品中文 | 天天插天天干 | 一个色综合网站 | 色婷婷九月 | 亚洲成色777777在线观看影院 | 粉嫩av一区二区三区四区 | 91麻豆精品国产自产 | 亚洲精品小视频 | 国内精品久久久久久久久久清纯 | 色中文字幕在线观看 | 丁香六月天 | 91大神dom调教在线观看 | 天天综合网天天 | 国产精品免费视频一区二区 | 婷婷综合导航 | 激情综合色综合久久综合 | 欧美日韩在线观看不卡 | 黄色片免费电影 | 亚洲一区二区麻豆 | av 在线观看| 久草免费在线观看 | 麻豆视频免费入口 | 激情一区二区三区欧美 | 五月婷婷一级片 | 美国av片在线观看 | 456成人精品影院 | 久久成人国产精品一区二区 | 午夜黄色一级片 | 91高清免费在线观看 | 在线观看av网 | 嫩草伊人久久精品少妇av | 亚洲精品影视在线观看 | 黄色日本片 | 国产亚洲视频系列 | 国产精品久久久久久久午夜 | 精品特级毛片 | 综合国产视频 | 国产日韩精品欧美 | 久久国产a | 色综合久久天天 | www.在线观看视频 | 色婷婷在线观看视频 | aⅴ视频在线 | 992tv又爽又黄的免费视频 | 麻豆国产精品一区二区三区 | 在线 精品 国产 | 国产精品永久久久久久久www | 精品日韩在线 | 欧美性色黄 | av资源免费在线观看 | 激情久久久久久久久久久久久久久久 | 亚洲精品成人av在线 | 国产精品久久久久久久午夜 | 精品视频久久久 | 久久亚洲免费视频 | 91激情视频在线观看 | 在线看小早川怜子av | 久久综合色一综合色88 | 久久激情综合 | 久久国产精品偷 | 一级片免费观看 | 99精品视频在线观看免费 | 日韩电影中文,亚洲精品乱码 | 亚洲爱爱视频 | 97av色| 曰韩精品| 午夜精品久久久久久久99水蜜桃 | 久久精品视频国产 | 国内精品久久久久久久久久清纯 | 98精品国产自产在线观看 | 五月天狠狠操 | 国产黄色精品视频 | 日韩激情视频在线 | 日本系列中文字幕 | 激情在线网站 | 日韩在线播放欧美字幕 | 久久久久久久久久电影 | 91九色视频在线 | 91精品老司机久久一区啪 | 天天干天天操人体 | 精品国产伦一区二区三区免费 | 91丨九色丨国产女 | 日日夜夜免费精品 | 日韩一区二区三区在线看 | 色综合天天狠狠 | 久在线观看| 国产91综合一区在线观看 | 久久久久国产精品一区二区 | 人人超碰97 | 日韩va在线观看 | 久久综合久色欧美综合狠狠 | 免费视频黄色 | 亚洲精品国产精品国自产观看浪潮 | 国产精品一码二码三码在线 | 黄色三级av| 久久人人爽人人爽人人 | 久久久久国产成人精品亚洲午夜 | 丁香久久五月 | 久久免费国产 | 精品美女在线观看 | 大型av综合网站 | av软件在线观看 | 91视频88av | www免费网站在线观看 | 日韩啪啪小视频 | 六月丁香婷婷在线 | 久久久久观看 | 免费麻豆视频 | 亚洲1区 在线 | 激情综合色图 | 美女精品在线 | 在线免费精品视频 | 欧美激情一区不卡 | a特级毛片 | 日本三级中文字幕在线观看 | 九九热免费在线观看 | 成人免费一级 | 国产黄色大片 | 日韩一区二区三区免费视频 | 国产成人av片 | 午夜电影久久久 | 国产日韩欧美在线 | 成人免费视频在线观看 | 国产网红在线观看 | 涩涩资源网 | 日韩久久精品一区 | 免费黄色av片| 久草精品视频在线看网站免费 | 国产精品免费人成网站 | 日韩成人精品一区二区 | 久久极品| 国产视频18 | 国产成人中文字幕 | 91视频在线自拍 | 亚洲无吗视频在线 | 99久久激情视频 | 一区二区三区在线免费 | 国产99re| 综合激情伊人 | 日韩高清三区 | 国产精品99久久久久久武松影视 | 欧美日韩中文字幕视频 | 少妇搡bbbb搡bbb搡aa | 色偷偷中文字幕 | 欧美日韩国产高清视频 | 中文字幕网站视频在线 | 在线91网| 一区二区欧美日韩 | 国产精品美女久久久久久久 | 精品91在线 | 涩涩网站在线观看 | av福利网址导航 | 激情深爱五月 | 欧美国产三区 | 免费观看第二部31集 | 欧美精品久久久久性色 | 久久免费成人网 | 国产成人av福利 | 亚洲在线高清 | 精品久久一区二区 | 色吊丝在线永久观看最新版本 | 日韩在线一级 | 又紧又大又爽精品一区二区 | 国产精品a久久 | 九九热在线精品视频 | 日韩毛片精品 | 久草免费手机视频 | 一区二区免费不卡在线 | 麻豆精品视频 | 天天操夜夜逼 | 成人免费在线视频 | 91精品天码美女少妇 | 国产精品一区二区你懂的 | 婷婷六月综合网 | 亚洲精品高清在线观看 | 亚洲色综合 | av网站在线观看播放 | av在线播放国产 | 亚州精品在线视频 | 欧美va天堂va视频va在线 | 午夜精品一区二区三区视频免费看 | 粉嫩av一区二区三区四区在线观看 | 日韩欧美精品在线视频 | 久久精品一区二区三区四区 | 香蕉久久久久久av成人 | 波多野结衣一区二区 | 亚洲在线精品 | 一区二区电影在线观看 | 黄色一级性片 | a在线观看国产 | 久久久久久免费视频 | 久青草视频在线观看 | 九九综合在线 | 日韩av影视在线 | 黄色小说网站在线 | 激情电影影院 | 免费日韩 | 91在线影视| 黄色午夜 | 久久不射电影院 | 五月综合在线观看 | 国产精品大片在线观看 | 国产黄色片免费在线观看 | 99热这里是精品 | 国产精品久久久久久超碰 | 高清视频一区二区三区 | 国产精品久久久久永久免费 | 日本护士三级少妇三级999 | www.99在线观看 | 黄污在线观看 | 久久久99精品免费观看乱色 | 久久99久久99精品免视看婷婷 | 国产精品久久久久免费观看 | 婷婷综合视频 | 久久美女精品 | 日韩理论片在线 | 婷婷丁香狠狠爱 | 夜色.com | www.97色.com| 日韩在线观看三区 | 成人精品一区二区三区电影免费 | 亚洲综合爱 | 免费久久片| 2022久久国产露脸精品国产 | av亚洲产国偷v产偷v自拍小说 | 国产精品久久久久久久久费观看 | 成人精品福利 | 在线观看国产亚洲 | www.人人干| 日韩理论在线观看 | 免费观看一级 | 免费黄色看片 | 久草久热| 国产精品18久久久久久久 | 久久综合成人 | 亚洲激情六月 | www.伊人色.com | av在线免费不卡 | 91高清视频免费 | 福利视频一区二区 | 久久国产精品免费一区二区三区 | 日韩免费b | 中文字幕在线观看网址 | av综合网址 | 国产精品精品国产 | 六月丁香激情综合 | 免费h精品视频在线播放 | 免费三级影片 | 欧美日韩国产在线观看 | 亚洲理论视频 | 美女网站在线观看 | 免费h漫在线观看 | 欧洲高潮三级做爰 | 中文字幕丝袜 | 色婷婷激情 | 日本久久久久 | 欧美午夜理伦三级在线观看 | 色网址99 | 伊人超碰在线 | 久久人网 | 亚洲国产福利视频 | 91av视频播放 | 亚洲精品一区二区三区新线路 | 国产不卡av在线播放 | 久久av观看 | 伊人久久在线观看 | 久久黄色a级片 | 天天操天天添天天吹 | 亚洲精品欧美精品 | 国产精品久久久久久久久久久免费看 | 色综合天天色综合 | 国产字幕av | av网站地址 | 人人爽人人爽人人片av免 | 天天操天天舔天天干 | 一本一本久久a久久精品综合 | 91中文字幕永久在线 | 中文字幕国产精品一区二区 | 韩国一区二区在线观看 | 久久久精品影视 | 91精品久久久久久综合乱菊 | 久久国内精品视频 | 五月开心婷婷网 | 欧美日韩三级在线观看 | 国产在线观看免费观看 | av大片网站 | 国产精品18久久久 | 成人av网站在线观看 | 日韩精品在线看 | 亚洲天堂社区 | 国产五月天婷婷 | av片一区| 亚洲成人第一区 | 国产精品免费大片视频 | 亚洲精品av在线 | 色a综合| 久久a视频 | 一区二区三区播放 | www黄色大片| 国产亚洲精品久久久久久无几年桃 | 亚洲人毛片 | 在线小视频你懂的 | 在线观看视频97 | 91视频在线免费看 | 91高清免费观看 | 免费观看黄色12片一级视频 | 久久国际影院 | 特级片免费看 | 亚州国产精品 | 久久免费观看视频 | 久久久性| 国产又粗又猛又黄又爽视频 | 国产精品女同一区二区三区久久夜 | 在线观看aaa | 中文字幕之中文字幕 | 特级毛片爽www免费版 | 超碰精品在线 | 欧美日韩精品在线观看 | 国产精彩在线视频 | 在线观看视频你懂 | 天天天干夜夜夜操 | 99免费在线视频 | 亚洲精品天天 | 欧美日韩国产精品久久 | 亚洲片在线 | 国产又粗又硬又长又爽的视频 | 精品一区 在线 | 国产精品一区二区三区在线播放 | 久久69精品久久久久久久电影好 | 国产精品九九久久久久久久 | 婷婷六月丁 | 婷婷www | 97电影在线看视频 | 黄色精品久久 | 国产在线精品视频 | 国产一区免费在线观看 | av电影免费 | 国产精品国产三级国产aⅴ无密码 | 欧美日韩一区二区三区视频 | 欧美一级黄色视屏 | 国产精品一区二区三区在线 | 国产精品一区久久久久 | 在线观看亚洲精品 | 日韩高清毛片 | 五月婷婷开心中文字幕 | 黄色电影网站在线观看 | 久久免费毛片视频 | 色偷偷97| www.五月婷婷.com | 久久久伦理| 久热精品国产 | 五月天天av| 香蕉久久久久久av成人 | 丁香婷婷综合激情五月色 | 免费欧美高清视频 | 丁香激情网 | 日本精品二区 | 亚洲精品国产精品国自 | 精品久久一区二区三区 | 国产免费一区二区三区最新6 | 久草视频在线免费播放 | 99精彩视频在线观看免费 | 精品国自产在线观看 | 人人爽人人澡人人添人人人人 | 狠狠综合久久 | 亚洲综合一区二区精品导航 | 狠狠操91| 亚洲香蕉在线观看 | 欧美极品一区二区三区 | 久久久黄视频 | 五月在线| 成人夜晚看av | 国产经典av | 成人黄在线| 丁香在线观看完整电影视频 | 91热精品视频| 91亚洲精品国偷拍 | 国产免费a | 亚洲国产精品一区二区久久,亚洲午夜 | 天天插天天干 | 国内精品久久久久影院优 | 国产精品女同一区二区三区久久夜 | 91九色视频国产 | 国产小视频网站 | 91麻豆看国产在线紧急地址 | 91pony九色丨交换 | 国产精品久久久久久高潮 | 97精品伊人 | 精品国产免费看 | 6080yy午夜一二三区久久 | 亚洲欧美经典 | 日韩精品一区二区三区免费视频观看 | 夜夜躁日日躁狠狠躁 | 国产一区二区三区免费视频 | 国产91大片 | h视频日本 | 久久超碰99| 最近中文字幕免费观看 | 又大又硬又黄又爽视频在线观看 | 成人影音在线 | 91av九色 | 久久精品视频免费 | 免费av网站观看 | 天天天色| 九九热免费在线观看 | 久久午夜视频 | 中文字幕av在线 | 久久成人精品 | 国产亚洲午夜高清国产拍精品 | 久爱综合 | 色综合天天在线 | 久久成人福利 | 欧美成人a在线 | 91c网站色版视频 | 免费在线观看亚洲视频 | 手机成人av | 国内久久久久久 | 午夜视频欧美 | 在线观看成人一级片 | 五月婷婷久久丁香 | 欧美日本在线观看视频 | 久草网站在线观看 | 97精品国产手机 | 不卡中文字幕av | 国产黑丝袜在线 | 精品国产99国产精品 | 欧美精品一区二区在线播放 | 国产在线播放不卡 | 欧美日韩中文字幕视频 | 天天干夜夜爱 | 中文字幕免费高清在线观看 | 精品国产免费久久 |