手寫一個vue-router
實現效果如下:
1. 準備好環境
使用 vue/cil 初始化專案配置:
npm install -g @vue/cli //全域性安裝@vue/cli
vue create demo-vue //建立專案
yarn add vue-router
安裝vue-router建立一個router資料夾並使用:
2. 實現目的
router/index.js
內容如下:(我們的目的將引入自寫的vue-router實現vue路由跳轉功能)
import vue from 'vue'
//import vueRouter from 'vue-router' //使用官方 vue-router 外掛
import vueRouter from './my-vue-router' //使用我們直接實現的 vue-router 外掛
vue.use(vueRouter) //此時執行 my-vue-router 內 install 方法
const routes = [
{
path: '/',
redrect: '/a'
},
{
path: '/a',
name: 'a',
component: () => import('../views/a.vue')
},
{
path: '/b',
name: 'b',
component: () => import('../views/b.vue')
}
]
const router = new vueRouter({
mode: 'hash', //雜湊路由
routes
})
export default router //main.js 引入例項化的 router 新增至 this.$options.router 中
3. 實現原理
router/my-vue-router.js
實現過程如下:
let Vue //宣告一個變數用來儲存install內接收的vue例項 給 constructor 內呼叫
class vueRouter {
constructor(options) {
this.$options = options //用於通過全域性 this.$options.router.$options 獲取
const initail = window.location.hash.slice(1) || '/'
Vue.util.defineReactive(this, 'current', initail) //監聽資料響應式渲染頁面
window.addEventListener('hashchange', () => { //監聽雜湊路由變化
this.current = window.location.hash.slice(1) //改變觸發 render 渲染頁面
})
}
push() {
console.log("跳轉頁面");
}
}
vueRouter.install = function(_vue) {
Vue = _vue
Vue.mixin({
beforeCreate() {
if (this.$options.router) {
Vue.prototype.$router = this.$options.router //將全域性資料注入元件
}
}
})
Vue.component('router-link', { //註冊全域性 router-link 元件
props: {
to: {
type: String,
required: true
}
},
render(h) {
return h(
'a',
{
attrs: { href: '#' + this.to }
},
this.$slots.default
)
}
})
Vue.component('router-view', { //註冊全域性 router-view 元件
render(h) {
console.log(" this.$router", this.$router);
const route = this.$router.$options.routes.find((route) => {
return route.path == this.$router.current
})
return h(route.component) //將元件渲染返回
}
})
}
export default vueRouter
3. 使用手寫vue-router:
a.vue
與 b.vue
可任意寫
<template>
<div id="app">
<router-link to="/a">aaa</router-link> |
<router-link to="/b">bbb</router-link>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
相關文章
- 手寫一個PromisePromise
- 手寫vue-router & 什麼是Vue外掛Vue
- 手寫一個自己的PromisePromise
- 手寫一個ChatGPT打字效果ChatGPT
- 手寫一個解析器
- 從頭手寫一個PromisePromise
- 手寫一個自定義PromisePromise
- 手寫一個LRU工具類
- 第143篇:手寫vue-router,實現router-viewVueView
- 使用React手寫一個手風琴元件React元件
- vue-router 原始碼:實現一個簡單的 vue-routerVue原始碼
- 模擬 Vue 手寫一個 MVVMVueMVVM
- 手寫一個webpack4.0配置Web
- Spring Boot 動手寫一個 StartSpring Boot
- 仿照dubbo手寫一個RPC框架RPC框架
- 手寫一個簡易的WebpackWeb
- 手寫一個bind函式(大概)函式
- 手寫一個 webpack4.0配置Web
- 手寫一個 React 動畫元件React動畫元件
- 手寫一個Promise,附原始碼分析Promise原始碼
- 用jQuery手寫一個小遊戲jQuery遊戲
- 手寫一個靜態伺服器伺服器
- 自己動手寫一個持久層框架框架
- 手寫一個超簡單的VueVue
- 自己手寫一個SpringMVC框架(簡化)SpringMVC框架
- 手寫一個前端儲存工具庫前端
- vue 手寫一個時間選擇器Vue
- 手寫一個composer並上傳發布
- 寫一個Spark DataSource的隨手筆記Spark筆記
- 手寫一個webpack,看看AST怎麼用WebAST
- 實現一個簡化版的vue-routerVue
- 顫抖吧!一起手寫一個redux框架!Redux框架
- 理解webpack原理,手寫一個100行的webpackWeb
- 使用Netty三分鐘手寫一個RPCNettyRPC
- ES6 手寫一個“辨色”小遊戲遊戲
- 手寫一個node中的釋出訂閱
- 手寫一個Redis和Spring整合的外掛RedisSpring
- 攤牌了!我要手寫一個“Spring Boot”Spring Boot