Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
使用 Vue.js 做项目的时候,一个页面是由多个组件构成的而生。 官方文档: 有很多朋友找我要 demo,但是博客中的这个案例被我删掉了,我只好随手写了一个超简单的 demo,希望能有所帮助
这次的实例主要实现下图的效果: 项目结构: 一、配置 Router ?用 vue-cli 创建的初始模板里面,并没有 vue-router,需要通过 npm 安装 cnpm i vue-router -D
安装完成后,在 src 文件夹下,创建一个 文件,和 main.js 平级 然后在 router.js 中引入所需的组件,创建?routers 对象 import Home from './components/home.vue'const routers =<span style="color: #000000;"> [
{ path: '/home'<span style="color: #000000;">,name: 'home'<span style="color: #000000;">,component: Home }, { path: '/'<span style="color: #000000;">,<span style="color: #000000;"> component: Home }, routers
在创建的 routers 对象中, path 配置了路由的路径,component 配置了映射的组件
import Vue from 'vue''vue-router''./routers''./App'Vue.use(VueRouter)
const router = <span style="color: #0000ff;">new<span style="color: #000000;"> VueRouter({mode: 'history'<span style="color: #000000;">,routes: routers }) <span style="color: #0000ff;">new<span style="color: #000000;"> Vue({ el: '#app'<span style="color: #000000;">,router,render: h =><span style="color: #000000;"> h(App) }) 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头。 添加 mode: 'history' 之后将使用 HTML5 history 模式,该模式下没有 # 前缀,而且可以使用 pushState 和 replaceState 来管理记录。 关于 HTML5 history 模式的更多内容,可以参考官方文档:
在这个实例中,为了加深项目层级,App.vue 只是作为一个存放组件的容器: 其中 是用来渲染通过路由映射过来的组件,当路径更改时, 上面已经配置了两个路由,当打开 http://localhost:8080 或者 http://localhost:8080/home 的时候,就会在 home.vue 是真正的父组件,first.vue、login.vue 等子组件都会渲染到 home.vue 中的 如此一来,就需要在一级路由中嵌套二级路由,修改 routers.js import Home from './components/home.vue''./components/children/first.vue''./components/children/login.vue'const routers =<span style="color: #000000;"> [
{ path: '/'<span style="color: #000000;">,component: Home, <span style="color: #000000;"><span style="font-size: 14px;">children: [ { path: <span style="font-size: 14px;">'/'<span style="color: #000000;">,<span style="color: #000000;"> component: Login } <span style="color: #000000;"><span style="font-size: 14px;">]<span style="color: #000000;"> },{ path: '/home'<span style="color: #000000;">,<span style="font-size: 14px;"> children: [ { path: <span style="font-size: 14px;">'/'<span style="color: #000000;">,name: 'login'<span style="color: #000000;">,component: Login },{ path: 'first'<span style="color: #000000;">,name: 'first'<span style="color: #000000;"><span style="font-size: 14px;">,component: First } ] } ] export <span style="color: #0000ff;">default routers 在配置的路由后面,添加 children,并在 children 中添加二级路由,就能实现路由嵌套
映射路由 home.vue 中引入了 header.vue 组件,其中含有导航菜单 当点击导航菜单的时候,会切换 home.vue 中 这种的情况,可以使用 来实现导航的功能: 在编译之后, 如果使用 v-bind 指令,还可以在 to 后面接变量,配合 v-for 指令可以渲染导航菜单 如果对于所有 ID 各不相同的用户,都要使用 home 组件来渲染,可以在 routers.js 中添加动态参数: '/home/'
这样 "/home/user01"、"/home/user02"、"/home/user03" 等路由,都会映射到 Home 组件 然后还可以使用
实际情况下,有很多按钮在执行跳转之前,还会执行一系列方法,这时可以使用来修改 url,完成跳转 push 后面可以是对象,也可以是字符串:
this.$router.push('/home/first'<span style="color: #008000;">//<span style="color: #008000;"> 对象
<span style="color: #000000;">this.$router.push({ path: '/home/first'<span style="color: #000000;"> }) <span style="color: #008000;">//<span style="color: #008000;"> 命名的路由
在学习的过程中,遇到一个困扰许久的问题,大概是从 first 组件跳转回 login 之后,无法再跳转回去。但是 url 已经被修改,刷新页面也能正常显示。 这是因为我在 first.vue 组件中的 data 里面没有写 return
在 vue 组件中,data 必须写为函数,且需要用 return 来返回参数。但是当 data 为空时,即使不写 return 也不会报错,所以导致了上面的问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |