Vue如何将子组件和父组件数据传递给方法

Posted

技术标签:

【中文标题】Vue如何将子组件和父组件数据传递给方法【英文标题】:Vue how to pass child and parent component data to method 【发布时间】:2019-04-27 21:06:13 【问题描述】:

我使用v-for 语法制作表单。当我只写方法名称时,我成功地从子组件获取百分比数据。

父组件

<div v-for="(item, idx) in recipients"
     :key="idx">
  <range-input @sendValue="getPercentFromChild">
  </range-input>
</div>

...

getPercentFromChild(percent) 
    console.log(percent); // 50
  ,

子组件

<div>
  <input type="range"
         value="0"
         @change="sendValue">
</div>

...

export default 
  ...
  methods: 
    sendValue() 
      this.$emit('sendValue', 50);
    ,
  

那么,如何将子数据(百分比)和父数据(indx)传递给方法?

像这样,父组件

<div v-for="(item, idx) in recipients"
     :key="idx">
  <range-input :currentPercent="0"
               @sendValue="getPercentFromChild(idx, percent)">
  </range-input>
</div>

...

getPercentFromChild(idx, percent) 
   console.log(idx, percent); // 0, undefined
,

【问题讨论】:

【参考方案1】:

您可以使用$event 参数捕获发出的值,同时为sendValue 事件调用回调。

父组件:

<div v-for="(item, idx) in recipients"
     :key="idx">
  <range-input :currentPercent="0"
               @sendValue="getPercentFromChild(idx, $event)">
  </range-input>
</div>

...

getPercentFromChild(idx, percent) 
   console.log(idx, percent); // 0, 50
,

这是一个演示fiddle

【讨论】:

【参考方案2】:

你可以做的是使用两次发射,但传入不同的参数。可能听起来很奇怪,但它确实有效。试试这个:

 <div v-for="(item, idx) in recipients"
     :key="idx">
  <range-input @sendValue="getPercentFromChild" v-on:sendValue="getIndex(idx)">
  </range-input>
</div>

那么您可以有两种方法并使用它们来设置您在第三种方法中使用的数据元素:

data: () => (
        index: 0,
        percentFromChild: 0,
    ),
methods: 
    getPercentFromChild(percent) 
      this.percentFromChild = percent
    ,
    getIndex(i) 
      this.index = i
      this.thirdFunction(this.percentFromChild, this.index)
    ,
    thirdFunction(a, b) 
      //do stuff
    

【讨论】:

以上是关于Vue如何将子组件和父组件数据传递给方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ts将数据传递给vue3中的多深度子组件

Vue:将数据传递给动态组件

将默认数据传递给 Vue 表单组件

如何将数据传递给嵌套的子组件vue js?

如何将数据传递给 vue.js 中的子组件

将数据传递给组件 Vue.js