Vue3 / Ts Router详解

本文详细介绍了Vue.js中的路由机制,包括路由的基本配置、声明式与编程式路由跳转、路由传参的方法、路由嵌套及命名视图的应用。通过具体实例展示了如何在Vue项目中实现页面间的跳转和数据传递。

一、路由跳转

router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";

// 2. 配置路由
const routes: Array<RouteRecordRaw> = [
  {
    path: "/login",
    component: () => import("../components/login.vue"),
  },
  {
    path: "/reg",
    component: () => import("../components/reg.vue"),
  },
];
// 1.返回一个 router 实列,为函数,里面有配置项(对象) history
const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 3导出路由   然后去 main.ts 注册 router.ts
export default router

main.ts

import { createApp } from 'vue'
import App from './App.vue'


import router from "./router/index"
createApp(App).use(router).mount('#app')

app.vue

<template>
  <div>
    <h1>APP</h1>
   声明式路由跳转  两种方式 加入 replace 不会留下历史记录
      <router-link replace to="/login"><button>login</button></router-link>
   配置路由的 index 里面添加 name  
      <router-link :to="{ name: 'Reg' }" style="margin-left: 10px"
        ><button>reg</button></router-link
      >
    <router-view></router-view>
  </div>
</template>

<script setup lang="" ts></script>

<style></style>

编程式路由导航 path 

app.vue

<template>
  <div>
    <div class="header">
      <h1>APP</h1>
      <!-- 【编程式路由跳转】 -->
      <button @click="toPagePath('/login')">login</button>
      <button @click="toPagePath('/reg')">reg</button>
    </div>
    <router-view></router-view>
  </div>
</template>

<script setup lang="ts">
// 字符串 path 跳转方式
import { useRouter } from "vue-router";
const router = useRouter();
const toPagePath = (url: string) => {
这里回调写成对象,方便后面传参 push 写成 replace 不会留下历史记录
  router.push({
    path: url,
  });
};
</script>

编程式路由导航 name

app.vue

<template>
  <div>
    <div class="header">
      <h1>APP</h1>
      <!-- 【编程式路由跳转】 -->
      <button @click="toPagePath('Login')">login</button>
      <button @click="toPagePath('Reg')">reg</button>
    </div>
    <router-view></router-view>
  </div>
</template>

<script setup lang="ts">
// 字符串 path 跳转方式
import { useRouter } from "vue-router";
const router = useRouter();
const toPagePath = (url: string) => {
这里回调写成对象,方便后面传参 push 写成 replace 不会留下历史记录
  router.push({
    name: url,
  });
};
</script>

二、路由传参

login 给 reg 传参

商品列表点击查看详情案例

 二.1、query传参方式

login.vue

<template>
  <div class="login">
    <h4>shopping list</h4>
    <table cellspacing="0" class="table" border="1" color="white">
      <thead>
        <tr>
          <th>商品名称</th>
          <th>价格</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody>
        <tr :key="item.id" v-for="item in data">
          <th>{{ item.name }}</th>
          <th>{{ item.price }}</th>
          <th>
            <button @click="toDaitle(item)">查看详情</button>
          </th>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script setup lang="ts">
import { data } from "./list.json";
import { useRouter } from "vue-router"; // 传递参数用 useRouter
const router = useRouter();

 //定义 item 的值并规定类型
interface Item {
   // interface 改成 type 也行
  name: string;
  price: number;
  id: number;
}
const toDaitle = (item: Item) => {
  router.push({
    path: "/reg",
    // query 接受的是个对象{} item 此处item刚好是个对象 此时已经传过去参数了
    query: item,
  });
};
</script>

此时参数已经传过来了(如图),但没有添加到页面,需要 reg 页面接受参数 

reg.vue

<template>
  <div class="reg">
    <h4>商品详情reg</h4>
    <!-- 用 query传 就用 query取 -->
    <p>商品名称:{{ route.query.name }}</p>
    <p>价格:{{ route.query.price }}</p>
    <p>编号:{{ route.query.id }}</p>
    <button @click="$router.back">返回</button>
  </div>
</template>

<script setup lang="ts">
import { data } from "./list.json";
import { useRoute, useRouter } from "vue-router"; // 获取参数 用 useRoute

const route = useRoute();
const back = useRouter();
</script>


如图

  二.2、params传参方式 

商品列表页面
router.push({
    name:"Reg"
    params:item
  });
// params 用到 router/index.ts 配置路由里面的 name
router/index.ts

{
    path: "/reg",
    name:"Reg",
    component: () => import("../components/reg.vue"),
  },
详情页面
<template>
  <div class="reg">
    <h4>商品详情reg</h4>
    <!-- 用 params传 就用 params取 -->
    <p>商品名称:{{ route.params.name }}</p>
    <p>价格:{{ route.params.price }}</p>
    <p>编号:{{ route.params.id }}</p>
    <button @click="$router.back">返回</button>
  </div>
