Vue學(xué)習(xí)筆記——vue-router

視頻資源來(lái)自:b站coderwhy王紅元老師——最全最新Vue、Vuejs教程,從入門到精通
文章僅為個(gè)人觀看視頻后的學(xué)習(xí)心得筆記埃元,用于個(gè)人查看和記錄保存勾给。文中定有疏漏錯(cuò)誤之處饰及,懇請(qǐng)指正右蕊。

==箭頭函數(shù)==:一種定義函數(shù)的方式

//1.定義函數(shù)的方式:function
const aaa = function () {
}

//2.對(duì)象字面量中定義函數(shù)
const obj = {
  bbb: function () {
  },
  bbb() {
  }
}

//3.ES6中的箭頭函數(shù)
//const ccc = (參數(shù)列表)=> {
//}
const ccc = () => {
}
  1. 參數(shù)問題

      //放入兩個(gè)參數(shù)
      const sum = (num1,num2) => {
        return num1+num2
      }
      //放入一個(gè)參數(shù),小括號(hào)省略
      const power = num => {
        return num * num
      }
    
  1.   //代碼塊中有多行代碼
      const test = () => {
        console.log('Hello')
        console.log('World')
      }
      //代碼塊中只有一行代碼,有沒有返回值都行
      const nul = (num1,num2) => {
        return num1 +num2
      }
      const nul = (num1,num2) => num1 +num2
    
    

箭頭函數(shù)的this

箭頭函數(shù)的this是如何查找的脯丝?

向外層作用域中一層層查找this商膊,直到有this的定義

Vuex認(rèn)識(shí)路由

前端渲染,后端渲染

后端路由階段

1.后端渲染

jsp:java server page

2.后端路由

后端處理URL和頁(yè)面直接的映射關(guān)系

前后端分離階段

后端只負(fù)責(zé)提供數(shù)據(jù)巾钉,不負(fù)責(zé)任何階段的內(nèi)容

前端渲染:瀏覽器中顯示的網(wǎng)頁(yè)中的大部分內(nèi)容翘狱,都是由前端寫的js代碼在瀏覽器中執(zhí)行,最終渲染出來(lái)的網(wǎng)頁(yè)

移動(dòng)端和網(wǎng)頁(yè)端的后端不需要進(jìn)行任何處理砰苍,使用同一套api

SPA頁(yè)面

<font color=#909534>SPA:?jiǎn)雾?yè)面富應(yīng)用</font>

整個(gè)網(wǎng)頁(yè)只有一個(gè)html頁(yè)面

每次交互都不用請(qǐng)求新的url潦匈。改變url阱高,頁(yè)面不進(jìn)行整體的刷新

SPA最主要的特點(diǎn)就是在前后端分離的基礎(chǔ)上加了一層前端路由

前端路由的規(guī)則

href ->hyper reference

控制臺(tái)location.hash = 'bdd',可以改變url而不刷新茬缩。

history.pushState(data,title,?url)

history.pushState({},'','home'),可以改變url而不刷新赤惊。

↑不斷push 入棧。history.back()=history.go(-1)出棧返回

go里面的數(shù)字表示指針移動(dòng)多少個(gè)值

history.forward()=history.go(1)

history.replaceState({},'','home')凰锡,替換未舟,不能返回

vue-router基礎(chǔ)

下載:npm install vue-router --save

import router from './router'

如果是個(gè)目錄(文件夾)會(huì)自動(dòng)找該文件夾里的index文件

1.創(chuàng)建路由組件

import Vue from 'vue'
import VueRouter from 'vue-router'

import Home from '../components/Home'
import About from '../components/About'

//1.通過Vue.use(插件),安裝插件
Vue.use(VueRouter)
//2.創(chuàng)建vueRouter對(duì)象
const routes =[
  {
    //協(xié)議頭://host/
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  },
  //沒有路徑時(shí),重定向到home(默認(rèn)打開首頁(yè))
  {
    path: '',
    redirect: '/home'
  }
]
const router = new VueRouter({
  //配置路由器和組件直接的映射關(guān)系
  routes,
  //默認(rèn)情況使用hash改變url掂为,也可改成history
  //mode: 'history'
 // linkActiveClass: 'active'
})

//3.將router對(duì)象傳入到Vue實(shí)例
export default router

配置組件和路徑的映射關(guān)系

import Home from '../components/Home'
import About from '../components/About'
const routes =[
  {
    //協(xié)議頭://host/
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  },
  //沒有路徑時(shí),重定向到home(默認(rèn)打開首頁(yè))
  {
    path: '',
    redirect: '/home'
  }
]

3.使用路由

    <router-link to="/home">首頁(yè)</router-link>
    <router-link to="/about">關(guān)于</router-link>
    <router-view></router-view>

<router-link to="/about">關(guān)于</router-link>——入口的顯示

to:指定跳轉(zhuǎn)的路徑

tag:默認(rèn)渲染成一個(gè)<a>標(biāo)簽裕膀,="button"時(shí)渲染成buttton

replace:默認(rèn)是可以返回的,加上這個(gè)標(biāo)簽(后面不用跟等于)勇哗,以后就不能返回了

active-class:選擇誰(shuí)昼扛,誰(shuí)的樣式就改變?yōu)橹纁lass

也可以在router里統(tǒng)一修改:linkActiveClass: 'active'

<router-view>——組件的顯示,占位

使用button代替link,用代碼實(shí)現(xiàn)跳轉(zhuǎn)

    <button @click="homeClick">首頁(yè)</button>
    <button @click="aboutClick">關(guān)于</button>
    <router-view></router-view>
export default {
  name: 'App',
  data(){
    return{
      $router: ''
    }
  },
  methods: {
    homeClick(){
      //通過代碼的方式修改路由vue-router
      //this.$router.push('/home')
      this.$router.replace('/home')
      console.log('homeClick')
    },
    aboutClick(){
      //通過代碼的方式修改路由vue-router
      this.$router.push('/about')
      console.log('aboutClick')
    }
  }
}

route:(不是router)當(dāng)前誰(shuí)處于活躍就是誰(shuí)

動(dòng)態(tài)路由:

組件User:(兩種寫法)

    <h2>{{$route.params.userId}}</h2>
    <h2>{{userId}}</h2>
    
    computed: {
      userId(){
        return this.$route.params.userId
      }
    }

