<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1、箭頭函數+import
const List = () => import('@/components/list.vue') const router = new VueRouter({ routes: [ { path: '/list', component: List } ] })
2、箭頭函數+require
const router = new Router({ routes: [ { path: '/list', component: resolve => require(['@/components/list'], resolve) } ] })
/router/:id
/router/123
路由定義
//在APP.vue中 <router-link :to="'/user/'+userId" replace>使用者</router-link> //在index.js { path: '/user/:userid', component: User, },
路由跳轉
// 方法1:<router-link :to="{ name: 'users', params: { myname: jake }}">按鈕</router-link>// 方法2:this.$router.push({name:'users',params:{myname:jake}})// 方法3:this.$router.push// 方法1: <router-link :to="{ name: 'users', params: { myname: jake }}">按鈕</router-link> // 方法2: this.$router.push({name:'users',params:{myname:jake}}) // 方法3: this.$router.push('/user/' + jake)
引數獲取 :通過 $route.params.userid
獲取傳遞的值。
/router
,也就是普通設定。/route?id=123
。路由定義
//方式1:直接在router-link 標籤上以物件的形式 <router-link :to="{path:'/profile',query:{name:'why',age:28,height:188}}">檔案</router-link> // 方式2:寫成按鈕以點選事件形式 <button @click='profileClick'>我的</button> profileClick(){ this.$router.push({ path: "/profile", query: { name: "kobi", age: "28", height: 198 } }); }
跳轉方法
// 方法1: <router-link :to="{ name: 'users', query: { uname: james }}">按鈕</router-link> // 方法2: this.$router.push({ name: 'users', query:{ uname:james }}) // 方法3: <router-link :to="{ path: '/user', query: { uname:james }}">按鈕</router-link> // 方法4: this.$router.push({ path: '/user', query:{ uname:james }}) // 方法5: this.$router.push('/user?uname=' + jsmes)
獲取引數:通過$route.query
獲取傳遞的值
有的時候,需要通過路由來進行一些操作,比如最常見的登入許可權驗證,當用戶滿足條件時,才讓其進入導航,否則就取消跳轉,並跳到登入頁面讓其登入。 為此有很多種方法可以植入路由的導航過程:全域性的,單個路由獨享的,或者元件級的。
vue-router全域性有三個守衛:
router.beforeEach
全域性前置守衛 進入路由之前。router.beforeResolve
全域性解析守衛,在beforeRouteEnter
呼叫之後呼叫。router.afterEach
全域性後置勾點 進入路由之後。to、from、next這三個引數:
to和from是將要進入和將要離開的路由物件,路由物件指的是平時通過this.$route獲取到的路由物件。next:Function
這個引數是個函數,且必須呼叫,否則不能進入路由(頁面空白)。
router.beforeEach
是全域性前置守衛,進入路由之前。
router.beforeEach((to, from, next) => { let ifInfo =Vue.prototype.$common.getSession('userData'); // 判斷是否登入的儲存資訊 if (!ifInfo) { // sessionStorage裡沒有儲存user資訊 if (to.path == '/') { //如果是登入頁面路徑,就直接next() next(); } else { //不然就跳轉到登入 Message.warning("請重新登入!"); window.location.href = Vue.prototype.$loginUrl; } } else { return next(); } })
如果你不想全域性設定守衛的話,你可以為某些路由單獨設定守衛:
const router = new VueRouter({ routes: [ { path: '/home', component: Home, beforeEnter: (to, from, next) => { // 引數用法什麼的都一樣,呼叫順序在全域性前置守衛後面,所以不會被全域性守衛覆蓋 // ... } } ] })
beforeRouterEnter
不能存取this是因為勾點在元件範例還沒被建立的時候呼叫,所以不能獲取元件範例 this,可以通過傳一個回撥給next來存取元件範例 。
beforeRouteEnter (to, from, next) { console.log('在路由獨享守衛後呼叫'); next(vm => { // 通過 `vm` 存取元件範例`this` 執行回撥的時機在mounted後面, }) }
beforeRouteUpdate (to, from, next) { // 在當前路由改變,但是該元件被複用時呼叫 可以存取元件範例 `this` // 舉例來說,對於一個帶有動態引數的路徑 /user/:id,在 /user/1 和 /user/2 之間跳轉的時候, // 由於會渲染同樣的 user 元件,因此元件範例會被複用。而這個勾點就會在這個情況下被呼叫。 }
導航離開該元件的對應路由時呼叫,我們用它來禁止使用者離開,比如還未儲存草稿,或者在使用者離開前,將setInterval銷燬,防止離開之後,定時器還在呼叫。
beforeRouteLeave (to, from , next) { if (文章儲存) { next(); // 允許離開或者可以跳到別的路由 上面講過了 } else { next(false); // 取消離開 } }
完整的路由導航解析流程(不包括其他生命週期):
beforeRouteLeave
beforeEach
beforeRouteUpdate
beforeEnter
。beforeRouteEnter
beforeResolve
afterEach
勾點。mounted
)。beforeRouteEnter
守衛中傳給 next
的回撥函數。在開發vue專案中,大部分元件是沒必要多次渲染的,所以vue提供了一個內建元件keep-alive
來快取元件內部狀態,避免重新渲染。
檔案:和 相似, 是一個抽象元件:它自身不會渲染一個 DOM 元素,也不會出現在父元件鏈中。
在被keep-alive
包含的元件/路由中,會多出兩個生命週期的勾點:activated
與 deactivated
。
activated
在元件第一次渲染時會被呼叫,之後在每次快取元件被啟用時呼叫。第一次進入快取路由/元件,在mounted
後面,beforeRouteEnter
守衛傳給 next 的回撥函數之前呼叫:
beforeMount=>別的路由進來(destroyed/deactivated)=> mounted=> activated 進入快取元件 => 執行 beforeRouteEnter回撥
因為元件被快取了,再次進入快取路由/元件時,不會觸發這些勾點:beforeCreate ,created ,beforeMount ,mounted
。
所以之後的呼叫時機是:
元件銷燬destroyed/或離開快取deactivated => activated 進入當前快取元件 => 執行 beforeRouteEnter回撥
元件被停用(離開路由)時呼叫,使用了keep-alive就不會呼叫beforeDestroy(元件銷燬前勾點)和destroyed(元件銷燬),因為元件沒被銷燬,被快取起來了。
這個勾點可以看作beforeDestroy的替代,如果你快取了元件,要在元件銷燬的時候做一些事情,你可以放在這個勾點裡。如果你離開了路由,會依次觸發:
元件內的離開當前路由勾點beforeRouteLeave => 路由前置守衛 beforeEach =>全域性後置勾點afterEach => deactivated 離開快取元件 => activated 進入快取元件(如果你進入的也是快取路由) // 如果離開的元件沒有快取的話 beforeDestroy會替換deactivated // 如果進入的路由也沒有快取的話 全域性後置勾點afterEach=>銷燬 destroyed=> beforeCreate等
那麼,如果我只是想快取其中幾個路由/元件,那該怎麼做?
Vue2.1.0之前:兩個keep-alive標籤+v-if判斷
<keep-alive> <router-view v-if="$route.meta.keepAlive"> <!--這裡是會被快取的路由--> </router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"> <!--因為用的是v-if 所以下面還要建立一個未快取的路由檢視出口--> </router-view> //router設定 new Router({ routes: [ { path: '/', name: 'home', component: Home, meta: { keepAlive: true // 需要被快取 } }, { path: '/:id', name: 'edit', component: Edit, meta: { keepAlive: false // 不需要被快取 } } ] });
Vue2.1.0版本之後: Vue新增了兩個屬性配合keep-alive來有條件地快取 路由/元件。
include和exclude支援三種方式來有條件的快取路由:採用逗號分隔的字串形式,正則形式,陣列形式。正則和陣列形式,必須採用v-bind形式來使用。
<keep-alive include="a,b">//逗號分隔形式 <component :is="view"></component> </keep-alive>
將路由導航、keep-alive、和元件生命週期勾點結合起來的,觸發順序,假設是從a元件離開,第一次進入b元件:
beforeRouteLeave
:路由元件的元件離開路由前勾點,可取消路由離開。beforeEach
: 路由全域性前置守衛,可用於登入驗證、全域性路由loading等。beforeEnter
: 路由獨享守衛beforeRouteEnter
: 路由元件的元件進入路由前勾點。beforeResolve
:路由全域性解析守衛afterEach
:路由全域性後置勾點beforeCreate
:元件生命週期,不能存取this。created
:元件生命週期,可以存取this,不能存取dom。beforeMount
:元件生命週期deactivated
: 離開快取元件a,或者觸發a的beforeDestroy
和destroyed
元件銷燬勾點。mounted
:存取/操作dom。activated
:進入快取元件,進入a的巢狀子元件(如果有的話)。beforeRouteEnter
回撥函數next。其實大部分的生命週期勾點函數不會被用到,但有幾點我們需要注意:
1.ajax請求最好放在created
裡面,此時可以存取到this,請求返回資料可以放在data裡面。
2.關於dom的操作要放在mounted
裡面,在mounted
前面存取dom會是undefined,因為還沒渲染完成。
3.每次進入或離開元件需要一些操作時:
進入的時候可以用created
和mounted
勾點,離開的時候用beforeDestory
和destroyed
勾點,beforeDestory
可以存取this,destroyed
不可以存取this。
快取了元件之後,再次進入元件不會觸發beforeCreate、created 、beforeMount、 mounted
,如果你想每次進入元件都做一些事情的話,你可以放在activated
進入快取元件的勾點中。同理:離開快取元件的時候,beforeDestroy和destroyed
並不會觸發,可以使用deactivated
離開快取元件的勾點來代替。
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45