</template>

<script setup lang="ts">
import { data } from "./list.json";
import { useRoute, useRouter } from "vue-router"; // 获取参数 用 useRoute

const route = useRoute();
const back = useRouter();
</script>


❤特别意注:params 传参 参数不会展示在 url地址上 ,因为存在内存中,如图 params 传参跳转到详情后 url为下图

 如此便造成一个刷新后 丢失参数的问题,如下图所示刷新页面后,传递的数据丢失

三、路由嵌套

添加 footer 父路由,将 login商品列表页面reg商品详情页面 包在footer里面 充当子路由,效果如图

footer.vue
<template>
  <div>
      <router-view></router-view>
      <hr>
      <h1>footer父路由</h1>
      <router-link to="/"><button>login</button></router-link>
      <router-link to="/reg"><button>reg</button></router-link>
  </div>
</template>

router/index.ts

{
    path: "/",
    component: () => import("../components/footer.vue"),
    children: [
      {
        path: "", // 默认展示 为空
        name: "Login",
        component: () => import("../components/login.vue"),
      },
      {
        path: "/reg", // 这里可以不写 /
        name: "Reg",
        component: () => import("../components/reg.vue"),
      },
    ]
  },

注:如果给 父路由 path 添加添加前缀 如下 添加前缀为 fat 那么跳转时也必须加上前缀 fat

router

{
    path: "/fat",
    component: () => import("../components/footer.vue"),
    children: []
}
footer

<template>
  <div>
      <router-view></router-view>
      <hr>
      <h1>footer父路由</h1>
      <router-link to="/fat"><button>login</button></router-link> // 添加前缀 fat
      <router-link to="/fat/reg"><button>reg</button></router-link> // 添加前缀 fat
  </div>
</template>

四、命名视图

所用场景为 :

router 跳转至 user1 页面 显示的内容为 A组件 的内容

router 跳转至 user2 页面 显示的内容为 B、C组件 的内容

(有点像插槽)

【App.vue】

<template>
  <router-view></router-view>
</template>

<script setup lang="ts">
</script>
【router/index.js】配置路由

{
    path: '/',
    component: () => import('../components/routee.vue'),
    redirect: "/user1", // 默认进入页面 重定向
    children: [
      {
        path: '/user1',
        // 定义多个 用 components 且为一个对象
        components: {
          // default 定义 router-view 显示的默认页面 就是 router-view 里面不带 name 属性
          default: () => import("../components/A.vue")
        }
      },
      {
        path: "/user2",
        // router-view 里面需要添加 name=b 或 name=c
        components: {
          b: () => import("../components/B.vue"),
          c: () => import("../components/C.vue")
        }
      }
    ]
  }
【routee.vue】

<template>
  <div>
    <h5>routee</h5>
    <hr />
    <router-link to="/user1">uesr1</router-link>
    <router-link to="/user2" style="margin-left: 10px">user2</router-link>
    <hr />
    <!-- 默认的显示 router/index.ts 里面 default 配置的页面 -->
    <router-view></router-view>
    <router-view name="b"></router-view>
    <router-view name="c"></router-view>
  </div>
</template>

<script setup lang="ts">
</script>

四.2、带参数的跳转

redirect : " " 可以进行重定向,同时也可以传递参数

其会返回一个函数 该函数 用 return 返回 一个对象 对象里面就是 path 重定向的页面 和 可以传递的参数。如下 query 传递了一个对象。

path: '/',
    component: () => import('../components/routee.vue'),
    redirect: hanshu => {
      console.log(hanshu);
      return {
        path: '/user1', // 默认进入页面 重定向
        // 用 query 传递参数 age = 18 
        query: {
          age: 18
        }
      }

    },
    children: []

当我们地址栏输入项目地址 http://localhost:3000 时 会自动重定向到 user1 并 携带传递的参数,控制台可以 log 该函数进行查看,如下两图

 

