当前位置: 首页 > article >正文

vue.js 组件通信

在Vue.js中,组件通信是非常重要的主题。组件通信是指不同组件之间相互传递数据、触发事件和调用方法,以实现协同工作。

Vue.js提供了多种方式来实现组件通信,包括props和$emit、自定义事件、Vuex和事件总线。

首先,我们来看props和$emit的方式。props和$emit是Vue.js中父子组件之间进行通信的常用方式。

  1. props和$emit:
    • 父组件通过props向子组件传递数据
    • 子组件通过$emit触发父组件的事件

父组件中的代码:

<template>
  <div>
    <child-component :message="message" @update-message="updateMessage"></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: 'Hello from parent'
    }
  },
  methods: {
    updateMessage(newMessage) {
      this.message = newMessage;
    }
  }
}
</script>

子组件中的代码:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
export default {
  props: ['message'],
  methods: {
    changeMessage() {
      this.$emit('update-message', 'Hello from child');
    }
  }
}
</script>

在父组件中,通过props将message传递给子组件。子组件通过$emit触发父组件的update-message事件,并传递新的消息。

  1. 自定义事件

Vue.js还提供了自定义事件的方式来实现组件通信。自定义事件可以在任何组件之间进行通信。

在子组件中,使用$on方法监听事件,并在适当的时候使用$emit方法触发事件。

在父组件中,使用$emit方法触发子组件的事件。

代码示例:

父组件中的代码:

<template>
  <div>
    <p>{{ message }}</p>
    <child-component></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    this.$on('update-message', (newMessage) => {
      this.message = newMessage;
    });
  }
}
</script>

子组件中的代码:

<template>
  <div>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    changeMessage() {
      this.$emit('update-message', 'Hello from child');
    }
  }
}
</script>

在父组件中,使用$on方法监听子组件触发的事件,并在回调函数中更新message。

在子组件中,使用$emit方法触发父组件的update-message事件,并传递新的消息。

  1. Vuex

Vuex是Vue.js的状态管理模式。它允许在不同的组件之间共享状态,并提供了一种管理和更新状态的机制。

使用Vuex进行组件通信的优点是可以在任何组件中访问和更新共享的状态,而不需要通过props和$emit传递数据。

首先,需要安装Vuex并创建一个store对象。

npm install vuex

创建store.js文件:

import Vuex from 'vuex';

const store = new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    updateMessage(state, newMessage) {
      state.message = newMessage;
    }
  }
});

export default store;

然后,在根组件中引入store并使用Vuex提供的mapState和mapMutations辅助函数,以获取和更新共享的状态。

<template>
  <div>
    <p>{{ message }}</p>
    <child-component></child-component>
  </div>
</template>

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

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

在子组件中,使用this.$store.commit方法来调用mutation,更新共享的状态。

<template>
  <div>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    changeMessage() {
      this.$store.commit('updateMessage', 'Hello from child');
    }
  }
}
</script>

通过上述代码,我们实现了父子组件之间的通信。

  1. 事件总线

事件总线是一个Vue实例,它可以用来在任何组件之间发布和订阅事件。

首先,在main.js文件中创建一个空的Vue实例,并将其作为Vue原型属性。

import Vue from 'vue';

export const bus = new Vue();

然后,在需要通信的组件中,使用$emit方法发布事件,并在其他组件中使用bus.$on方法订阅事件。

父组件中的代码:

<template>
  <div>
    <p>{{ message }}</p>
    <child-component></child-component>
  </div>
</template>

<script>
import { bus } from './main';

export default {
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    bus.$on('update-message', (newMessage) => {
      this.message = newMessage;
    });
  }
}
</script>

子组件中的代码:

<template>
  <div>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
import { bus } from './main';

export default {
  methods: {
    changeMessage() {
      bus.$emit('update-message', 'Hello from child');
    }
  }
}
</script>

通过上述代码,我们实现了父子组件之间的通信。


http://www.kler.cn/a/460662.html

相关文章:

  • 实现单例模式的五种方式
  • 分布式微服务项目___某污水处理项目
  • TVS二极管选型【EMC】
  • 【MySQL关于数据库和表结构的增删查改】
  • 开源架构的容器化部署优化版
  • HTML——57. type和name属性
  • HTML5实现喜庆的新年快乐网页源码
  • LiteFlow 流程引擎引入Spring boot项目集成pg数据库
  • 初始JavaEE篇 —— Maven相关配置
  • (echarts)ECharts折线图堆叠设置为不堆叠的方法
  • 华为消费级QLC SSD来了
  • TCP粘/拆包----自定义消息协议
  • Python 的 abc 模块 抽象基类(Abstract Base Classes)
  • 建造者模式详解
  • Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
  • 04、JUC并发编程之:简单概述(四)
  • pg_wal 目录下 wal 日志文件异常累积过大
  • 慧眼识词:解析TF-IDF工作原理
  • python爬虫--小白篇【selenium自动爬取文件】
  • 微信小程序自定义表格样式
  • 2024年度总结
  • 前端多个项目部署在同一个nginx下,前缀不同,配置编写方式
  • 红黑树的左旋右旋
  • MySQL 执行计划:优化查询性能
  • 家政预约小程序04活动管理表结构设计
  • Mac安装Jupyter和nbextensions报错问题