如何在vue3+ts项目中使用query和params传参

Vue3 + TypeScript项目中,我们可以通过组合使用 paramsquery 来实现路由传参。下面是具体的步骤:

1. 安装路由

首先,我们需要通过 npm 或者 yarn 来安装 vue-router 路由插件。可以使用以下命令进行安装:

npm install vue-router
yarn add vue-router

2. 创建路由

安装 vue-router 后,我们需要在 src/router/index.ts 中创建路由并配置相应路由规则。下面是示例代码:

// src/router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import Home from "@/views/Home.vue";
import About from "@/views/About.vue";
import Article from "@/views/Article.vue";

const routes: Array<RouteRecordRaw> = [
  { path: "/", name: "Home", component: Home },
  { path: "/about", name: "About", component: About },
  // Article 路由规则中包含了动态路由参数 ":id"
  { path: "/article/:id", name: "Article", component: Article }
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

上面的路由规则在 routes 数组中进行配置,其中包含了三个路由规则:

  • / 路由指向 Home.vue 组件
  • /about 路由指向 About.vue 组件
  • /article/:id 路由指向 Article.vue 组件,其中 :id 是动态路由参数

3. 在组件中使用路由传参

有两种方式可以在组件中使用路由传参,分别是 paramsquery

3.1 使用 params 传参

params 是一种将参数存储在路由路径中的方式,它以冒号(:)开头,可以在组件的 props 中通过 route 对象来获取参数。下面是示例代码:

// src/views/Article.vue

<template>
  <div>
    <h1>文章标题:{{ title }}</h1>
    <p>文章内容:{{ content }}</p>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  props: ["route"],
  computed: {
    // 从 route.params 中获取 id 参数
    id(): string {
      return this.route.params.id;
    },
    title(): string {
      // 根据 id 查询文章标题
      // 此处省略具体代码
      return "文章" + this.id + "的标题";
    },
    content(): string {
      // 根据 id 查询文章内容
      // 此处省略具体代码
      return "文章" + this.id + "的内容";
    },
  },
});
</script>

上面的代码中,通过在路由规则中定义 :id 参数,将 id 传递给了 Article.vue 组件。组件中使用 props 接收 route 对象,并从中获取 id 参数来查询文章标题和内容。

3.2 使用 query 传参

params 不同,query 参数是一种存储在路由查询字符串中的方式,比如在 URL 中添加 ?id=1。在组件中,可以通过 $route.query 或者 router.history.current.query 来获取 query 参数。下面是示例代码:

// src/views/Article.vue

<template>
  <div>
    <h1>文章标题:{{ title }}</h1>
    <p>文章内容:{{ content }}</p>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { useRouter } from "vue-router";

export default defineComponent({
  data() {
    return {
      id: "",
    };
  },
  computed: {
    title(): string {
      // 根据 id 查询文章标题
      // 此处省略具体代码
      return "文章" + this.id + "的标题";
    },
    content(): string {
      // 根据 id 查询文章内容
      // 此处省略具体代码
      return "文章" + this.id + "的内容";
    },
  },
  created() {
    // 使用 useRouter 获取当前路由的 query 参数
    const router = useRouter();
    // 从 query 中获取 id 参数
    this.id = router.history.current.query.id;
  },
});
</script>

上面的代码中,使用 useRouter 获取当前路由的 query 参数,并将其中的 id 参数存储在组件的 data 中供后续使用。

4. 示例说明

我们假设现在有一个文章列表页面,点击文章标题可以跳转到对应文章的详情页面。我们可以通过如下方式来实现:

<!-- src/views/Home.vue -->

<template>
  <div>
    <h1>文章列表</h1>
    <ul>
      <li v-for="(article, index) in articles" :key="index">
        <router-link :to="{ name: 'Article', params: { id: article.id } }">{{ article.title }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  data() {
    return {
      articles: [
        { id: "1", title: "文章1" },
        { id: "2", title: "文章2" },
        { id: "3", title: "文章3" },
      ],
    };
  },
});
</script>

上面的代码中,在文章标题上使用 router-link 组件将路由指向 Article.vue 组件,并通过 params 传递了 id 参数。在 Article.vue 中,可以通过 $route.params.id 获取到 id 参数。

另外,我们也可以通过查询字符串来实现文章详情页的跳转:

<!-- src/views/Home.vue -->

