同一动态路由之间跳转时页面数据不更新的问题

问题描述

Vue 中有时我们会使用到动态路由。具体如下

路由定义如下

js 复制代码
  {
    path: "/children/:id",
    name: "children",
    component: () => import("../views/children.vue")
  }

children 组件中我们可以通过 $route.params.id 获取到对应动态路由的参数,获取到参数后通常会在组件中使用该参数,这时候就可能会出现问题。

当我们在使用时是直接获取 $route.params.id 的值来进行展示,那么就不会出现问题。

html 复制代码
<template>
  <div>
    <p>children 组件的 id 为:{{ $route.params.id }}</p>
  </div>
</template>

但是如果是将 $route.params.id 的值赋值给一个变量,然后使用这个变量去展示的话,就会出现一个问题。

html 复制代码
<template>
  <div>
    <p>children 组件的 id 为:{{ id }}</p>
  </div>
</template>
js 复制代码
 data() {
    return {
      id: this.$route.params.id
    }
  },

那就是在同一动态路由之间进行切换时,由于路由没有发生改变,组件也就不会重新渲染,因此 id 的值也就不会改变,但此时路由参数已经发生改变。

解决方案

  1. 在组件中通过监听器对路由对象进行监听,然后对变量进行重新赋值。
js 复制代码
  data() {
    return {
      id: this.$route.params.id
    }
  },
  // 监听路由对象
  watch: {
    $route(to, from) {
      this.id = to.params.id
    }
  }
  1. 在组件中使用导航守卫 beforeRouteUpdate 来对变量进行重新赋值。
js 复制代码
  data() {
    return {
      id: this.$route.params.id
    }
  },
  beforeRouteUpdate(to, from, next) {
    this.id = to.params.id
    next()
  },
  1. 使用路由传参 props

在定义路由时通过设置 props的值为 true 来开启路由传参

js 复制代码
{
    path: "/children/:id",
    name: "children",
    component: () => import("../views/children.vue"),
    props: true
  },

在组件中可以通过 props 来接收参数

js 复制代码
props: ['id']  // 属性名要与动态参数名一致

这个时候就可以在组件中直接使用

html 复制代码
<template>
  <div>
    <p>children 组件的 id 为:{{ id }}</p>
  </div>
</template>
相关推荐
wand codemonkey8 分钟前
(三十)web应用+【核心】+【规矩】+【原理】
java·开发语言·前端
一拳一个娘娘腔14 分钟前
【SRC漏洞挖掘系列】第02期:XSS与CSRF——Web世界的“偷家”艺术
前端·xss·csrf
软件开发技术深度爱好者14 分钟前
轻量、安全、易用的HTML测试运行预览工具
前端·html
测试修炼手册15 分钟前
[测试工具] Playwright Skill 和 Codex Chrome 浏览器操控的异同
前端·chrome·测试工具
真的不想写实验19 分钟前
uniapp上传文件的载荷是个空对象
前端·uni-app
yuhaiqiang20 分钟前
当程序员被ai逼到了悬崖边,还有哪些选择?
前端·人工智能·后端
D_jing202 小时前
Vue 3 + Element Plus 重置el-drawer样式失效
前端·javascript·vue.js
__log2 小时前
Vue 3 与 React 18+ 核心技术深度对比:从源码到实战
前端·vue.js·react.js
很晚很晚了7 小时前
纯前端转全栈 Day 1:我从第一个 NestJS 接口开始
前端
Lee川8 小时前
从零解剖一个 AI Agent Tool是如何实现的
前端·人工智能·后端