Vue2筆記

#vue2筆記

##?腳手架文件結(jié)構(gòu)

???├──?node_modules?

???├──?public

???│???├──?favicon.ico:?頁簽圖標(biāo)

???│???└──?index.html:?主頁面

???├──?src

???│???├──?assets:?存放靜態(tài)資源

???│???│???└──?logo.png

???│???│──?component:?存放組件

???│???│???└──?HelloWorld.vue

???│???│──?App.vue:?匯總所有組件

???│???│──?main.js:?入口文件

???├──?.gitignore:?git版本管制忽略的配置

???├──?babel.config.js:?babel的配置文件

???├──?package.json:?應(yīng)用包配置文件?

???├──?README.md:?應(yīng)用描述文件

???├──?package-lock.json:包版本控制文件

##?關(guān)于不同版本的Vue

1.?vue.js與vue.runtime.xxx.js的區(qū)別:

????1.?vue.js是完整版的Vue处嫌,包含:核心功能?+?模板解析器枫虏。

????2.?vue.runtime.xxx.js是運(yùn)行版的Vue才睹,只包含:核心功能;沒有模板解析器讳推。

2.?因?yàn)関ue.runtime.xxx.js沒有模板解析器,所以不能使用template這個(gè)配置項(xiàng)玩般,需要使用render函數(shù)接收到的createElement函數(shù)去指定具體內(nèi)容银觅。

##?vue.config.js配置文件

1.?使用vue?inspect?>?output.js可以查看到Vue腳手架的默認(rèn)配置。

2.?使用vue.config.js可以對(duì)腳手架進(jìn)行個(gè)性化定制坏为,詳情見:https://cli.vuejs.org/zh

##?ref屬性

1.?被用來給元素或子組件注冊(cè)引用信息(id的替代者)

2.?應(yīng)用在html標(biāo)簽上獲取的是真實(shí)DOM元素究驴,應(yīng)用在組件標(biāo)簽上是組件實(shí)例對(duì)象(vc)

3.?使用方式:

????1.?打標(biāo)識(shí):```<h1?ref="xxx">.....</h1>```?或?```<School?ref="xxx"></School>```

????2.?獲取:```this.$refs.xxx```

##?props配置項(xiàng)

1.?功能:讓組件接收外部傳過來的數(shù)據(jù)

2.?傳遞數(shù)據(jù):```<Demo?name="xxx"/>```

3.?接收數(shù)據(jù):

????1.?第一種方式(只接收):```props:['name']?```

????2.?第二種方式(限制類型):```props:{name:String}```

????3.?第三種方式(限制類型匀伏、限制必要性洒忧、指定默認(rèn)值):

????????```js

????????props:{

?????????name:{

?????????type:String,?//類型

?????????required:true,?//必要性

?????????default:'老王'?//默認(rèn)值

?????????}

????????}

????????```

????>?備注:props是只讀的,Vue底層會(huì)監(jiān)測(cè)你對(duì)props的修改够颠,如果進(jìn)行了修改熙侍,就會(huì)發(fā)出警告,若業(yè)務(wù)需求確實(shí)需要修改履磨,那么請(qǐng)復(fù)制props的內(nèi)容到data中一份蛉抓,然后去修改data中的數(shù)據(jù)。

##?mixin(混入)

1.?功能:可以把多個(gè)組件共用的配置提取成一個(gè)混入對(duì)象

2.?使用方式:

????第一步定義混合:

????```

????{

????????data(){....},

????????methods:{....}

????????....

????}

????```

????第二步使用混入:

?????全局混入:```Vue.mixin(xxx)```

?????局部混入:```mixins:['xxx']??```

##?插件

1.?功能:用于增強(qiáng)Vue

2.?本質(zhì):包含install方法的一個(gè)對(duì)象剃诅,install的第一個(gè)參數(shù)是Vue巷送,第二個(gè)以后的參數(shù)是插件使用者傳遞的數(shù)據(jù)。

3.?定義插件:

????```js

????對(duì)象.install?=?function?(Vue,?options)?{

????????//?1.?添加全局過濾器

????????Vue.filter(....)

????????//?2.?添加全局指令

????????Vue.directive(....)

????????//?3.?配置全局混入(合)

????????Vue.mixin(....)

????????//?4.?添加實(shí)例方法

????????Vue.prototype.$myMethod?=?function?()?{...}

????????Vue.prototype.$myProperty?=?xxxx

????}

????```

4.?使用插件:```Vue.use()```

##?scoped樣式

1.?作用:讓樣式在局部生效矛辕,防止沖突笑跛。

2.?寫法:```<style?scoped>```

##?總結(jié)TodoList案例

1.?組件化編碼流程:

?????(1).拆分靜態(tài)組件:組件要按照功能點(diǎn)拆分,命名不要與html元素沖突聊品。

?????(2).實(shí)現(xiàn)動(dòng)態(tài)組件:考慮好數(shù)據(jù)的存放位置飞蹂,數(shù)據(jù)是一個(gè)組件在用,還是一些組件在用:

???????????1).一個(gè)組件在用:放在組件自身即可杨刨。

???????????2).?一些組件在用:放在他們共同的父組件上(<span?style="color:red">狀態(tài)提升</span>)晤柄。

?????(3).實(shí)現(xiàn)交互:從綁定事件開始。

2.?props適用于:

?????(1).父組件?==>?子組件?通信

?????(2).子組件?==>?父組件?通信(要求父先給子一個(gè)函數(shù))

3.?使用v-model時(shí)要切記:v-model綁定的值不能是props傳過來的值妖胀,因?yàn)閜rops是不可以修改的!

4.?props傳過來的若是對(duì)象類型的值惠勒,修改對(duì)象中的屬性時(shí)Vue不會(huì)報(bào)錯(cuò)赚抡,但不推薦這樣做。

##?webStorage

1.?存儲(chǔ)內(nèi)容大小一般支持5MB左右(不同瀏覽器可能還不一樣)

2.?瀏覽器端通過?Window.sessionStorage?和?Window.localStorage?屬性來實(shí)現(xiàn)本地存儲(chǔ)機(jī)制纠屋。

3.?相關(guān)API:

????1.?```xxxxxStorage.setItem('key',?'value');```

??????????????????該方法接受一個(gè)鍵和值作為參數(shù)涂臣,會(huì)把鍵值對(duì)添加到存儲(chǔ)中,如果鍵名存在,則更新其對(duì)應(yīng)的值赁遗。

????2.?```xxxxxStorage.getItem('person');```

??????????????該方法接受一個(gè)鍵名作為參數(shù)署辉,返回鍵名對(duì)應(yīng)的值。

????3.?```xxxxxStorage.removeItem('key');```

??????????????該方法接受一個(gè)鍵名作為參數(shù)岩四,并把該鍵名從存儲(chǔ)中刪除哭尝。

????4.?```?xxxxxStorage.clear()```

??????????????該方法會(huì)清空存儲(chǔ)中的所有數(shù)據(jù)。

4.?備注:

????1.?SessionStorage存儲(chǔ)的內(nèi)容會(huì)隨著瀏覽器窗口關(guān)閉而消失剖煌。

????2.?LocalStorage存儲(chǔ)的內(nèi)容材鹦,需要手動(dòng)清除才會(huì)消失。

????3.?```xxxxxStorage.getItem(xxx)```如果xxx對(duì)應(yīng)的value獲取不到耕姊,那么getItem的返回值是null桶唐。

????4.?```JSON.parse(null)```的結(jié)果依然是null。

##?組件的自定義事件

1.?一種組件間通信的方式茉兰,適用于:<strong?style="color:red">子組件?===>?父組件</strong>

2.?使用場(chǎng)景:A是父組件尤泽,B是子組件,B想給A傳數(shù)據(jù)规脸,那么就要在A中給B綁定自定義事件(<span?style="color:red">事件的回調(diào)在A中</span>)坯约。

3.?綁定自定義事件:

????1.?第一種方式,在父組件中:```<Demo?@atguigu="test"/>```??或?```<Demo?v-on:atguigu="test"/>```

????2.?第二種方式燃辖,在父組件中:

????????```js

????????<Demo?ref="demo"/>

????????......

????????mounted(){

???????????this.$refs.xxx.$on('atguigu',this.test)

????????}

????????```

????3.?若想讓自定義事件只能觸發(fā)一次鬼店,可以使用```once```修飾符,或```$once```方法黔龟。

4.?觸發(fā)自定義事件:```this.$emit('atguigu',數(shù)據(jù))```????

5.?解綁自定義事件```this.$off('atguigu')```

6.?組件上也可以綁定原生DOM事件妇智,需要使用```native```修飾符。

7.?注意:通過```this.$refs.xxx.$on('atguigu',回調(diào))```綁定自定義事件時(shí)氏身,回調(diào)<span?style="color:red">要么配置在methods中</span>巍棱,<span?style="color:red">要么用箭頭函數(shù)</span>,否則this指向會(huì)出問題蛋欣!

##?全局事件總線(GlobalEventBus)

1.?一種組件間通信的方式航徙,適用于<span?style="color:red">任意組件間通信</span>。

2.?安裝全局事件總線:

???```js

???new?Vue({

??????......

??????beforeCreate()?{

?????????Vue.prototype.$bus?=?this?//安裝全局事件總線陷虎,$bus就是當(dāng)前應(yīng)用的vm

??????},

???????......

???})?

???```

3.?使用事件總線:

???1.?接收數(shù)據(jù):A組件想接收數(shù)據(jù)到踏,則在A組件中給$bus綁定自定義事件,事件的<span?style="color:red">回調(diào)留在A組件自身尚猿。</span>

??????```js

??????methods(){

????????demo(data){......}

??????}

??????......

??????mounted()?{

????????this.$bus.$on('xxxx',this.demo)

??????}

??????```

???2.?提供數(shù)據(jù):```this.$bus.$emit('xxxx',數(shù)據(jù))```

4.?最好在beforeDestroy鉤子中窝稿,用$off去解綁<span?style="color:red">當(dāng)前組件所用到的</span>事件。

