10. 路由

2022-12-08 10:47:21发布
41

nuxt中配置路由只需在pages文件夹下创建对应的文件即可,不需要像vue那样,单独配置。


固定路由

现在有2个路由地址,分别为:

http://xxxx/news
http://xxxx/news/detail

其目录地址为 : pages/news.vue、pages/news/detail.vue


动态路由

以"_xxx.vue"开头的,为动态路由。这里的_xxx在地址栏中输入什么值都可以。比如 :

http://xxxx/abc
http://xxxx/123
http://xxxx/abc123

需要注意的是,不一定都要以id来命名。只要前面有带_的,后面是什么名字都可以。不过在获取地址栏参数的值的时候,如果是_id.vue,则需要用route.params.id来获取。如果你的文件名是_info.vue,那么获取参数就是route.params.info


动态路由 - 下划线为前缀的目录

注意上图,文件夹是以_开头的,其含义为 :

http://xxx/可变/info

比如输入下列地址都是合法的

http://xxxx/abc/info
http://xxxx/123/info
http://xxxx/abc123/info


子路由

创建内嵌子路由,需要添加一个 Vue 文件,同时添加一个与该文件同名的目录用来存放子视图组件。如下 :

红色框是主路由,蓝色框是子路由,子路由的文件夹名字必须和主路由的文件名同名。然后在主路由的文件,用<nuxt-child />来显示子路由

parent.vue

<template>
    <div>
        <p>parent</p>
        <nuxt-child />
    </div>
</template>

child1.vue

<template>
  <div>child1</div>
</template>

child2.vue

<template>
  <div>child2</div>
</template>


控制动态路由传入的值

http://www.baidu.com/question/xx,这里我想动态路由后面的xx,必须是一个数字。则可以这么做

export default {
  validate({ params }) {
    return /^d+$/.test(params.id); // 判断id是否是一个数字,返回true或者false
  }
};

validate如果返回true,则程序继续。如果返回false,则会跑到我们定义好的错误页面或者nuxt默认的错误页面


地址栏末尾添加.html

export default {
  asyncData({ route, redirect }) {
    const id = route.params.id;
    if (!id.includes(".html")) {
      redirect(id + ".html");
    }
  },
};

在地址栏上输入http://xxxx/123自动改成http://xxxx/123.html


路由地址代理

假设访问a页面的地址是http://www.tx.com/test/a那么在不改变文件的放置的位置的情况下,如何通过访问http://www.tx.com/a访问到原先写在pages/test/a里的页面呢?

这时可以使用路由地址代理,在nuxt.config.js中添加以下配置

router: {
  extendRoutes(routes, resolve) {
    const router = [
      {
          path: "/a",
          component: resolve(__dirname, "./pages/test/a.vue")
      },
    ];
    routes.push(...router);
  }
},

当路由访问到/a的地址时,会把地址代理到pages/test/a.vue


路由跳转

模板跳转方法

<nuxt-link to='/'>首页</nuxt-link>

js的跳转方法和vue一样