<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
推薦大家先看看官方給出的外掛使用和開發方法
https://vuejs.bootcss.com/guide/plugins.html
1.use
Vue.use(VueRouter)
注意⚠️:
Vue.use()
主要是呼叫外掛內部的install方法,並將Vue範例作為引數傳入
2.new 一個router範例
const router = new VueRouter({ // 範例化router傳入的引數 mode: 'history', base: process.env.BASE_URL, routes })
3.new Vue() ,把範例放在vue的設定項裡面
new Vue({ router, // 注意router的範例也往裡傳 render: h => h(App) }).$mount('#app')
4.使用路由元件<router-view/>
、<router-link></router-link>
或者在元件中使用this.$router
將$router掛載到全域性上實現並宣告了兩個元件:<router-view/>
、<router-link></router-link>
let Vue; // 儲存vue的建構函式,避免打包將其打進去 VueRouter.install = function (_Vue) { Vue = _Vue; console.log("options", Vue.$options); Vue.mixin({ beforeCreate() { console.log("inner", this); console.log(" this.$options.router", this.$options.router); if (this.$options.router) { Vue.prototype.$router = this.$options.router; } }, }); console.log("end"); };
可以看到:
1、第一次執行的時候,即在Vue.use(Router)時,還沒有範例化vue(因為Vue.use()
發生在 new Vue()
之前),所以Vue.$option本身是拿不到的(ps: option就是new Vue()
時傳入的引數,router也往裡面傳),此時既然拿不到router的範例,所以不能直接在install方法裡面掛載;
2、我們可以在use的時候做一個全域性混入,在合適的時間點,獲取到Vue根範例設定項中的router範例, 執行掛載。緊接著在new Vue()根範例建立的時候,因為注入了router範例,所以再執行全域性混入(mixin)中的生命週期時,這個時候根範例的設定項this.$options
已經包含了router範例,可以此時把router掛載到Vue的原型上。之後所有Vue範例擴充套件來的VueCompont都可以通過this.$router
存取到這個屬性
先看看路由元件如何使用
<div id="app"> <div id="nav"> <!-- a標籤控制跳轉 --> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </div> <!-- 路由出口 --> <router-view /> </div>
由上面可以看出,點選router-link
,就相當於點了a標籤,然後a標籤的href屬性控制頁面路由發生了變化;監聽路由變化,然後仔router-view裡面輸出不同的模板;
class VueRouter { constructor(options) { // 接受傳入的引數 this.$options = options; const initial = "/"; // 將current變成響應式資料, //這樣在hashchange的回掉中修改curent時, //用到current的router-view的render函數就會重新渲染 Vue.util.defineReactive(this, "current", initial); // 監聽路由變化 window.addEventListener("hashchange", () => { // 獲取當前url中的hash this.current = window.location.hash.slice(1); }); } } VueRouter.install = function (_Vue) { Vue = _Vue; Vue.component("router-view", { render(h) { // 獲取當前路由所對應的元件,然後把它渲染出來 const { current, $options } = this.$router; // 這裡要注意 我們傳進來的routes是一個路由表,如下圖一 // 所以這裡我們是找出匹配到當前current路由的項,然後直接渲染元件 const route = $options.routes.find((item) => { return item.path === current; }); let component = route ? route.component : null; return h(component); }, }); }
再來看看router-view
class VueRouter { constructor(options) { // 接受傳入的引數 this.$options = options; const initial = "/"; // 將current變成響應式資料, //這樣在hashchange的回掉中修改curent時, //用到current的router-view的render函數就會重新渲染 Vue.util.defineReactive(this, "current", initial); // 監聽路由變化 window.addEventListener("hashchange", () => { // 獲取當前url中的hash this.current = window.location.hash.slice(1); }); } } VueRouter.install = function (_Vue) { Vue = _Vue; Vue.component("router-view", { render(h) { // 獲取當前路由所對應的元件,然後把它渲染出來 const { current, $options } = this.$router; // 這裡要注意 我們傳進來的routes是一個路由表,如下圖一 // 所以這裡我們是找出匹配到當前current路由的項,然後直接渲染元件 const route = $options.routes.find((item) => { return item.path === current; }); let component = route ? route.component : null; return h(component); }, }); }
圖一
// 我們要實現什麼 // 1、外掛 // 2、兩個元件 // 儲存vue的建構函式,避免打包將其打進去 let Vue; class VueRouter { constructor(options) { this.$options = options; const initial = "/"; Vue.util.defineReactive(this, "current", initial); this.current = "/"; window.addEventListener("hashchange", () => { // 獲取當前url中的hash this.current = window.location.hash.slice(1); }); } } // 引數1在Vue.use()呼叫時傳進來, VueRouter.install = function (_Vue) { Vue = _Vue; console.log("options", this); // 全域性混入 // 目的:延遲下面的邏輯 到 router建立完畢並且附加到選項上時才執行 Vue.mixin({ // 在每個元件建立範例時都會執行 beforeCreate() { // this.$options.router ;即new Vue時放進去的router範例 if (this.$options.router) { Vue.prototype.$router = this.$options.router; } }, }); // 註冊並且實現兩個元件 Vue.component("router-link", { props: { to: { required: true, }, }, render(h) { return h( "a", { attrs: { href: "#" + this.to }, }, this.$slots.default ); }, }); Vue.component("router-view", { render(h) { // 獲取當前路由所對應的元件,然後把它渲染出來 const { current, $options } = this.$router; const route = $options.routes.find((item) => { return item.path === current; }); let component = route ? route.component : null; return h(component); }, }); }; export default VueRouter;
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注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