当前位置:首页 > VUE

vue父子实现

2026-02-18 10:04:36VUE

Vue 父子组件通信实现

Vue 中父子组件通信主要通过 props 和 events 实现。父组件通过 props 向子组件传递数据,子组件通过 events 向父组件发送消息。

父组件向子组件传递数据

父组件通过 props 向子组件传递数据。子组件需要在 props 选项中声明接收的属性。

<!-- 父组件 -->
<template>
  <child-component :message="parentMessage"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
}
</script>

子组件向父组件传递数据

子组件通过 $emit 触发事件向父组件传递数据。父组件通过 v-on 监听子组件触发的事件。

<!-- 子组件 -->
<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Hello from child')
    }
  }
}
</script>
<!-- 父组件 -->
<template>
  <child-component @message-sent="handleMessage"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message) // 输出: Hello from child
    }
  }
}
</script>

使用 v-model 实现双向绑定

v-model 是 Vue 提供的语法糖,用于在组件上实现双向绑定。子组件需要接收 value prop 并触发 input 事件。

vue父子实现

<!-- 父组件 -->
<template>
  <child-component v-model="message"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <input :value="value" @input="$emit('input', $event.target.value)">
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      required: true
    }
  }
}
</script>

使用 .sync 修饰符

.sync 修饰符是另一种实现父子组件双向绑定的方式。子组件需要触发 update:propName 事件。

<!-- 父组件 -->
<template>
  <child-component :message.sync="parentMessage"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: ''
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <input :value="message" @input="$emit('update:message', $event.target.value)">
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
}
</script>

使用 $refs 访问子组件

父组件可以通过 $refs 直接访问子组件的属性和方法。

vue父子实现

<!-- 父组件 -->
<template>
  <child-component ref="child"></child-component>
  <button @click="callChildMethod">Call Child Method</button>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    callChildMethod() {
      this.$refs.child.childMethod()
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div>Child Component</div>
</template>

<script>
export default {
  methods: {
    childMethod() {
      console.log('Child method called')
    }
  }
}
</script>

使用 provide/inject

provide/inject 允许祖先组件向所有子孙组件注入依赖,适用于深层嵌套组件通信。

<!-- 祖先组件 -->
<template>
  <child-component></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  provide() {
    return {
      ancestorMessage: 'Message from ancestor'
    }
  }
}
</script>
<!-- 子孙组件 -->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  inject: ['ancestorMessage'],
  data() {
    return {
      message: this.ancestorMessage
    }
  }
}
</script>

使用事件总线

对于非父子关系的组件通信,可以使用事件总线(Event Bus)模式。

// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()
<!-- 发送事件的组件 -->
<script>
import { EventBus } from './event-bus.js'

export default {
  methods: {
    sendMessage() {
      EventBus.$emit('message-sent', 'Hello from component')
    }
  }
}
</script>
<!-- 接收事件的组件 -->
<script>
import { EventBus } from './event-bus.js'

export default {
  created() {
    EventBus.$on('message-sent', message => {
      console.log(message)
    })
  }
}
</script>

使用 Vuex 状态管理

对于复杂应用,建议使用 Vuex 进行状态管理,实现组件间的数据共享。

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, message) {
      state.message = message
    }
  },
  actions: {
    updateMessage({ commit }, message) {
      commit('setMessage', message)
    }
  }
})
<!-- 组件A -->
<template>
  <button @click="updateMessage">Update Message</button>
</template>

<script>
import { mapActions } from 'vuex'

export default {
  methods: {
    ...mapActions(['updateMessage'])
  }
}
</script>
<!-- 组件B -->
<template>
  <div>{{ message }}</div>
</template>

<script>
import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState(['message'])
  }
}
</script>

标签: 父子vue
分享给朋友:

相关文章

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直…

vue实现弹窗可切换

vue实现弹窗可切换

实现弹窗可切换的 Vue 方案 动态组件切换 通过 Vue 的 <component :is="currentComponent"> 动态加载不同弹窗组件,结合 v-if 控制显示状态。…

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式:…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery…

vue computed 实现

vue computed 实现

computed 的基本用法 在 Vue 中,computed 用于声明计算属性,这些属性基于响应式依赖进行缓存。只有当依赖发生变化时,计算属性才会重新计算。 new Vue({ data: {…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件…