##?消息訂閱與發(fā)布(pubsub)

1.???一種組件間通信的方式凿掂,適用于<span?style="color:red">任意組件間通信</span>伴榔。

2.?使用步驟:

???1.?安裝pubsub:```npm?i?pubsub-js```

???2.?引入:?```import?pubsub?from?'pubsub-js'```

???3.?接收數(shù)據(jù):A組件想接收數(shù)據(jù),則在A組件中訂閱消息,訂閱的<span?style="color:red">回調(diào)留在A組件自身踪少。</span>

??????```js

??????methods(){

????????demo(data){......}

??????}

??????......

??????mounted()?{

????????this.pid?=?pubsub.subscribe('xxx',this.demo)?//訂閱消息

??????}

??????```

???4.?提供數(shù)據(jù):```pubsub.publish('xxx',數(shù)據(jù))```

???5.?最好在beforeDestroy鉤子中塘安,用```PubSub.unsubscribe(pid)```去<span?style="color:red">取消訂閱。</span>

##?nextTick

1.?語法:```this.$nextTick(回調(diào)函數(shù))```

2.?作用:在下一次?DOM?更新結(jié)束后執(zhí)行其指定的回調(diào)援奢。

3.?什么時(shí)候用:當(dāng)改變數(shù)據(jù)后兼犯,要基于更新后的新DOM進(jìn)行某些操作時(shí),要在nextTick所指定的回調(diào)函數(shù)中執(zhí)行萝究。

##?Vue封裝的過度與動(dòng)畫

1.?作用:在插入免都、更新或移除?DOM元素時(shí),在合適的時(shí)候給元素添加樣式類名帆竹。

2.?圖示:<img?src="https://img04.sogoucdn.com/app/a/100520146/5990c1dff7dc7a8fb3b34b4462bd0105"?style="width:60%"?/>

3.?寫法:

???1.?準(zhǔn)備好樣式:

??????-?元素進(jìn)入的樣式:

????????1.?v-enter:進(jìn)入的起點(diǎn)

????????2.?v-enter-active:進(jìn)入過程中

????????3.?v-enter-to:進(jìn)入的終點(diǎn)

??????-?元素離開的樣式:

????????1.?v-leave:離開的起點(diǎn)

????????2.?v-leave-active:離開過程中

????????3.?v-leave-to:離開的終點(diǎn)

???2.?使用```<transition>```包裹要過度的元素绕娘,并配置name屬性:

??????```vue

??????<transition?name="hello">

?????????<h1?v-show="isShow">你好啊栽连!</h1>

??????</transition>

??????```

???3.?備注:若有多個(gè)元素需要過度险领,則需要使用:```<transition-group>```,且每個(gè)元素都要指定```key```值秒紧。

##?vue腳手架配置代理

###?方法一

??在vue.config.js中添加如下配置:

```js

devServer:{

??proxy:"http://localhost:5000"

}

```

說明:

1.?優(yōu)點(diǎn):配置簡(jiǎn)單绢陌,請(qǐng)求資源時(shí)直接發(fā)給前端(8080)即可。

2.?缺點(diǎn):不能配置多個(gè)代理熔恢,不能靈活的控制請(qǐng)求是否走代理脐湾。

3.?工作方式:若按照上述配置代理,當(dāng)請(qǐng)求了前端不存在的資源時(shí)叙淌,那么該請(qǐng)求會(huì)轉(zhuǎn)發(fā)給服務(wù)器?(優(yōu)先匹配前端資源)

###?方法二

??編寫vue.config.js配置具體代理規(guī)則:

```js

module.exports?=?{

???devServer:?{

??????proxy:?{

??????'/api1':?{//?匹配所有以?'/api1'開頭的請(qǐng)求路徑

????????target:?'http://localhost:5000',//?代理目標(biāo)的基礎(chǔ)路徑

????????changeOrigin:?true,

????????pathRewrite:?{'^/api1':?''}

??????},

??????'/api2':?{//?匹配所有以?'/api2'開頭的請(qǐng)求路徑

????????target:?'http://localhost:5001',//?代理目標(biāo)的基礎(chǔ)路徑

????????changeOrigin:?true,

????????pathRewrite:?{'^/api2':?''}

??????}

????}

??}

}

/*

???changeOrigin設(shè)置為true時(shí)秤掌,服務(wù)器收到的請(qǐng)求頭中的host為:localhost:5000

???changeOrigin設(shè)置為false時(shí),服務(wù)器收到的請(qǐng)求頭中的host為:localhost:8080

???changeOrigin默認(rèn)值為true

*/

```

說明:

1.?優(yōu)點(diǎn):可以配置多個(gè)代理鹰霍,且可以靈活的控制請(qǐng)求是否走代理闻鉴。

2.?缺點(diǎn):配置略微繁瑣,請(qǐng)求資源時(shí)必須加前綴茂洒。

##?插槽

1.?作用:讓父組件可以向子組件指定位置插入html結(jié)構(gòu)孟岛,也是一種組件間通信的方式,適用于?<strong?style="color:red">父組件?===>?子組件</strong>?督勺。

