Vue2父子组件通信方法总结

一、父组件触发子组件方法

  1. 使用 ref 引用

适用场景 :父组件需要直接调用子组件的方法

复制代码
<!-- 父组件 -->
<template>
  <child ref="childRef" />
  <button @click="callChildMethod">调用子组件方法</button>
</template>

<script>
export default {
  methods: {
    callChildMethod() {
      this.$refs.childRef.childMethod();
    }
  }
}
</script>

<!-- 子组件 -->
<script>
export default {
  methods: {
    childMethod() {
      console.log('子组件方法被调用');
    }
  }
}
</script>
  1. 使用自定义事件(通过 $refs 触发)

适用场景 :需要传递参数给子组件方法

复制代码
<!-- 父组件 -->
<script>
export default {
  methods: {
    callChildMethod() {
      this.$refs.childRef.$emit('custom-event', params);
    }
  }
}
</script>

<!-- 子组件 -->
<script>
export default {
  mounted() {
    this.$on('custom-event', (params) => {
      this.childMethod(params);
    });
  },
  methods: {
    childMethod(params) {
      console.log('子组件方法被调用,参数:', params);
    }
  }
}
</script>

二、子组件触发父组件方法

  1. 使用自定义事件($emit)

适用场景 :子组件向父组件传递事件

复制代码
<!-- 子组件 -->
<template>
  <button @click="triggerParentMethod">触发父组件方法</button>
</template>

<script>
export default {
  methods: {
    triggerParentMethod() {
      this.$emit('parent-event', data);
    }
  }
}
</script>

<!-- 父组件 -->
<template>
  <child @parent-event="handleParentEvent" />
</template>

<script>
export default {
  methods: {
    handleParentEvent(data) {
      console.log('父组件方法被调用,数据:', data);
    }
  }
}
</script>
  1. 使用回调函数(props)

适用场景 :父组件传递函数给子组件,子组件调用

复制代码
<!-- 父组件 -->
<template>
  <child :callback="parentMethod" />
</template>

<script>
export default {
  methods: {
    parentMethod(data) {
      console.log('父组件方法被调用,数据:', data);
    }
  }
}
</script>

<!-- 子组件 -->
<script>
export default {
  props: {
    callback: {
      type: Function,
      default: () => {}
    }
  },
  methods: {
    callParentMethod() {
      this.callback(data);
    }
  }
}
</script>

三、父组件给子组件传数据

  1. 使用 props

适用场景 :父组件向子组件传递静态或动态数据

复制代码
<!-- 父组件 -->
<template>
  <child :message="parentMessage" :count="parentCount" />
</template>

<script>
export default {
  data() {
    return {
      parentMessage: 'Hello',
      parentCount: 10
    }
  }
}
</script>

<!-- 子组件 -->
<script>
export default {
  props: {
    message: {
      type: String,
      default: ''
    },
    count: {
      type: Number,
      default: 0
    }
  },
  watch: {
    message(newVal) {
      console.log('收到新的消息:', newVal);
    }
  }
}
</script>
  1. 使用 provide/inject

适用场景 :深层组件嵌套时的跨层级数据传递

复制代码
<!-- 父组件 -->
<script>
export default {
  provide() {
    return {
      sharedData: this.parentData
    }
  },
  data() {
    return {
      parentData: '共享数据'
    }
  }
}
</script>

<!-- 子组件(或深层子组件) -->
<script>
export default {
  inject: ['sharedData'],
  mounted() {
    console.log('注入的数据:', this.sharedData);
  }
}
</script>

四、子组件给父组件传数据

  1. 使用自定义事件($emit)

适用场景 :子组件向父组件传递数据

复制代码
<!-- 子组件 -->
<script>
export default {
  methods: {
    sendDataToParent() {
      this.$emit('update-data', {
        value: this.childValue,
        message: '子组件数据'
      });
    }
  }
}
</script>

<!-- 父组件 -->
<template>
  <child @update-data="handleUpdate" />
</template>

<script>
export default {
  methods: {
    handleUpdate(data) {
      console.log('收到子组件数据:', data);
      this.parentData = data;
    }
  }
}
</script>
  1. 使用 v-model 双向绑定

适用场景 :需要实现父子组件数据双向绑定

复制代码
<!-- 父组件 -->
<template>
  <child v-model="parentValue" />
  <p>父组件值:{{ parentValue }}</p>
</template>

<script>
export default {
  data() {
    return {
      parentValue: '初始值'
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <input v-model="localValue" @input="updateValue" />
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      localValue: this.value
    }
  },
  watch: {
    value(newVal) {
      this.localValue = newVal;
    }
  },
  methods: {
    updateValue() {
      this.$emit('input', this.localValue);
    }
  }
}
</script>
相关推荐
candyTong6 小时前
一觉醒来,大模型就帮我排查完页面性能问题
前端·javascript·架构
玩嵌入式的菜鸡6 小时前
网页访问单片机设备---基于mqtt
前端·javascript·css
前端一小卒7 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
阿丰资源9 小时前
SpringBoot+Vue实战:打造企业级在线文档管理系统
vue.js·spring boot·后端
豹哥学前端11 小时前
用猜数字游戏,一口气掌握 JavaScript 核心知识点(附完整代码)
前端·javascript
忆往wu前11 小时前
从0到1一步步拆解搭建,梳理一个 Vue3 简易图书后台全开发流程
前端·javascript·vue.js
shao91851612 小时前
第3章(2)——使用Gradio JavaScript Client
javascript·node.js·cdn·gradio·job·events·playcode
光影少年12 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
Mr.mjw12 小时前
vue中封装一个环形进度条组件,根据外部盒子大小自适应变化
前端·javascript·vue.js
无心使然12 小时前
Openlayers调用ArcGis影像服务之一动态地图、地图切片(/exportImage)
前端·javascript·数据可视化