【问题标题】:How to pass data from parent to child component without using props如何在不使用道具的情况下将数据从父组件传递到子组件
【发布时间】:2019-02-06 00:16:24
【问题描述】:

我想编写一个可重用的 Vue 选项卡组件(我知道那里有很多,但我这样做是为了挑战)。

我现在面临的问题是在不使用道具的情况下将数据传递给孩子。

原因很简单,我需要子标签元素知道当前选择的标签索引,我不希望使用我的组件的用户总是需要为每个标签组件输入道具。

出于这个原因,我去观察其他 Vue 选项卡库是如何解决这个问题的(bootstrap vuevue tabs 等),但我发现它们使用 this.$parent 或 @987654324 访问父属性@ 访问子属性。而且我知道这不是 Vue 的方式。

我研究了注入和提供,它很棒,但它不是被动的。

我也不想使用 Vuex,因为我的项目太小了,我希望我的组件可以重用。

有更好的方法吗?

【问题讨论】:

  • 你想传递什么信息给你的组件。我看不出有任何理由拒绝道具。因为如果用户不必输入 props,他们必须输入其他内容才能使您的组件以其他方式工作。
  • 如果你不想使用this.$parentthis.$child,你不能使用vuex,因为你正在构建一个组件并且宁愿不使用props,我能看到的唯一解决方案就是去对于localStoragecookies,尽管我认为您应该使用$child/$parent,因为您正在构建一个独立组件
  • @Ant 我想使用$child/parent,但我想我在文档中读到了一些不建议这样做的地方。
  • @LukasChen 建议可能不是,但这一切都与您的项目规模有关。如果您打算将它用作不同项目的即插即用组件,那么我看不出有任何其他方式来构建它并拥有所需的“沙盒”

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


【解决方案1】:

一个简单的解决方案是在不使用 Vuex 的情况下创建自己的商店:

class TabStore {
  constructor() {
    this.state = {
      currentIndex: 1
    }
  }
  setIndex(value) {
    this.state.currentIndex = value
  }
}
let tabStore = new TabStore()

Vue.component('tab-item', {
  template: '#tab',
  data() {
    return { state: tabStore.state }
  }
})

new Vue({
  el: "#app",
  data() {
    return { state: tabStore.state }
  },
  methods: {
    changeIndex() {
      let index = Math.floor((Math.random() * 10) + 1) //<-- for the example
      tabStore.setIndex(index)
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<div id="app">
  <p>Current Index from Main component: <strong>{{ state.currentIndex }}</strong></p>
  <tab-item></tab-item>
  <button @click="changeIndex">Change current index</button>
</div>

<template id="tab">
 <p>Current Index from Tab component: <strong>{{ state.currentIndex }}</strong></p>
</template>

您可以使用商店中的setIndex() 更改state.currentIndex,并且您可以在任何地方访问这个。

【讨论】:

  • 组件是否可以重复使用,每组标签父子标签都有唯一的索引?
【解决方案2】:

我相信你可能会对学习 Vuex 感兴趣。
简单来说,Vuex 充当 Vue 应用程序中数据的“单一事实来源”。
这意味着存储在 vuex 'store' 中的任何数据都可以被应用程序中的任何组件访问。如果您将组件设置为正确导入您的 vuex 存储,它还提供对引用该存储的任何其他组件的反应式绑定,这意味着您不再担心通过多个组件进行复杂的属性传递。相反,每个组件都引用根存储数据。 (希望这是有道理的。)

这是一个非常高级的概述,但如果它听起来对你的项目有帮助,你真的应该看看Official Documentation,这很棒!

【讨论】:

  • 对不起,我没有在我的问题中说明,但我的项目对于 vuex 来说太小了,我希望我的组件可以在同一页面上重复使用
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2021-12-28
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多