返回

Vue.js组件通信:父传子,子传父,兄弟组件通信

前端

父传子(父通过import + component写入子组件,然后v-bind绑定数据,子通过props接收)

父传子是父组件将数据传递给子组件的常见场景。在父组件中,我们可以通过import + component的方式引入子组件,然后通过v-bind绑定数据,子组件通过props接收。

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

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

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

<script>
export default {
  props: ['message'],
  data() {
    return {};
  }
};
</script>

在上面的例子中,父组件通过v-bind将message数据绑定到子组件的props,子组件通过props接收并显示message数据。

子传父(子通过$emit触发自定义事件,父通过v-on监听该事件)

子传父是子组件将数据或事件传递给父组件的场景。在子组件中,我们可以通过$emit触发自定义事件,父组件通过v-on监听该事件。

<!-- 子组件 -->
<template>
  <div>
    <button @click="emitMessage">Send message to parent</button>
  </div>
</template>

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

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

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log('Received message from child component:', message);
    }
  }
};
</script>

在上面的例子中,子组件通过$emit触发message自定义事件,并传递数据,父组件通过v-on监听message事件,并执行handleMessage方法处理数据。

兄弟组件通信(通过EventBus或者Vuex来实现)

兄弟组件通信是指不通过父组件,兄弟组件之间直接通信的场景。我们可以通过EventBus或Vuex来实现兄弟组件通信。

EventBus是一种全局事件总线,兄弟组件可以通过EventBus触发和监听事件来进行通信。

// EventBus.js
export default {
  on(event, callback) {
    this._events[event] = this._events[event] || [];
    this._events[event].push(callback);
  },
  emit(event, ...args) {
    if (this._events[event]) {
      this._events[event].forEach(callback => callback.apply(this, args));
    }
  }
};
<!-- 兄弟组件A -->
<template>
  <div>
    <button @click="emitMessage">Send message to brother component</button>
  </div>
</template>

<script>
import EventBus from './EventBus.js';

export default {
  methods: {
    emitMessage() {
      EventBus.$emit('message', 'Hello, world!');
    }
  }
};
</script>
<!-- 兄弟组件B -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import EventBus from './EventBus.js';

export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    EventBus.$on('message', message => {
      this.message = message;
    });
  }
};
</script>

在上面的例子中,兄弟组件A通过EventBus触发message事件,兄弟组件B通过EventBus监听message事件,并更新message数据。

Vuex是一种状态管理工具,我们可以通过Vuex来实现兄弟组件通信。

// store.js
export default new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, message) {
      state.message = message;
    }
  }
});
<!-- 兄弟组件A -->
<template>
  <div>
    <button @click="setMessage">Send message to brother component</button>
  </div>
</template>

<script>
import { mapMutations } from 'vuex';

export default {
  methods: {
    ...mapMutations([
      'setMessage'
    ]),
    setMessage() {
      this.setMessage('Hello, world!');
    }
  }
};
</script>
<!-- 兄弟组件B -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import { mapState } from 'vuex';

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

在上面的例子中,兄弟组件A通过Vuex的setMessage mutation来修改message状态,兄弟组件B通过Vuex的message状态来显示message数据。

总结

以上是Vue.js中三种常见的组件通信方式,包括父传子、子传父、兄弟组件通信。父传子通过v-bind和props实现,子传父通过$emit和v-on实现,兄弟组件通信可以通过EventBus或Vuex实现。不同的场景可以使用不同的组件通信方式,以满足不同的需求。