ChatGPT解决这个技术问题 Extra ChatGPT

VueJS 从父组件访问子组件的数据

我正在使用 vue-cli scaffold for webpack

我的 Vue 组件结构/层次结构目前如下所示:

App PDF模板背景 动态模板图片 静态模板图片 Markdown

PDF模板背景 动态模板图片 静态模板图片 Markdown

背景

动态模板图像

静态模板图像

降价

在应用程序级别,我想要一个 vuejs 组件方法,它可以将所有子组件的数据聚合成一个可以发送到服务器的 JSON 对象。

有没有办法访问子组件的数据?具体来说,多层深度?

如果不是,那么传递可观察数据/参数的最佳做法是什么,以便当它被子组件修改时,我可以访问新值?我试图避免组件之间的硬依赖,因此到目前为止,使用组件属性传递的唯一内容是初始化值。

更新:

扎实的答案。在查看了两个答案后,我发现有用的资源:

Vuex 以及何时使用它

适用于小型应用程序的 Vuex 替代解决方案


P
PJ3

在我的子组件中,没有按钮可以发出更改的数据。这是一个有 5~10 个输入的表格。单击另一个组件中的处理按钮后,数据将被提交。所以,当它发生变化时,我不能发出每个属性。

所以,我所做的,

在我的父组件中,我可以从“ref”访问孩子的数据

例如

<markdown ref="markdowndetails"></markdown>
<app-button @submit="process"></app-button>

// js
methods:{
    process: function(){
        // items is defined object inside data()
        var markdowns = this.$refs.markdowndetails.items 
    }
}

注意:如果你在整个应用程序中都这样做,我建议改为使用 vuex。


我在哪里可以找到这方面的文档?
对我来说效果很好-谢谢@PJ3
将数据从子级传递给父级是一种简单的方法,而发射则更为复杂。谢谢
@BesLey 我认为他们有不同的用例。如果组件被设计为另一个特定组件的子组件,那么直接访问其内部数据可能是正确的选择,例如面向对象编程中的 getter/setter。但是如果要在不同的地方使用组件,那么事件方法是更合适的方法。
B
Belmin Bedak

对于这种结构,有某种Store就好了。

VueJS 对此提供了解决方案,它被称为 Vuex。如果你还没有准备好使用 Vuex,你可以创建自己的简单商店。

让我们试试这个

MarkdownStore.js

export default {

 data: {
   items: []
 },

 // Methods that you need, for e.g fetching data from server etc.

 fetchData() {
   // fetch logic
 }

}

现在您可以在任何地方使用这些数据,只需导入此 Store 文件

主视图.vue

import MarkdownStore from '../stores/MarkdownStore'

export default {

 data() {
   sharedItems: MarkdownStore.data
 },

 created() {
   MarkdownStore.fetchData()
 }

}

如果您不想使用 Vuex,那么这就是您可以使用的基本流程。


Documentation 也很好地解释了它。
如果我想在 MarkdownStore 中移动 fetchData() 逻辑怎么办。将所有组件逻辑放在组件内是有意义的。
这个解决方案几乎对我有用。我可以访问 fetchData() 方法,但该方法无法访问 MarkdownStore 视图中的数据。 this.data.items 或 this.$data.items 不起作用
@YeeHaw1234 您应该通过 this.items 从您的组件访问它。
@Toast我真的相信文档可以(必须)更多地说明此事。
C
CodinCat

传递可观察数据/参数的最佳做法是什么,以便当它被子组件修改时,我可以访问新值?

道具的流动是一种方式,孩子不应该直接修改它的道具。

对于复杂的应用程序,vuex 是解决方案,但对于简单的情况,vuex 是大材小用。就像@Belmin 所说的那样,您甚至可以为此使用纯 JavaScript 对象,这要归功于反应性系统。

另一种解决方案是使用事件。 Vue 已经实现了 EventEmitter 接口,子节点可以使用 this.$emit('eventName', data) 与其父节点通信。

父级将像这样监听事件:(@updatev-on:update 的简写)

<child :value="value" @update="onChildUpdate" />

并更新事件处理程序中的数据:

methods: {
  onChildUpdate (newValue) {
    this.value = newValue
  }
}

以下是 Vue 中自定义事件的简单示例:
http://codepen.io/CodinCat/pen/ZBELjm?editors=1010

这只是父子通信,如果一个组件需要与其兄弟通信,那么你将需要一个全局事件总线,在 Vue.js 中,你可以只使用一个空的 Vue 实例:

const bus = new Vue()

// In component A
bus.$on('somethingUpdated', data => { ... })

// In component B
bus.$emit('somethingUpdated', newData)

M
Mohamed Adel

您可以将 ref 引用到子组件并将其用作 this.$refs.refComponentName.$data

父组件

<template>
   <section>
      <childComponent ref="nameOfRef" />
   </section>
</template>

 methods: {
  save() {
   let Data = this.$refs.nameOfRef.$data;
 }
},

l
louis_coetzee

就我而言,我有一个注册表单,我已将其分解为多个组件。

如上所述,我使用了 $refs,例如,在我的父母中:

在模板中:

<Personal ref="personal" />

脚本 - 父组件

export default {
  components: {
    Personal,
    Employment
  },
  data() {
    return {
        personal: null,
        education: null
    }
  },
  mounted: function(){
       this.personal = this.$refs.personal.model
       this.education = this.$refs.education.model
  }
}

这很有效,因为数据是反应性的。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