2.?分類:默認(rèn)插槽渠羞、具名插槽、作用域插槽

3.?使用方式:

???1.?默認(rèn)插槽:

??????```vue

??????父組件中:

??????????????<Category>

?????????????????<div>html結(jié)構(gòu)1</div>

??????????????</Category>

??????子組件中:

??????????????<template>

??????????????????<div>

?????????????????????<!--?定義插槽?-->

?????????????????????<slot>插槽默認(rèn)內(nèi)容...</slot>

??????????????????</div>

??????????????</template>

??????```

???2.?具名插槽:

??????```vue

??????父組件中:

??????????????<Category>

??????????????????<template?slot="center">

????????????????????<div>html結(jié)構(gòu)1</div>

??????????????????</template>

??????????????????<template?v-slot:footer>

?????????????????????<div>html結(jié)構(gòu)2</div>

??????????????????</template>

??????????????</Category>

??????子組件中:

??????????????<template>

??????????????????<div>

?????????????????????<!--?定義插槽?-->

?????????????????????<slot?name="center">插槽默認(rèn)內(nèi)容...</slot>

?????????????????????<slot?name="footer">插槽默認(rèn)內(nèi)容...</slot>

??????????????????</div>

??????????????</template>

??????```

???3.?作用域插槽:

??????1.?理解:<span?style="color:red">數(shù)據(jù)在組件的自身智哀,但根據(jù)數(shù)據(jù)生成的結(jié)構(gòu)需要組件的使用者來決定堵未。</span>(games數(shù)據(jù)在Category組件中,但使用數(shù)據(jù)所遍歷出來的結(jié)構(gòu)由App組件決定)

??????2.?具體編碼:

?????????```vue

?????????父組件中:

???????????????<Category>

??????????????????<template?scope="scopeData">

?????????????????????<!--?生成的是ul列表?-->

?????????????????????<ul>

????????????????????????<li?v-for="g?in?scopeData.games"?:key="g">{{g}}</li>

?????????????????????</ul>

??????????????????</template>

???????????????</Category>

???????????????<Category>

??????????????????<template?slot-scope="scopeData">

?????????????????????<!--?生成的是h4標(biāo)題?-->

?????????????????????<h4?v-for="g?in?scopeData.games"?:key="g">{{g}}</h4>

??????????????????</template>

???????????????</Category>

?????????子組件中:

?????????????????<template>

?????????????????????<div>

?????????????????????????<slot?:games="games"></slot>

?????????????????????</div>

?????????????????</template>

?????????????????<script>

?????????????????????export?default?{

?????????????????????????name:'Category',

?????????????????????????props:['title'],

?????????????????????????//數(shù)據(jù)在子組件自身

?????????????????????????data()?{

?????????????????????????????return?{

?????????????????????????????????games:['紅色警戒','穿越火線','勁舞團(tuán)','超級(jí)瑪麗']

?????????????????????????????}

?????????????????????????},

?????????????????????}

?????????????????</script>

?????????```

???```

???```

##?Vuex

###?1.概念

?????在Vue中實(shí)現(xiàn)集中式狀態(tài)(數(shù)據(jù))管理的一個(gè)Vue插件盏触,對(duì)vue應(yīng)用中多個(gè)組件的共享狀態(tài)進(jìn)行集中式的管理(讀/寫),也是一種組件間通信的方式,且適用于任意組件間通信赞辩。

###?2.何時(shí)使用雌芽?

?????多個(gè)組件需要共享數(shù)據(jù)時(shí)

###?3.搭建vuex環(huán)境

1.?創(chuàng)建文件:```src/store/index.js```

???```js

???//引入Vue核心庫

???import?Vue?from?'vue'

???//引入Vuex

???import?Vuex?from?'vuex'

???//應(yīng)用Vuex插件

???Vue.use(Vuex)

???//準(zhǔn)備actions對(duì)象——響應(yīng)組件中用戶的動(dòng)作

???const?actions?=?{}

???//準(zhǔn)備mutations對(duì)象——修改state中的數(shù)據(jù)

???const?mutations?=?{}

???//準(zhǔn)備state對(duì)象——保存具體的數(shù)據(jù)

???const?state?=?{}

???//創(chuàng)建并暴露store

???export?default?new?Vuex.Store({

??????actions,

??????mutations,

??????state

???})

???```

2.?在```main.js```中創(chuàng)建vm時(shí)傳入```store```配置項(xiàng)

???```js

???......

???//引入store

???import?store?from?'./store'

???......

???//創(chuàng)建vm

???new?Vue({

??????el:'#app',

??????render:?h?=>?h(App),

??????store

???})

???```

###????4.基本使用

1.?初始化數(shù)據(jù)、配置```actions```辨嗽、配置```mutations```世落,操作文件```store.js```