<think>首先,用户查询是:“我想查找在VUE3中配置TypeScript的方法 请问VUE3如何配置TypeScript”。所以,我需要基于提供的引用信息来回答如何在Vue 3项目中配置TypeScript。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式(但这里没有数学内容,所以可能不需要)。 - 独立公式使用$$...$$(这里不需要)。 - LaTeX语法正确(不适用于此)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 提供的引用: - [^1]:如何在Vue3项目中引入TypeScript。步骤包括: - 初始化Vue3项目:用Vue CLI创建项目,选择手动配置,选Vue 3。 - 安装TypeScript:运行 `npm install typescript --save-dev`。 - [^2]:Vue3与TypeScript的深度结合:技术指南及实践详解。提到类型化路由器实例等。 - [^3]:如果是已有项目,手动添加ts相关依赖:`npm install typescript vue-tsc --save-dev`。 - [^4]:vue3+TypeScript(一)。创建项目时,使用 `npm create vue@latest`,在配置中选择添加TypeScript支持。 用户的问题是关于配置TypeScript在Vue 3中,所以我需要整合这些引用信息来提供一个清晰的指南。 步骤结构: 1. **创建新项目时配置:** 根据[^1]和[^4]。 2. **在现有项目中添加TypeScript:** 根据[^3]。 3. **其他配置细节:** 如类型定义、路由配置等,引用[^2]。 回答结构: - 以逐步的方式解释。 - 使用代码块展示命令。 - 自然添加引用标识。 最后,生成相关问题。 提纲回答: 1. 介绍:简要说明如何在Vue 3中配置TypeScript。 2. 逐步方法: - 选项1:创建新项目并添加TypeScript。 - 选项2:在现有Vue 3项目中添加TypeScript。 - 配置细节:如设置tsconfig.json,编写组件等。 3. 结尾提示。 4. 生成相关问题。 确保语言中文。 </think>### Vue 3 中配置 TypeScript 的逐步指南 在 Vue 3 项目中配置 TypeScript 可以显著提升代码的健壮性和可维护性,因为它提供了静态类型检查和智能提示。以下方法基于引用内容整理,分为新项目创建和现有项目改造两种情况。我会一步步引导你完成配置过程。 #### 选项 1: 创建新项目时直接添加 TypeScript 支持 如果你还没有项目,推荐使用 Vue CLI 或 `create-vue` 工具初始化项目并选择 TypeScript。步骤如下: 1. **初始化 Vue 3 项目**:在终端中运行创建命令,选择手动配置模式。 ```bash npm create vue@latest ``` 在交互式配置中,确保启用以下选项: - Project name: 输入你的项目名(例如 `my-vue3-ts-project`) - **Add TypeScript?**: 选择 `Yes`(这是关键步骤)[^4] - 根据需要选择其他选项(如 JSX、路由或 ESLint),但对 TypeScript 配置无影响。 2. **安装依赖**:项目创建完成后,进入项目目录并安装所需依赖。 ```bash cd my-vue3-ts-project npm install ``` 这将自动安装 TypeScript 和 Vue 的类型声明包(如 `@vue/runtime-dom`)[^1]。 3. **验证配置**:项目根目录会生成 `tsconfig.json` 文件(TypeScript 配置文件)。你可以修改它以适应需求,例如添加严格模式: ```json { "compilerOptions": { "strict": true // 启用严格的类型检查 } } ``` #### 选项 2: 在现有 Vue 3 项目中添加 TypeScript 如果你的项目已存在,手动添加 TypeScript 和相关工具。 1. **安装 TypeScript 依赖**:在项目根目录运行以下命令安装核心包。 ```bash npm install typescript vue-tsc --save-dev ``` - `typescript`:提供 TypeScript 编译器。 - `vue-tsc`:专为 Vue 设计的 TypeScript 检查工具,支持 `.vue` 文件类型检查[^3]。 2. **配置 TypeScript**: - 创建 `tsconfig.json` 文件:在项目根目录添加或修改此文件。基本配置如下: ```json { "compilerOptions": { "target": "ESNext", "module": "ESNext", "strict": true, "jsx": "preserve", "moduleResolution": "Node", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "isolatedModules": true }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"] // 指定文件范围 } ``` - 更新 `vite.config.ts`(或 `vue.config.js`):如果使用 Vite,确保引入 Vue 的 TypeScript 插件。示例: ```typescript import { defineConfig } from &#39;vite&#39; import vue from &#39;@vitejs/plugin-vue&#39; export default defineConfig({ plugins: [vue()] }) ``` 3. **迁移文件到 TypeScript**: - 将 `.js` 文件重命名为 `.ts`(如 `main.js` → `main.ts`)。 - 在 Vue 组件中使用 TypeScript: ```vue <script lang="ts"> import { defineComponent } from &#39;vue&#39; export default defineComponent({ props: { message: { type: String, required: true } // 类型定义 props }, setup() { const count = ref<number>(0) // 使用泛型指定 ref 类型 return { count } } }) </script> ``` - 对于路由(如 Vue Router),使用类型化配置(例如 `RouteRecordRaw`)提升安全性[^2]。 4. **运行和检查**:启动开发服务器,并利用 `vue-tsc` 检查类型错误。 ```bash npm run dev # 开发模式 npx vue-tsc --noEmit # 静态类型检查 ``` #### 常见问题和提示 - **类型错误处理**:如果遇到类型错误,检查 `node_modules` 中是否安装了 `@vue/runtime-core` 等类型包(可通过 `npm install @types/node --save-dev` 补充)。 - **IDE 支持**:推荐使用 VSCode 并安装 Volar 插件,它提供实时的 Vue + TypeScript 智能提示。 - **性能优化**:在生产构建时,`vue-tsc` 可集成到 CI/CD 流程中,提前捕获类型问题[^2]。 通过以上步骤,你的 Vue 3 项目将完全支持 TypeScript,显著减少运行时错误并提升协作效率[^1][^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值