昨日内容回顾

  1. 1. 组件间的传值
  2. 1. bus --> Vue对象
  3. 通过向bus对象抛出自定义事件的方式在组件间传递信息
  4. 2. 注意事项:
  5. 1. bus.$on()应该在组件mounted(挂载在页面上)的时候就执行
  6. 2. this对象
  7. 2. Vue实例的生命周期钩子函数(8个)
  8. 1. beforeCreate
  9. data属性光声明没有赋值的时候
  10. 2. created
  11. data属性完成了赋值
  12. 3. beforeMount
  13. 页面上的{{name}}还没有被渲染成真正的数据
  14. 4. mounted
  15. 页面上的{{name}}被渲染成真正的数据
  16. 5. beforeUpdate
  17. 数据(data属性)更新之前会执行的函数
  18. 6. updated
  19. 数据(data属性)更新完会执行的函数
  20. 7. beforeDestroy
  21. 实例被销毁之前会执行的函数
  22. 8. destroyed
  23. 实例被销毁后会执行的函数
  24. 3. VueRouter
  25. 在前端做路由的
  26. 1. 基本使用
  27. 1. 先写路由
  28. 2. 生成路由实例
  29. 3. 将路由实例挂载到Vue对象上
  30. 4. <router-link></router-link>
  31. <router-view></router-view> <==> <router-view/>
  32. 2. 路由的模糊匹配
  33. 1. path: '/user/:name' ---> $route.params.name
  34. 2. /user/alex?age=9000 ---> $route.query.age
  35. 3. 子路由
  36. children
  37. 4. 编程式导航
  38. JS代码去控制页面跳转
  39. this.$router.push(...)
  40. 4. Vue-CLI
  41. 一个脚手架工具,帮助我们快速的搭建Vue项目
  42. 1. 查看本机安装的vueCLI的版本
  43. vue -V ---> 2.9.6
  44. 2. 使用Vue CLI创建Vue项目
  45. vue init webpack mysite
  46. 5. 组件中捕获原生事件
  47. .native修饰符

一、编程式的导航

除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现。

router.push(location, onComplete?, onAbort?)

注意:在 Vue 实例内部,你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push

想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。

当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 <router-link :to="..."> 等同于调用 router.push(...)

声明式 编程式
<router-link :to="..."> router.push(...)

该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:

  1. // 字符串
  2. router.push('home')
  3. // 对象
  4. router.push({ path: 'home' })
  5. // 命名的路由
  6. router.push({ name: 'user', params: { userId: 123 }})
  7. // 带查询参数,变成 /register?plan=private
  8. router.push({ path: 'register', query: { plan: 'private' }})

注意:如果提供了 pathparams 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path

  1. const userId = 123
  2. router.push({ name: 'user', params: { userId }}) // -> /user/123
  3. router.push({ path: `/user/${userId}` }) // -> /user/123
  4. // 这里的 params 不生效
  5. router.push({ path: '/user', params: { userId }}) // -> /user

同样的规则也适用于 router-link 组件的 to 属性。

在 2.2.0+,可选的在 router.pushrouter.replace 中提供 onCompleteonAbort 回调作为第二个和第三个参数。这些回调将会在导航成功完成 (在所有的异步钩子被解析之后) 或终止 (导航到相同的路由、或在当前导航完成之前导航到另一个不同的路由) 的时候进行相应的调用。

注意:如果目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个 /users/1 -> /users/2),你需要使用 beforeRouteUpdate 来响应这个变化 (比如抓取用户信息)。

router.replace(location, onComplete?, onAbort?)

router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

声明式 编程式
<router-link :to="..." replace> router.replace(...)

举例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .active{
  8. color:red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <div id="app">
  14. <!--编程时导航-->
  15. <button @click="goHome">去首页</button>
  16. <button @click="goList">去列表</button>
  17. <router-view></router-view>
  18. </div>
  19. </body>
  20. <script src="https://unpkg.com/vue/dist/vue.js"></script>
  21. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  22. <script>
  23. let home={
  24. template:'<div>home</div>'
  25. };
  26. let list={
  27. template:'<div>list</div>'
  28. }
  29. const routes=[
  30. {path:'/home',component:home},
  31. {path:'/list',component:list}
  32. ]
  33. let router=new VueRouter({
  34. routes:routes,
  35. linkActiveClass:'active'
  36. });
  37. //默认加载第一个路径
  38. router.push("/home");
  39. let vm=new Vue({
  40. el:"#app",
  41. methods:{
  42. //编程式导航
  43. goHome(){
  44. //页面跳转,push是增加到历史管理
  45. this.$router.history.push('/home')
  46. //go表示前进后退
  47. //this.$router.history.go(-1)
  48. },
  49. goList(){
  50. this.$router.history.push('/list')
  51. //将当前历史管理替换成list
  52. //this.$router.history.replace('/list')
  53. }
  54. },
  55. // 会在实例中提供两个属性this.$route(属性),this.$router(方法);
  56. router:router,
  57. })
  58. </script>
  59. </html>

访问网页,效果如下:

Day92 编程式的导航,vue页面布局,marked包的使用 - 图1

二、vue页面布局

我们要完成这个效果

Day92 编程式的导航,vue页面布局,marked包的使用 - 图2

使用以下命令,创建一个vue项目,具体执行过程,请参考上一篇文章

  1. $ npm install -g vue-cli
  2. $ vue init webpack my-project
  3. $ cd my-project
  4. $ npm install bootstrap@3.3.7 -D
  5. $ npm run dev

去除默认页面

进入目录my-project\src\router

查看index.js,在routes里面有一行,它表示组件HelloWorld

  1. component: HelloWorld

查看上面的一行

  1. import HelloWorld from '@/components/HelloWorld'

@表示src目录

@/components/HelloWorld 表示src\components\HelloWorld.vue

.vue后缀,可以不用写。

组件统一在目录中components

进入目录my-project\src\components,查看HelloWorld.vue

之间的代码,就是默认首页,图片下面的一堆a标签。

修改 之间的代码。HelloWorld.vue部分代码如下:

  1. <template>
  2. <div class="hello">
  3. <h1>这是首页!!!</h1>
  4. </div>
  5. </template>

返回上一级,打开App.vue文件,查看 之间的代码

下面一行,表示一个图片。assets目录,可以放一些资源,比如图片之类的

  1. <img src="./assets/logo.png">

再看下面一行

  1. <router-view/>

它的完整代码是是一个简写,它会自动闭合!

初学者,建议使用完整写法!

删除这2行代码,增加一个bootstrap的导航条

修改App.vue里面 之间的代码,增加一个nav标签

修改App.vue里面 之间的代码,导入bootstrap

修改App.vue里面