???```js

???//引入Vue核心庫

???import?Vue?from?'vue'

???//引入Vuex

???import?Vuex?from?'vuex'

???//引用Vuex

???Vue.use(Vuex)

???const?actions?=?{

???????//響應(yīng)組件中加的動(dòng)作

??????jia(context,value){

?????????//?console.log('actions中的jia被調(diào)用了',miniStore,value)

?????????context.commit('JIA',value)

??????},

???}

???const?mutations?=?{

???????//執(zhí)行加

??????JIA(state,value){

?????????//?console.log('mutations中的JIA被調(diào)用了',state,value)

?????????state.sum?+=?value

??????}

???}

???//初始化數(shù)據(jù)

???const?state?=?{

??????sum:0

???}

???//創(chuàng)建并暴露store

???export?default?new?Vuex.Store({

??????actions,

??????mutations,

??????state,

???})

???```

2.?組件中讀取vuex中的數(shù)據(jù):```$store.state.sum```

3.?組件中修改vuex中的數(shù)據(jù):```$store.dispatch('action中的方法名',數(shù)據(jù))```?或?```$store.commit('mutations中的方法名',數(shù)據(jù))```

???>??備注:若沒有網(wǎng)絡(luò)請(qǐng)求或其他業(yè)務(wù)邏輯,組件中也可以越過actions糟需,即不寫```dispatch```屉佳,直接編寫```commit```

###?5.getters的使用

1.?概念:當(dāng)state中的數(shù)據(jù)需要經(jīng)過加工后再使用時(shí),可以使用getters加工洲押。

2.?在```store.js```中追加```getters```配置

???```js

???......

???const?getters?=?{

??????bigSum(state){

?????????return?state.sum?*?10

??????}

???}

???//創(chuàng)建并暴露store

???export?default?new?Vuex.Store({

??????......

??????getters

???})

???```

3.?組件中讀取數(shù)據(jù):```$store.getters.bigSum```

###?6.四個(gè)map方法的使用

1.?<strong>mapState方法:</strong>用于幫助我們映射```state```中的數(shù)據(jù)為計(jì)算屬性

???```js

???computed:?{

???????//借助mapState生成計(jì)算屬性:sum武花、school、subject(對(duì)象寫法)

????????...mapState({sum:'sum',school:'school',subject:'subject'}),

???????//借助mapState生成計(jì)算屬性:sum杈帐、school体箕、subject(數(shù)組寫法)

???????...mapState(['sum','school','subject']),

???},

???```

2.?<strong>mapGetters方法:</strong>用于幫助我們映射```getters```中的數(shù)據(jù)為計(jì)算屬性

???```js

???computed:?{

???????//借助mapGetters生成計(jì)算屬性:bigSum(對(duì)象寫法)

???????...mapGetters({bigSum:'bigSum'}),

???????//借助mapGetters生成計(jì)算屬性:bigSum(數(shù)組寫法)

???????...mapGetters(['bigSum'])

???},

???```

3.?<strong>mapActions方法:</strong>用于幫助我們生成與```actions```對(duì)話的方法,即:包含```$store.dispatch(xxx)```的函數(shù)

???```js

???methods:{

???????//靠mapActions生成:incrementOdd挑童、incrementWait(對(duì)象形式)

???????...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

???????//靠mapActions生成:incrementOdd累铅、incrementWait(數(shù)組形式)

???????...mapActions(['jiaOdd','jiaWait'])

???}

???```

4.?<strong>mapMutations方法:</strong>用于幫助我們生成與```mutations```對(duì)話的方法,即:包含```$store.commit(xxx)```的函數(shù)

???```js

???methods:{

???????//靠mapActions生成:increment站叼、decrement(對(duì)象形式)

???????...mapMutations({increment:'JIA',decrement:'JIAN'}),

???????//靠mapMutations生成:JIA娃兽、JIAN(對(duì)象形式)

???????...mapMutations(['JIA','JIAN']),

???}

???```

>?備注:mapActions與mapMutations使用時(shí),若需要傳遞參數(shù)需要:在模板中綁定事件時(shí)傳遞好參數(shù)尽楔,否則參數(shù)是事件對(duì)象投储。

###?7.模塊化+命名空間

1.?目的:讓代碼更好維護(hù),讓多種數(shù)據(jù)分類更加明確翔试。

2.?修改```store.js```

???```javascript

???const?countAbout?=?{

?????namespaced:true,//開啟命名空間

?????state:{x:1},

?????mutations:?{?...?},

?????actions:?{?...?},

?????getters:?{

???????bigSum(state){

??????????return?state.sum?*?10

???????}

?????}

???}

???const?personAbout?=?{

?????namespaced:true,//開啟命名空間

?????state:{?...?},

?????mutations:?{?...?},

?????actions:?{?...?}

???}

???const?store?=?new?Vuex.Store({

?????modules:?{

???????countAbout,

???????personAbout

?????}

???})

???```

3.?開啟命名空間后轻要,組件中讀取state數(shù)據(jù):

???```js

???//方式一:自己直接讀取

???this.$store.state.personAbout.list

???//方式二:借助mapState讀取:

???...mapState('countAbout',['sum','school','subject']),

???```

4.?開啟命名空間后垦缅,組件中讀取getters數(shù)據(jù):

???```js

???//方式一:自己直接讀取

???this.$store.getters['personAbout/firstPersonName']

???//方式二:借助mapGetters讀瘸迥唷:

???...mapGetters('countAbout',['bigSum'])

???```

5.?開啟命名空間后,組件中調(diào)用dispatch

???```js

???//方式一:自己直接dispatch

???this.$store.dispatch('personAbout/addPersonWang',person)

???//方式二:借助mapActions:

???...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

???```

6.?開啟命名空間后壁涎,組件中調(diào)用commit

???```js

???//方式一:自己直接commit

???this.$store.commit('personAbout/ADD_PERSON',person)

???//方式二:借助mapMutations:

???...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),

???```

?##?路由

1.?理解:?一個(gè)路由(route)就是一組映射關(guān)系(key?-?value)凡恍,多個(gè)路由需要路由器(router)進(jìn)行管理。

2.?前端路由:key是路徑怔球,value是組件嚼酝。

###?1.基本使用

1.?安裝vue-router,命令:```npm?i?vue-router```

2.?應(yīng)用插件:```Vue.use(VueRouter)```

3.?編寫router配置項(xiàng):

???```js

???//引入VueRouter

???import?VueRouter?from?'vue-router'

???//引入Luyou?組件

???import?About?from?'../components/About'

???import?Home?from?'../components/Home'

???//創(chuàng)建router實(shí)例對(duì)象竟坛,去管理一組一組的路由規(guī)則

???const?router?=?new?VueRouter({

??????routes:[

?????????{

????????????path:'/about',

????????????component:About

?????????},

?????????{

????????????path:'/home',

????????????component:Home

?????????}

??????]

???})

???//暴露router

???export?default?router

???```

4.?實(shí)現(xiàn)切換(active-class可配置高亮樣式)

???```vue

???<router-link?active-class="active"?to="/about">About</router-link>

???```

5.?指定展示位置

???```vue

???<router-view></router-view>

???```

###?2.幾個(gè)注意點(diǎn)

1.?路由組件通常存放在```pages```文件夾闽巩,一般組件通常存放在```components```文件夾钧舌。

2.?通過切換,“隱藏”了的路由組件涎跨,默認(rèn)是被銷毀掉的洼冻,需要的時(shí)候再去掛載。

3.?每個(gè)組件都有自己的```$route```屬性隅很,里面存儲(chǔ)著自己的路由信息撞牢。

4.?整個(gè)應(yīng)用只有一個(gè)router,可以通過組件的```$router```屬性獲取到叔营。

###?3.多級(jí)路由(多級(jí)路由)

1.?配置路由規(guī)則屋彪,使用children配置項(xiàng):

???```js

???routes:[

??????{

?????????path:'/about',

?????????component:About,

??????},

??????{

?????????path:'/home',

?????????component:Home,

?????????children:[?//通過children配置子級(jí)路由

????????????{

???????????????path:'news',?//此處一定不要寫:/news

???????????????component:News

????????????},

????????????{

???????????????path:'message',//此處一定不要寫:/message

???????????????component:Message

????????????}

?????????]

??????}

???]

???```

2.?跳轉(zhuǎn)(要寫完整路徑):

???```vue

???<router-link?to="/home/news">News</router-link>

???```

###?4.路由的query參數(shù)

1.?傳遞參數(shù)

???```vue

???<!--?跳轉(zhuǎn)并攜帶query參數(shù),to的字符串寫法?-->

???<router-link?:to="/home/message/detail?id=666&title=你好">跳轉(zhuǎn)</router-link>

???<!--?跳轉(zhuǎn)并攜帶query參數(shù)绒尊,to的對(duì)象寫法?-->

???<router-link?

??????:to="{

?????????path:'/home/message/detail',

?????????query:{

????????????id:666,

???????????????title:'你好'

?????????}

??????}"

???>跳轉(zhuǎn)</router-link>

???```

2.?接收參數(shù):

???```js

???$route.query.id

???$route.query.title

???```

###?5.命名路由

1.?作用:可以簡(jiǎn)化路由的跳轉(zhuǎn)畜挥。

2.?如何使用

???1.?給路由命名:

??????```js

??????{

?????????path:'/demo',

?????????component:Demo,

?????????children:[

????????????{

???????????????path:'test',

???????????????component:Test,

???????????????children:[

??????????????????{

????????????????????????????name:'hello'?//給路由命名

?????????????????????path:'welcome',

?????????????????????component:Hello,

??????????????????}

???????????????]

????????????}

?????????]

??????}

??????```

???2.?簡(jiǎn)化跳轉(zhuǎn):

??????```vue

??????<!--簡(jiǎn)化前,需要寫完整的路徑?-->

??????<router-link?to="/demo/test/welcome">跳轉(zhuǎn)</router-link>

??????<!--簡(jiǎn)化后垒酬,直接通過名字跳轉(zhuǎn)?-->

??????<router-link?:to="{name:'hello'}">跳轉(zhuǎn)</router-link>

??????<!--簡(jiǎn)化寫法配合傳遞參數(shù)?-->

??????<router-link?

?????????:to="{

????????????name:'hello',

????????????query:{

???????????????id:666,

??????????????????title:'你好'

????????????}

?????????}"

??????>跳轉(zhuǎn)</router-link>

??????```

