【问题标题】:Share data between two child components Vue js在两个子组件Vue js之间共享数据
【发布时间】:2020-09-24 12:46:35
【问题描述】:

我正在尝试将一些数据从一个子组件发送和渲染到另一个子组件,并且两个组件都使用一个主组件进行渲染,我如何在两个子组件之间传递数据(在我的 vue 应用程序中)?

exg

I have two child components A & B , "B" has click add to cart click event and have data of cart items , & i have template for cart item in component "A"

【问题讨论】:

  • 最快的方法是使用两个组件都需要的服务(实例类)。如果您有一个大型应用程序,请使用 vuex。我不建议您使用事件总线,因为如果您重新加载事件构造组件,它将调用该事件两次或更多次。
  • 你能根据这个分享一些教程吗?

标签: vue.js vue-component


【解决方案1】:

在这种情况下,由于两个组件共享同一个父组件,因此通常会将您需要的任何共享状态移动到父组件中并作为道具传递给子组件。

如果组件不共享直接父级,您可以使用事件总线(对于非常小的应用程序)或 Vuex。 Vuex 允许您在应用程序中的组件之间共享状态,而无需通过多个级别向下传递道具。

【讨论】:

  • 另一个值得注意的选项是provide & inject
  • Provide/inject 不建议在一般应用程序代码中使用(参见note in the API docs)。由于这些是更高级的功能,您还可能会降低其他开发人员的代码可理解性。
  • 我有两个子组件 A 和 B,“B”有点击添加到购物车点击事件并有购物车项目的数据,并且我在组件“A”中有购物车项目的模板
  • 考虑到您的应用程序的复杂性,我个人会为此使用 Vuex。购物车之类的功能是您想要显示和更新整个应用程序中多个组件的购物车数据的主要示例。
【解决方案2】:

有很多方法可以实现这一点。我正在解释全球偶数巴士概念。下面是一个例子。在这里,孩子 A 和孩子 B 正在通过事件总线进行通信

const eventBus = new Vue ()

Vue.component('ChildB',{
  template:`
    <div id="child-b">
      <h2>Child B</h2>
      <pre>data {{ this.$data }}</pre>
      <hr/>
    </div>`, 
  data() {
    return {
      score: 0
    }
  },
  created () {
    eventBus.$on('updatingScore', this.updateScore)  // 3.Listening
  },
  methods: {
    reRender() {
      this.$forceUpdate()
    },
    updateScore(newValue) {
      this.score = newValue
    }
  }
})

Vue.component('ChildA',{
  template:`
    <div id="child-a">
      <h2>Child A</h2>
      <pre>data {{ this.$data }}</pre>
      <hr/>
      <button @click="changeScore">Change Score</button>
      <span>Score: {{ score }}</span>
    </div>`,
  props: ["score"],
  methods: {
    changeScore() {
    this.score +=200;
      eventBus.$emit('updatingScore', this.score+ 200)
    }
  }
})

Vue.component('ParentA',{
  template:`
    <div id="parent-a">
      <h2>Parent A</h2>
      <pre>data {{ this.$data }}</pre> 
      <hr/>
      <child-a :score="score"/>
      <child-b/>
    </div>`,
  data() {
    return {
      score: 100
    }
  } 
})


Vue.component('GrandParent',{
  template:`
    <div id="grandparent">
      <h2>Grand Parent</h2>
      <pre>data {{ this.$data }}</pre>
      <hr/>
      <parent-a/>
    </div>`,
})

new Vue ({
	el: '#app',
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <grand-parent/>
</div>

【讨论】:

  • [Vue 警告]:创建钩子时出错:出现“ReferenceError: eventBus is not defined”
  • 您是否创建了事件总线?像这样 const eventBus = new Vue ()
  • 是的,创建了,但仍然没有将子组件 A 上的数据更新到 B
  • 我有两个子组件 A 和 B,“B”有点击添加到购物车点击事件并有购物车项目的数据,并且我在组件“A”中有购物车项目的模板
  • 正是我举了一个例子。在上面的例子中运行代码 sn -p。我正在通过按钮单击并在孩子 B 中接收来更新孩子 A 的分数。
【解决方案3】:

理想情况下,您应该使用 Vuex 作为状态管理模式。 但是如果你的应用很简单,不需要经常做这些操作,你可以将emitpayload中的数据从child传给parent,然后父组件再通过props传递给另一个child

【讨论】:

  • Actuallt 我有两个子组件 A 和 B,“B”有点击添加到购物车点击事件并有购物车项目的数据,并且我在组件“A”中有购物车项目的模板
  • 好的,我看过了。你有什么问题?
  • 我有类似的代码 - 在添加到购物车时,购物车项目存储在组件“A”中的变量中,购物车模板位于组件“B”中,我想从“ A”到“B”
  • 好的,eventBus 有什么问题?你的实际问题是什么?
猜你喜欢
  • 2018-05-15
  • 2020-02-24
  • 2021-10-12
  • 2021-10-30
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多