【问题标题】:Getting data from independent child component to other components with router使用路由器从独立子组件获取数据到其他组件
【发布时间】:2018-10-25 06:27:32
【问题描述】:

我对 Vue 还很陌生,这就是为什么我不能忽视我做错了什么的感觉。

我在视图组件中有一个独立的组件,它必须向其他组件发出数据。

该项目包含以下组件:AppNavbarHomeStatisticsTableSearch

Search 组件在Home 组件内部使用。它包含一个<input> 让用户输入他的帐户名称。

Table 组件在Statistics 组件内部使用。它显示了一个基于来自Search 组件的输入的表格。

+-- App
|   +-- Navbar
|   +-- Home
|   +-- ---- Search
|   +-- Statistics
|   +-- ---- Table

我的主要App.vue 包含router-view

<template>
<div id="app">

  <Navbar></Navbar>

  <div class="container">
    <router-view></router-view>
  </div>

</div>
</template>

其中两个是主视图组件,有固定的路由:Home & Statistics。 路线(router.js)如下:

export default new Router({
  routes: [{
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/statistics',
      name: 'statistics',
      component: Statistics
    }
  ]
})

Navbar 组件包含 router-links 到视图组件:

<template>
  <div id="navbar">
    <nav>
      <ul>
        <li class="active"><router-link to="/">Home</router-link></li>
        <li><router-link to="/statistics">Statistics</router-link></li>
      </ul>
    </nav>
  </div>
</template>

现在:将数据从独立子组件Search 获取到我的另一个独立子组件Table 的正确方法是什么?

逻辑方法是Search-> Home -> App -> Statistics -> Table

我已经尝试使用带有$emit$on 的事件总线,但数据似乎无法通过中间的路由器相互连接。

现在,我的 main.js 中有一个 const 来存储这个全局用户数据:

export const store = new Vue({
  data: {
    username: ''
  }
})

我在需要它的任何地方都导入它,但我非常怀疑这是不是正确的方法。

我也考虑过为我的Table 组件使用道具,但我需要将我的数据从App 传递到StatisticsTable,这可行,但感觉就像很多样板。另外:无论如何,我需要先将用户名设为App,然后才能这样做,这是我不知道该怎么做的。

提前致谢。

【问题讨论】:

  • 嘿,你能创建一个minimal reproducible example,例如与plnkr.cojsfiddle.net 等?
  • 嘿,我看到你在这里有一个接受的答案......你还需要the cross-posted question on CR吗?
  • @AndrewElliott 在此处发布答案之前,我在 CR 上创建了问题。为什么要问?
  • 只是好奇接受答案是否也回答了关于 CR 的问题...如果没有,您能否在该帖子中添加更多详细信息,例如提到的所有组件的标记和 VueJS?

标签: javascript vue.js vuejs2 vue-component vue-router


【解决方案1】:

按照您的方式使用全局存储是可以的,文档甚至有关于如何使用的指南:https://vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch

如果您想要一种更结构化的方式,请查看同样由 Vue 团队编写的 Vuex:https://vuex.vuejs.org/

Vuex 很好地集成到了 Vue 开发工具中,并回避了您所描述的导入/传递问题(因为它是通过 Vue.use 注入的插件,所以每个 Vue 都可以使用 $store

【讨论】:

  • 感谢您的回答。恐怕 vuex 会添加更多样板,我认为会有一种更简单的方法在独立组件之间共享全局数据。
  • @BennettDams 如果不使用 Vuex,那么我会将商店导出为自己的模块。这样,其他模块不会从 App 导入它,它们只是导入独立的 Store 模块。那时它基本上是一个单例模式
  • 说到“模块”,是指Vue组件还是Vuex模块?
  • @BennettDams Vue 组件(作为 JS 模块)。我会在根目录下创建一个Store(与应用程序同行)。这样下游的任何组件都可以import Store from '@/store'
猜你喜欢
  • 2016-04-29
  • 2022-08-18
  • 2018-11-14
  • 2016-08-28
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2020-03-31
相关资源
最近更新 更多