###?6.路由的params參數(shù)

1.?配置路由砰嘁,聲明接收params參數(shù)

???```js

???{

??????path:'/home',

??????component:Home,

??????children:[

?????????{

????????????path:'news',

????????????component:News

?????????},

?????????{

????????????component:Message,

????????????children:[

???????????????{

??????????????????name:'xiangqing',

??????????????????path:'detail/:id/:title',?//使用占位符聲明接收params參數(shù)

??????????????????component:Detail

???????????????}

????????????]

?????????}

??????]

???}

???```

2.?傳遞參數(shù)

???```vue

???<!--?跳轉(zhuǎn)并攜帶params參數(shù),to的字符串寫法?-->

???<router-link?:to="/home/message/detail/666/你好">跳轉(zhuǎn)</router-link>

???<!--?跳轉(zhuǎn)并攜帶params參數(shù)勘究,to的對(duì)象寫法?-->

???<router-link?

??????:to="{

?????????name:'xiangqing',

?????????params:{

????????????id:666,

???????????????title:'你好'

?????????}

??????}"

???>跳轉(zhuǎn)</router-link>

???```

???>?特別注意:路由攜帶params參數(shù)時(shí)矮湘,若使用to的對(duì)象寫法,則不能使用path配置項(xiàng)口糕,必須使用name配置缅阳!

3.?接收參數(shù):

???```js

???$route.params.id

???$route.params.title

???```

###?7.路由的props配置

??作用:讓路由組件更方便的收到參數(shù)

```js

{

???name:'xiangqing',

???path:'detail/:id',

???component:Detail,

???//第一種寫法:props值為對(duì)象,該對(duì)象中所有的key-value的組合最終都會(huì)通過props傳給Detail組件

???//?props:{a:900}

???//第二種寫法:props值為布爾值景描,布爾值為true十办,則把路由收到的所有params參數(shù)通過props傳給Detail組件

???//?props:true

???//第三種寫法:props值為函數(shù),該函數(shù)返回的對(duì)象中每一組key-value都會(huì)通過props傳給Detail組件

???props(route){

??????return?{

?????????id:route.query.id,

?????????title:route.query.title

??????}

???}

}

```

###?8.```<router-link>```的replace屬性

1.?作用:控制路由跳轉(zhuǎn)時(shí)操作瀏覽器歷史記錄的模式

2.?瀏覽器的歷史記錄有兩種寫入方式:分別為```push```和```replace```超棺,```push```是追加歷史記錄向族,```replace```是替換當(dāng)前記錄。路由跳轉(zhuǎn)時(shí)候默認(rèn)為```push```

3.?如何開啟```replace```模式:```<router-link?replace?.......>News</router-link>```

###?9.編程式路由導(dǎo)航

1.?作用:不借助```<router-link>?```實(shí)現(xiàn)路由跳轉(zhuǎn)棠绘,讓路由跳轉(zhuǎn)更加靈活

2.?具體編碼:

???```js

???//$router的兩個(gè)API

???this.$router.push({

??????name:'xiangqing',

?????????params:{

????????????id:xxx,

????????????title:xxx

?????????}

???})

???this.$router.replace({

??????name:'xiangqing',

?????????params:{

????????????id:xxx,

????????????title:xxx

?????????}

???})

???this.$router.forward()?//前進(jìn)

???this.$router.back()?//后退

???this.$router.go()?//可前進(jìn)也可后退

???```

###?10.緩存路由組件

1.?作用:讓不展示的路由組件保持掛載件相,不被銷毀。

2.?具體編碼:

???```vue

???<keep-alive?include="News">?

???????<router-view></router-view>

???</keep-alive>

???```

###?11.兩個(gè)新的生命周期鉤子

1.?作用:路由組件所獨(dú)有的兩個(gè)鉤子氧苍,用于捕獲路由組件的激活狀態(tài)夜矗。

2.?具體名字:

???1.?```activated```路由組件被激活時(shí)觸發(fā)。

???2.?```deactivated```路由組件失活時(shí)觸發(fā)让虐。

###?12.路由守衛(wèi)

1.?作用:對(duì)路由進(jìn)行權(quán)限控制

2.?分類:全局守衛(wèi)紊撕、獨(dú)享守衛(wèi)、組件內(nèi)守衛(wèi)

3.?全局守衛(wèi):

???```js

???//全局前置守衛(wèi):初始化時(shí)執(zhí)行赡突、每次路由切換前執(zhí)行

???router.beforeEach((to,from,next)=>{

??????console.log('beforeEach',to,from)

??????if(to.meta.isAuth){?//判斷當(dāng)前路由是否需要進(jìn)行權(quán)限控制

?????????if(localStorage.getItem('school')?===?'atguigu'){?//權(quán)限控制的具體規(guī)則

????????????next()?//放行

?????????}else{

????????????alert('暫無權(quán)限查看')

????????????//?next({name:'guanyu'})

?????????}

??????}else{

?????????next()?//放行

??????}

???})

???//全局后置守衛(wèi):初始化時(shí)執(zhí)行对扶、每次路由切換后執(zhí)行

???router.afterEach((to,from)=>{

??????console.log('afterEach',to,from)

??????if(to.meta.title){?

?????????document.title?=?to.meta.title?//修改網(wǎng)頁的title

??????}else{

?????????document.title?=?'vue_test'

??????}

???})

???```