<template>
  <div>
    <h1>文章列表</h1>
    <ul>
      <li v-for="(article, index) in articles" :key="index">
        <router-link :to="{ name: 'Article', query: { id: article.id } }">{{ article.title }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  data() {
    return {
      articles: [
        { id: "1", title: "文章1" },
        { id: "2", title: "文章2" },
        { id: "3", title: "文章3" },
      ],
    };
  },
});
</script>

上面的代码中,在查询字符串中传递了 id 参数,可以通过 $route.query.id 获取到参数值。在 Article.vue 组件中,使用 useRouter 来获取 query 参数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在vue3+ts项目中使用query和params传参 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Vue中$on和$emit的实现原理分析

    Vue中$on和$emit的实现原理分析 介绍 在Vue中,$on和$emit是两个非常常用的方法,用于实现事件的监听和触发。$on方法用于监听事件,$emit方法用于触发事件。本文将对Vue中$on和$emit的实现原理进行分析和讲解。 $on的实现原理 $on方法用于监听事件,其实现原理很简单,就是将事件名和事件处理函数保存到一个对象中。在触发事件时,遍…

    Vue 2023年5月28日
    00
  • vue.js入门教程之基础语法小结

    针对题目“vue.js入门教程之基础语法小结”的攻略,我将分别从以下几个方面来进行详细讲解。 一、前置知识 在进行Vue.js的学习之前,需要掌握一定的HTML/CSS/JavaScript基础知识。其中JavaScript是最为关键的一个部分,因为Vue.js本身就是一个JavaScript框架。同时,掌握ES6语法,能够在写Vue.js代码时更加便利。 …

    Vue 2023年5月28日
    00
  • 分析JavaScript数组操作难点

    下面我来详细讲解“分析JavaScript数组操作难点”的攻略。 一、引言 在Web开发中,JavaScript的数组操作是必不可少的一部分。然而在实际开发过程中,我们往往会遇到各种各样的问题和难点。本篇攻略将从以下几个方面进行分析: 数组的创建和初始化 数组的遍历和操作 数组的排序和筛选 二、数组的创建和初始化 在JavaScript中,我们可以通过以下两…

    Vue 2023年5月27日
    00
  • 用v-html解决Vue.js渲染中html标签不被解析的问题

    使用Vue.js时,如果在模板中绑定含有HTML标签的数据时,Vue.js会默认将其转义为纯文本,防止XSS攻击。有时候,开发者想要渲染出真正的HTML标签,就需要使用v-html指令。 以下是使用v-html指令解决Vue.js渲染中HTML标签不被解析的问题的攻略: 步骤一:在模板中使用v-html指令 在Vue.js的模板中使用v-html指令来解决H…

    Vue 2023年5月27日
    00
  • Uniapp全局消息提示以及其组件的实现方法

    Uniapp是一个跨端开发框架,使得我们可以非常方便地开发和部署多种移动端应用。在开发移动应用时,全局消息提示是一个必不可少的功能,这可以让用户在操作后接收到系统的反馈以便更好地交互。 Uniapp提供了一个uni.showToast()的API方法,可以让我们在全局范围内显示消息提示。下面是如何使用该API的方法: uni.showToast({ titl…

    Vue 2023年5月28日
    00
  • vue实现拖拽效果

    请按照下面的内容进行阅读。 拖拽效果的实现原理 在 Vue 中实现拖拽效果,通常需要用到两个事件:鼠标按下和鼠标移动。当鼠标按下时,记录下鼠标按下的位置,然后在鼠标移动事件中计算出当前位置和按下位置的差值,再用 JS 或 CSS 把要拖拽的元素移动到当前位置即可。 实现步骤 1. 添加拖拽功能的 HTML 结构 在 HTML 中,我们需要添加一个可拖拽元素,…

    Vue 2023年5月28日
    00
  • 手把手带你安装vue-cli并创建第一个vue-cli应用程序

    下面我将为您详细讲解如何安装vue-cli并创建第一个vue-cli应用程序的完整攻略。 1. 安装Node.js和npm 首先,您需要在您的电脑上安装Node.js和npm。如果您已经安装了,请跳过这一步。 您可以在Node.js的官方网站下载适合您操作系统的安装包,并按照提示进行安装。 2. 安装Vue CLI Vue CLI是一个基于Vue.js的快速…

    Vue 2023年5月27日
    00
  • vue下的@change事件的实现

    当我们在Vue中要监听表单控件的值变化时,可以使用@change事件。在Vue中,可以通过v-model指令来实现数据的双向绑定。当表单的值发生变化时,v-model会自动更新数据,而@change事件则可以在表单的值发生变化时执行自定义逻辑。 下面是一个使用@change事件的示例代码: <template> <div> <i…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部