You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue.js 2中如何通过$router.push向Router View传递组件Props?

在Vue.js 2中给Router View传递组件Props的正确姿势

我懂你的需求——就是想让MeComponent不管是在路由里渲染还是单独拿出来复用,都能通过props接收user,而不是依赖$route.params,这样组件的复用性才拉满对吧?其实很简单,分两步就能搞定:

第一步:配置路由时开启props映射

首先得在你的路由配置里给Me路由加上props: true,这样Vue Router会自动把路由的params参数映射成组件的props,不用你在组件里手动去$route.params里扒数据:

// 你的路由配置文件,比如router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import MeComponent from '@/components/MeComponent.vue'

Vue.use(VueRouter)

const routes = [
  // 其他路由...
  {
    name: 'Me',
    path: '/me',
    component: MeComponent,
    props: true // 关键!开启params到props的自动映射
  }
]

const router = new VueRouter({
  routes
})

export default router

要是你需要更灵活的映射(比如只传特定参数,或者对参数做转换),可以用函数式的props:

{
  name: 'Me',
  path: '/me',
  component: MeComponent,
  props: (route) => ({
    user: route.params.user,
    // 还可以加其他自定义props
    test: route.params.test
  })
}

第二步:$router.push时正常传params

你之前的push调用其实不用改太多,保持传params就行,因为路由已经帮你把params转成props了:

<a href="#" v-on:click.prevent="$router.push({name: 'Me', params: { user: user, test: 1 }})" class="pure-menu-link">Me</a>

这时候你的MeComponent里的props: ['user']就能直接拿到值了,组件里直接用this.user就行,完全不用碰$route.params!而且当你在路由外面用这个组件时,直接写<MeComponent :user="someUser" />也完全没问题,完美复用~

小提醒

如果你的user是复杂对象,用params传递的话,页面刷新后数据会丢失(因为路由参数本质是URL的一部分,没法存复杂对象)。如果需要刷新后还能保留,那建议传用户ID,然后在组件里根据ID去请求数据,这样更稳妥。

内容的提问来源于stack exchange,提问作者Halcyon

火山引擎 最新活动