18.动态路由

85 阅读2分钟

文章列表页逻辑

路由跳转逻辑

image-20210107140253824

组件逻辑

image-20210107142310757

BlogList

image-20210107153623557

BlogCategory

image-20210107154531659

知识

动态路由

我们希望下面的地址都能够匹配到Blog组件

  • /article,显示全部文章
  • /article/cate/1,显示分类id1的文章
  • /article/cate/3,显示分类id3的文章
  • ...

第一种情况很简单,只需要将一个固定的地址匹配到Blog组件即可

{
  path: "/article",
  name: "Blog",
  component: Blog
}

但后面的情况则不同:匹配到Blog组件的地址中,有一部分是动态变化的,则需要使用一种特殊的表达方式:

{
  path: "/article/cate/:categoryId",
  name: "CategoryBlog",
  component: Blog
}

在地址中使用:xxx,来表达这一部分的内容是变化的,在vue-router中,将变化的这一部分称之为params,可以在vue组件中通过this.$route.params来获取

// 访问 /article/cate/3
this.$route.params // { categoryId: "3" }
// 访问 /article/cate/1
this.$route.params // { categoryId: "1" }

动态路由的导航

<router-link to="/article/cate/3">to article of category 3</router-link>

<router-link :to="{
   name: 'CategoryBlog',
   params: {
       categoryId: 3           
   }                    
}">to article of category 3</router-link>

编程式导航

除了使用<RouterLink>超链接导航外,vue-router还允许在代码中跳转页面

this.$router.push("跳转地址"); // 普通跳转
this.$router.push({ // 命名路由跳转
  name:"Blog"
})

this.$router.go(-1); // 回退。类似于 history.go

watch

利用watch配置,可以直接观察某个数据的变化,变化时可以做一些处理

export default {
  // ... 其他配置
  watch: {
    // 观察 this.$route 的变化,变化后,会调用该函数
    $route(newVal, oldVal){
      // newVal:this.$route 新的值,等同 this.$route
      // oldVal:this.$route 旧的值
    },
    // 完整写法
    $route: {
      handler(newVal, oldVal){},
      deep: false, // 是否监听该数据内部属性的变化,默认 false
      immediate: false // 是否立即执行一次 handler,默认 false
    }
    // 观察 this.$route.params 的变化,变化后,会调用该函数
    ["$route.params"](newVal, oldVal){
      // newVal:this.$route.params 新的值,等同 this.$route.params
      // oldVal:this.$route.params 旧的值
    },
  	// 完整写法
    ["$route.params"]: {
      handler(newVal, oldVal){},
      deep: false, // 是否监听该数据内部属性的变化,默认 false
      immediate: false // 是否立即执行一次 handler,默认 false
    }
  }
}

路由可以作为计算属性的依赖。

当地址变化的时候,会产生一个新的route对象,这样监控route就可以监控到了。 如果仅仅是指route对象的一个属性发生了改变,监控不到类似于kvo。 如果要监控route的某个属性发生改变需要按照下面的写:

Pasted Graphic 47.tiff

Pasted Graphic 48.tiff

如果发现当前的类的样式串了,就要看看是否是style里面没有scoped