4.?獨(dú)享守衛(wèi):

???```js

???beforeEnter(to,from,next){

??????console.log('beforeEnter',to,from)

??????if(to.meta.isAuth){?//判斷當(dāng)前路由是否需要進(jìn)行權(quán)限控制

?????????if(localStorage.getItem('school')?===?'atguigu'){

????????????next()

?????????}else{

????????????alert('暫無權(quán)限查看')

????????????//?next({name:'guanyu'})

?????????}

??????}else{

?????????next()

??????}

???}

???```

5.?組件內(nèi)守衛(wèi):

???```js

???//進(jìn)入守衛(wèi):通過路由規(guī)則区赵,進(jìn)入該組件時(shí)被調(diào)用

???beforeRouteEnter?(to,?from,?next)?{

???},

???//離開守衛(wèi):通過路由規(guī)則,離開該組件時(shí)被調(diào)用

???beforeRouteLeave?(to,?from,?next)?{

???}

???```

###?13.路由器的兩種工作模式

1.?對(duì)于一個(gè)url來說辩稽,什么是hash值惧笛?——?#及其后面的內(nèi)容就是hash值。

2.?hash值不會(huì)包含在?HTTP?請(qǐng)求中逞泄,即:hash值不會(huì)帶給服務(wù)器。

3.?hash模式:

???1.?地址中永遠(yuǎn)帶著#號(hào)拜效,不美觀?喷众。

???2.?若以后將地址通過第三方手機(jī)app分享,若app校驗(yàn)嚴(yán)格紧憾,則地址會(huì)被標(biāo)記為不合法到千。

???3.?兼容性較好。

4.?history模式:

???1.?地址干凈赴穗,美觀?憔四。

???2.?兼容性和hash模式相比略差。

???3.?應(yīng)用部署上線時(shí)需要后端人員支持般眉,解決刷新頁面服務(wù)端404的問題了赵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甸赃,隨后出現(xiàn)的幾起案子柿汛,更是在濱河造成了極大的恐慌,老刑警劉巖埠对,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件络断,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡项玛,警方通過查閱死者的電腦和手機(jī)貌笨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來襟沮,“玉大人锥惋,你說我怎么就攤上這事〕枷” “怎么了净刮?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硅则。 經(jīng)常有香客問我淹父,道長,這世上最難降的妖魔是什么怎虫? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任暑认,我火速辦了婚禮困介,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蘸际。我一直安慰自己座哩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布粮彤。 她就那樣靜靜地躺著根穷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪导坟。 梳的紋絲不亂的頭發(fā)上屿良,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音惫周,去河邊找鬼尘惧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛递递,可吹牛的內(nèi)容都是我干的喷橙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼登舞,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贰逾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逊躁,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤似踱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稽煤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體核芽,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年酵熙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧简。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匾二,死狀恐怖哮独,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情察藐,我是刑警寧澤皮璧,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站分飞,受9級(jí)特大地震影響悴务,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一讯檐、第九天 我趴在偏房一處隱蔽的房頂上張望羡疗。 院中可真熱鬧,春花似錦别洪、人聲如沸叨恨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痒钝。三九已至,卻和暖如春晕换,著一層夾襖步出監(jiān)牢的瞬間午乓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工闸准, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梢灭。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓夷家,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敏释。 傳聞我的和親對(duì)象是個(gè)殘疾皇子库快,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 記錄項(xiàng)目中遇到的問題 router-link上無法觸發(fā)點(diǎn)擊事件 解決:改為@click.native="fn()"...
    Blacker丶Boom閱讀 290評(píng)論 0 0
  • vue筆記 一.vue實(shí)例 vue的生命周期 beforeCreate(創(chuàng)建前), created(創(chuàng)建后), b...
    秋殤1002閱讀 1,057評(píng)論 0 1
  • Vue Vue是一個(gè)前端js框架,由尤雨溪開發(fā)钥顽,是個(gè)人項(xiàng)目 Vue近幾年來特別的受關(guān)注义屏,三年前的時(shí)候angular...
    hcySam閱讀 286評(píng)論 0 0
  • 什么是Vue 是一套用于構(gòu)建用戶界面的漸進(jìn)式 javascript 框架(漸進(jìn)式:想用什么就用什么不必全都用) 在...
    王果果閱讀 4,816評(píng)論 0 14
  • 這是我第5篇簡(jiǎn)書闽铐。 ??由于Vue在開發(fā)時(shí)對(duì)路由支持的不足,于是官方補(bǔ)充了vue-router插件奶浦。vue的單頁面...
    東西里閱讀 45,405評(píng)論 20 212