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

问题描述

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>
相关推荐
小徐不会敲代码~14 分钟前
Vue3 学习 5
前端·学习·vue
_Kayo_15 分钟前
vue3 状态管理器 pinia 用法笔记1
前端·javascript·vue.js
How_doyou_do15 分钟前
工程级前端智能体FrontAgent
前端
daols8820 分钟前
vue 甘特图 vxe-gantt table 可视化依赖线的使用,可视化拖拽创建连接线的用法
vue.js·甘特图·vxe-table
2501_9444460023 分钟前
Flutter&OpenHarmony日期时间选择器实现
前端·javascript·flutter
二狗哈24 分钟前
Cesium快速入门34:3dTile高级样式设置
前端·javascript·算法·3d·webgl·cesium·地图可视化
JS_GGbond25 分钟前
前端实战:让表格Header优雅吸顶的魔法
前端
AlanHou26 分钟前
Three.js:Web 最重要的 3D 渲染引擎的技术综述
前端·webgl·three.js
JS_GGbond28 分钟前
前端必备技能:彻底搞懂JavaScript深浅拷贝,告别数据共享的坑!
前端
拖拉斯旋风28 分钟前
React 跨层级组件通信:使用 `useContext` 打破“长安的荔枝”困境
前端·react.js