Vue2 使用 $ref 从子组件加载数据并放入父组件的数据

Posted

技术标签:

【中文标题】Vue2 使用 $ref 从子组件加载数据并放入父组件的数据【英文标题】:Vue2 use $ref to load data from child component and put into parent component's data 【发布时间】:2022-01-16 20:18:19 【问题描述】:

在 Vue2 中,我试图访问子组件的数据,然后在不触发事件的情况下放入父组件的数据。在下面的例子中,我想把 count:20 保存到父组件中,如果有错误请告诉我,谢谢!

子组件

<template>
  <div></div>
</template> 
<script>
export default 
  data() 
    return 
      count: 20,
    ;
  ,
;
</script>

父组件

<template>
  <div>
    <child ref="child1"></child>
    count
</div>
</template> 

<script> import child from './child.vue' 
export default  
  components: 
    child
  , 
  data() 
    return
      count:this.$refs.child1.count
    
  ,
 
</script>

VScode 中的警告信息

“Vue | 类型”上不存在属性“count”元素 | Vue[] |元素[]'。 类型“Vue”上不存在属性“count”。

浏览器中的警告消息

[Vue 警告]:data() 中的错误:“TypeError: undefined is not an object (evalating 'this.$refs.child1')”

【问题讨论】:

【参考方案1】:

首先,我建议按预期使用 Vue 框架。所以将数据从子节点传递给父节点应该使用$emit 或使用 vuex 存储进行集中状态管理。

这样一来,您将需要等到安装父组件才能设置 count 数据属性。

儿童

<template>
  <div></div>
</template> 
<script>
export default 
  data() 
    return 
      count: 20,
    ;
  ,
;
</script>

家长

<template>
  <div>
    <child ref="child1"></child>
     count 
  </div>
</template>

<script>
import Child from "./components/Child";

export default 
  components: 
    Child
  ,
  data() 
    return
      count: 0
    
  ,
  mounted () 
    this.count = this.$refs.child1.count
  
;
</script>

这会起作用,但它不会是被动的。这一切都可以大大简化,并通过以下更改做出反应:

儿童

<template>
  <div></div>
</template> 
<script>
export default 
  data() 
    return 
      count: 20,
    ;
  ,
  watch: 
    count (currentValue) 
      this.$emit('update', currentValue);
    
  ,
  beforeMount () 
    this.$emit('update', this.count)
  
;
</script>

家长

<template>
  <div>
    <child @update="count = $event"></child>
     count 
  </div>
</template>

<script>
import Child from "./components/Child";

export default 
  components: 
    Child
  ,
  data() 
    return
      count: 0
    
  
;
</script>

显示工作示例的快速链接:https://codesandbox.io/s/interesting-kalam-et0b3?file=/src/App.vue

【讨论】:

非常感谢,mounted () 有效!我听说过 emit 但我不确定它是否必须由事件触发。在这种情况下,我需要加载几个子组件并对它们的一个属性求和而不做任何事情,这就是我尝试使用 $ref 的原因。无论如何,感谢您的解决方案,您真的让我很开心!

以上是关于Vue2 使用 $ref 从子组件加载数据并放入父组件的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量的值从子组件发送到父组件?

如何在 nuxt.js 上从子组件获取父组件的值?

vue中ref的作用

vuejs 从子组件更新父数据

vuejs 从子组件更新父数据

将多个引用从子组件传递到父组件-Reactjs