父組件App

    <router-link v-bind:to='"/user/"+userId' active-class="active">用戶</router-link>
    
 data(){
    return{
      userId:'zhangsan'
    }

路由文件index

  {
    path: '/user/:userId',
    component: User
  }

路由懶加載

一個(gè)路由打包一個(gè)js文件欲诺,用到哪個(gè)加載哪個(gè)

方法一:結(jié)合Vue的異步組件和Webpack的代碼分析

方法二:AMD寫法

==方法三==:在ES6中, 我們可以有更加簡(jiǎn)單的寫法來(lái)組織Vue異步組件和Webpack的代碼分割.

const Home = () =>import('../components/Home')
const About = () =>import('../components/About')
const User = () =>import('../components/User')

路由嵌套

子路由:用children

path: '/home',
component: Home,
children: [
  {
  path: '',
 //不加斜杠就默認(rèn)從上一個(gè)路徑后面接下去     
  redirect:'news'
},
  {
  path: 'news',
  component:HomeNews
},
{
  path: 'message',
  component:HomeMessage
}]

傳遞參數(shù)

<font color=#909534>Profile -> 檔案</font>

加了冒號(hào):即v-bind抄谐,就把to=""里面的東西當(dāng)成語(yǔ)法解析,否則還是字符串扰法。

to="字符串"等價(jià)于:to="'字符串'"

URL: 協(xié)議://主機(jī):端口/路徑?查詢

scheme://localhost(:port)/path?query#fragment

傳遞參數(shù)的方式

params的類型:

動(dòng)態(tài)路由

配置路由格式: /router/:id
傳遞的方式: 在path后面跟上對(duì)應(yīng)的值
傳遞后形成的路徑: /router/123, /router/abc

query的類型:

配置路由格式: /router, 也就是普通配置
傳遞的方式: 對(duì)象中使用query的key作為傳遞方式
傳遞后形成的路徑: /router?id=123, /router?id=abc

<router-link :to="{path:'/profile',query:{name:'YY',age:18,height:1.88}}" >檔案</router-link>
    <h2>{{$route.query.name}}</h2>
    <h2>{{$route.query.age}}</h2>

所有組件都繼承著Vue的原型蛹含。父類中的方法,子類繼承了

導(dǎo)航守衛(wèi)

生命周期函數(shù)

跳轉(zhuǎn)函數(shù)實(shí)現(xiàn)在指定組件頁(yè)顯示指定title

routes配置都加上

<font color=#909534>meta——元數(shù)據(jù)(塞颁;描述數(shù)據(jù)的數(shù)據(jù))</font>

meta:{
      title:'檔案'
    },
//前置守衛(wèi)
router.beforeEach((to,from,next) =>{
  //從from跳轉(zhuǎn)到to
  document.title =to.matched[0].meta.title
  //下一步浦箱,默認(rèn)原本就有,重寫的話也得加上
  next()
})

matched[0]——如果一個(gè)父組件有多個(gè)子組件祠锣,title的元素不會(huì)在父組件里憎茂,會(huì)在子組件里,所以找第一個(gè)子組件(一般)的title元素

//后置守衛(wèi)锤岸,不需要主動(dòng)調(diào)用next函數(shù)
router.afterEach((to,from) =>{
  console.log('-----')
})

先調(diào)用前置守衛(wèi)。后調(diào)用后置守衛(wèi)

  • 全局守衛(wèi)

  • 路由獨(dú)享守衛(wèi)

    beforeEnter: (to,from,next) =>{}
    
  • 組件內(nèi)的守衛(wèi)

keep-alive遇見vue-router

標(biāo)簽在切換時(shí)板乙,被反復(fù)創(chuàng)建和銷毀(用[生命周期函數(shù)](# 生命周期函數(shù))來(lái)驗(yàn)證)是偷。可以用keep-alive使其保持活性

<keep-alive exclude="Profile,User">
  <router-view></router-view>
</keep-alive>

keep-alive的狀態(tài)下才能使用 activated/deactived和beforeRouteLeave這兩個(gè)函數(shù)

首頁(yè)中使用path屬性記錄離開時(shí)的路徑募逞,在beforeRouteLeave中記錄

//這兩個(gè)函數(shù)蛋铆,只有該組件被保持了狀態(tài),使用了keep-alive時(shí)放接,才是有效的
activated() {
  this.$router.push(this.path);
},
beforeRouteLeave(to,form,next){
  console.log(this.$route.path);
  this.path = this.$route.path;
  next()
}

keep-alive屬性:

  1. include - 字符串或正則表達(dá)刺啦,只有匹配的組件會(huì)被緩存
  2. exclude - 字符串或正則表達(dá)式(不要隨便加空格),任何匹配的組件都不會(huì)被緩存

TabBar練習(xí)

在組件里的<style>里引用樣式

<style>
  @import "./assets/css/base.css";
</style>

如果在js里就不用加@了纠脾。因?yàn)樵趕tyle里玛瘸,就要加@蜕青。但是子組件。糊渊。右核。。

樣式:

.tab-bar{
  display: flex;
}
.tab-bar-item{
  flex: 1;
  text-align: center;
}

class="tab-bar"放在大div里渺绒,class="tab-bar-item"放在選項(xiàng)div贺喝。

flex布局(display)

position: fixed;布局位置,left和right都等于0是為了讓tab-bar完全蓋住頁(yè)面

box-shadow:水平方向x 垂直方向y 模糊度 陰影的距離 顏色

<img src="https://xiao910888.oss-cn-hangzhou.aliyuncs.com/img/image-20210711144532777.png" alt="image-20210711144532777" style="zoom: 50%;" />

其中顏色:rgba(紅,綠,藍(lán),透明度)宗兼。透明度用小數(shù)躏鱼,0不用鞋,直接寫.8

flex: 1表示項(xiàng)目等分

text-align: center;在自己的領(lǐng)域居中

一般來(lái)說(shuō)殷绍,tab-bar高度為49px染苛。

webpack.base配置

alias: {
  '@': resolve('src'),
  'assets': resolve('src/assets'),
  'components': resolve('src/components'),
  'views': resolve('src/views'),
}

alias

使用時(shí)

 src="~assets/img/tabbar/home.svg"
 import TabBar from '@/components/tabbar/TabBar'

總目錄:
邂逅Vuejs
Vue基礎(chǔ)語(yǔ)法
組件化開發(fā)
前端模塊化
webpack詳解
Vue CLI詳解
vue-router
Promise的使用
Vuex詳解
網(wǎng)絡(luò)模塊封裝
項(xiàng)目實(shí)戰(zhàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市篡帕,隨后出現(xiàn)的幾起案子殖侵,更是在濱河造成了極大的恐慌,老刑警劉巖镰烧,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拢军,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怔鳖,警方通過查閱死者的電腦和手機(jī)茉唉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)结执,“玉大人度陆,你說(shuō)我怎么就攤上這事∠揍#” “怎么了懂傀?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜡感。 經(jīng)常有香客問我蹬蚁,道長(zhǎng),這世上最難降的妖魔是什么郑兴? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任犀斋,我火速辦了婚禮,結(jié)果婚禮上情连,老公的妹妹穿的比我還像新娘叽粹。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布虫几。 她就那樣靜靜地躺著锤灿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪持钉。 梳的紋絲不亂的頭發(fā)上衡招,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音每强,去河邊找鬼始腾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛空执,可吹牛的內(nèi)容都是我干的浪箭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辨绊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奶栖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起门坷,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宣鄙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后默蚌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻晤,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年绸吸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼻弧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锦茁,死狀恐怖攘轩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情码俩,我是刑警寧澤度帮,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站稿存,受9級(jí)特大地震影響够傍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挠铲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寂诱。 院中可真熱鬧拂苹,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至脯宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間连霉,已是汗流浹背榴芳。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窟感,地道東北人歉井。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓躏嚎,卻偏偏與公主長(zhǎng)得像卢佣,于是被迫代替她去往敵國(guó)和親菜谣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子珠漂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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