使用编程导航 Vue.js 传递道具

Posted

技术标签:

【中文标题】使用编程导航 Vue.js 传递道具【英文标题】:Passing props with programmatic navigation Vue.js 【发布时间】:2017-12-22 10:30:39 【问题描述】:

我有一个 Vue 组件,它有一个名为“title”的道具,例如:

<script>
export default 
  props: ['title'],
  data() 
    return 
    
  

</script>

在某个操作完成后,我以编程方式导航到组件。 有没有办法在设置道具值的同时以编程方式路由用户?我知道您可以创建这样的链接:

<router-link to="/foo" title="example title">link</router-link>

但是,有没有办法执行以下操作?

this.$router.push( path: '/foo', title: 'test title' )

编辑:

按照建议,我已将路线更改为:

   
      path: '/i/:imageID',
      component: Image,
      props: true
    

然后导航到以下内容:

this.$router.push( path: '/i/15', params: title: 'test title' )

但是,我的图像组件(模板 - 见下文)仍然没有显示任何标题。

<h1> title</h1>

有什么可能导致问题吗?

【问题讨论】:

【参考方案1】:

使用参数。

this.$router.push( name: 'foo', params: title: 'test title' )

注意:您必须指定name。如果您使用path 调用this.$router.push,这将不起作用。

并设置路由接受参数作为道具。

path: "/foo", name:"foo", component: FooComponent,  props: true

props: true 是documented here。

【讨论】:

@AshleyB 这最终会按名称工作,而不是按路径工作。我没有解释为什么不按路径,但他们肯定会在文档中按名称进行。 codepen.io/Kradek/pen/eRapoZ?editors=1010 确认它仍然可以按名称工作,但不能按路径工作:router.push(name: 'routeName', params: whatever: 'andEver') 这是否意味着您不能这样做? path: "/foo/:id", name: "foo", component: FooComponent, props: true -push - routers.push(name:"foo", params:id:7, user: userObject ) 只是为了澄清@Bert 的回答,from the docs:注意:如果提供了路径,则忽略参数,这不是查询的情况,如上面的示例所示。相反,您需要提供路线的名称或使用任何参数手动指定整个路径 重要的是要提到参数值也必须在“查询”中的路由处,并且可以通过 this.$route.params.Yourparam 访问【参考方案2】:

vue-router 文档明确指出 params 仅适用于 name 而不适用于 path

// set  props: true in your route definition
const userId = 123
router.push( name: 'user', params:  userId ) // -> /user/123
// This will NOT work
router.push( path: '/user', params:  userId ) // -> /user

如果您使用path,请在路径本身中传递参数或使用query,如下所示:

router.push( path: `/user/$userId` ) // -> /user/123

// with query, resulting in /register?plan=private
router.push( path: 'register', query:  plan: 'private' )

【讨论】:

【参考方案3】:

在路由器中定义的子路由遇到同样的问题。下面的 router.js 显示了映射到命名的子路由

<router-view name="create"></router-view>
<router-view name="dashboard"></router-view>

路由器.js

    
      path: "/job",
      name: "Job",
      component: () => import("./views/JobPage"),
      children: [
        
          path: "create",
          name: "JobCreate",
          components: 
            create: JobCreate
          
        ,
        
          path: ":id",
          name: "JobConsole",
          components: 
            dashboard: JobConsole
          
        
      ]
    ,

当我尝试从 create 传递 props 时,vue-router 无法捕获 JobConsole 所需的动态路由匹配:

      this.$router.push(
        
          name: "Job",
          params: 
            id: this.ID_From_JobCreate
          
      )

【讨论】:

以上是关于使用编程导航 Vue.js 传递道具的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js:以编程方式实例化功能组件

如何将 BootstrapVue 中的道具传递给路由器链接

道具在 vue js 中发生变异

如何在 Vue.js 中将实例化的 Vue 组件作为道具传递?

如何使用 Vue.js 路由器将状态和事件处理程序作为道具传递给子组件?

将 axios 中的道具传递给 Vue.js?