vue javascript vue-router
Vue 的机制和 react 有很大差别,他的 router 的设计也是足够奇思妙想,而且符合编程逻辑
先从配置说起,要在 webpack 环境下读取 vue 文件必须安装 vue-loader 插件
这样配置即可。
之后开始搞事情~
模仿官方正版的 vue-router 的文件结构,我配置了一个 vue-router 类似的 routers.js
1 2 3 4
| export default { "/": "Home", "/about": "About", };
|
然后在 main.js 里进行注入:
下面看我的注释来讲解这些代码的具体含义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import Vue from "vue"; import routes from "./routes";
const app = new Vue({ el: "#app", data: { currentRoute: window.location.pathname, }, computed: { ViewComponent() { const matchingView = routes[this.currentRoute]; return matchingView ? require("./pages/" + matchingView + ".vue") : require("./pages/404.vue"); }, }, render(h) { return h(this.ViewComponent); }, });
window.addEventListener("popstate", () => { app.currentRoute = window.location.pathname; });
|
对 popstate 事件的介绍和使用方法
下面,我们将在官方给的示例的基础上继续推进,争取还原。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import Home from "./pages/Home.vue"; import About from "./pages/About.vue";
let routes = [ { path: "/", name: "home", component: Home, }, { path: "/about", name: "about", component: About, }, ]; export default routers;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import Vue from "vue"; import routes from "./routes";
const app = new Vue({ el: "#app", data: { currentRoute: window.location.pathname, }, computed: { ViewComponent() { for (var i = 0; i < routes.length; i++) { if (routes[i].path == this.currentRoute) { return routes[i].component; } else { return Erro; } } }, }, render(h) { return h(this.ViewComponent); }, });
window.addEventListener("popstate", () => { app.currentRoute = window.location.pathname; });
|
这个完成的其实也不是很漂亮,正常应该在 vue 里面去接受 router,然后再在单独的文件去修改,做到解耦。
最后:
参照思路