首页 > 其他分享 >Vue.js 组件通信

Vue.js 组件通信

时间:2023-06-17 11:31:27浏览次数:39  
标签:Vue js export props 组件 message

学习目录:

  1. Vue.js 简介
  2. Vue.js 实例与数据绑定
  3. Vue.js 计算属性和侦听器
  4. Vue.js 条件渲染和列表渲染
  5. Vue.js 事件处理
  6. Vue.js 表单输入绑定
  7. Vue.js 组件基础
  8. Vue.js 组件通信
  9. Vue.js 插槽
  10. Vue.js 动态组件和异步组件
  11. Vue.js 自定义指令
  12. Vue.js 过渡和动画
  13. Vue.js 混入
  14. Vue.js 自定义事件和 v-model
  15. Vue.js 渲染函数和 JSX
  16. Vue.js 插件
  17. Vue.js 单文件组件
  18. Vue.js Webpack 配置和打包优化
  19. Vue.js Vue Router
  20. Vue.js Vuex
  21. Vue.js 服务端渲染
  22. Vue.js 代码测试和调试
  23. Vue.js 生态系统
  24. Vue.js 最佳实践和性能优化
  25. Vue.js 应用部署和上线


在 Vue.js 中,每个组件都可以被看作是一个独立的模块,这些模块可以通过不同的方式进行通信。在本文中,我们将介绍 Vue.js 中的组件通信,并讨论一些常见的技术和最佳实践。

父子组件通信

在 Vue.js 中,父子组件之间的通信是最常见的一种情况。我们可以通过 props 和 events 两种方式来实现父子组件之间的通信。

Props

Props 是父组件向子组件传递数据的一种方式。父组件可以在子组件的标签上使用 v-bind 指令将数据传递给子组件。子组件则可以在自己的 props 中声明这些数据,并在组件内部使用。

例如,我们有一个父组件 Parent 和一个子组件 Child,我们可以像下面这样在 Parent 组件中传递数据给 Child 组件:

<template>
  <div>
    <child-component :message="parentMessage"></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  }
}
</script>

在 Child 组件中,我们可以在 props 中声明 message,并在组件内部使用这个数据:

<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
export default {
  props: {
    message: String
  }
}
</script>

Events

Events 是子组件向父组件发送消息的一种方式。子组件可以通过 $emit 方法触发一个自定义事件,并传递数据给父组件。父组件可以在子组件的标签上使用 v-on 指令监听这个事件,并在自己的方法中处理数据。

例如,我们有一个父组件 Parent 和一个子组件 Child,我们可以像下面这样在 Child 组件中触发一个自定义事件:

<template>
  <div>
    <button @click="sendMessage">Send message to parent</button>
  </div>
</template>

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

在 Parent 组件中,我们可以在子组件的标签上使用 v-on 指令监听这个事件,并在自己的方法中处理数据:

<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(message) // 输出 "Hello from child"
    }
  }
}
</script>

兄弟组件通信

在 Vue.js 中,兄弟组件之间的通信需要通过一个共同的父组件来实现。我们可以把数据和事件都放在共同的父组件中,然后通过 props 和 events 分别传递给不同的子组件。

例如,我们有一个父组件 Parent、一个兄弟组件 Brother 和一个 Sister,我们可以像下面这样在 Parent 组件中定义数据和方法,并使用 props 和 events 分别传递给 Brother 和 Sister 组件:

<template>
  <div>
    <brother-component :message="parentMessage" @update="handleUpdate"></brother-component>
    <sister-component :message="parentMessage"></sister-component>
  </div>
</template>

<script>
import BrotherComponent from './BrotherComponent.vue'
import SisterComponent from './SisterComponent.vue'

export default {
  components: {
    BrotherComponent,
    SisterComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  },
  methods: {
   handleUpdate(message) {
      this.parentMessage = message
    }
  }
}
</script>

在 Brother 组件中,我们可以在 props 中声明 message,并在组件内部使用这个数据。同时,我们可以在组件中定义一个方法,通过 $emit 方法触发一个自定义事件,并传递数据给父组件:

<template>
  <div>
    {{ message }}
    <button @click="sendMessage">Send message to parent</button>
  </div>
</template>

<script>
export default {
  props: {
    message: String
  },
  methods: {
    sendMessage() {
      this.$emit('update', 'Hello from brother')
    }
  }
}
</script>

在 Sister 组件中,我们也可以在 props 中声明 message,并在组件内部使用这个数据:

<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
export default {
  props: {
    message: String
  }
}
</script>

跨级组件通信

在 Vue.js 中,跨级组件之间的通信需要通过一个中间组件来实现。我们可以把数据和事件都放在中间组件中,然后通过 props 和 events 分别传递给不同的子组件。

例如,我们有一个父组件 Grandparent、一个子组件 Child 和一个孙子组件 Grandchild,我们可以像下面这样在 Grandparent 组件中定义数据和方法,并使用 props 和 events 分别传递给 Child 和 Grandchild 组件:

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

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from grandparent'
    }
  },
  methods: {
    handleUpdate(message) {
      this.parentMessage = message
    }
  }
}
</script>

在 Child 组件中,我们可以在 props 中声明 message,并在组件内部使用这个数据。同时,我们可以在组件中定义一个方法,通过 $emit 方法触发一个自定义事件,将数据传递给 Grandparent 组件:

<template>
  <div>
    {{ message }}
    <grandchild-component :message="message" @update="sendMessage"></grandchild-component>
  </div>
</template>

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

export default {
  components: {
    GrandchildComponent
  },
  props: {
    message: String
  },
  methods: {
    sendMessage(message) {
      this.$emit('update', message)
    }
  }
}
</script>

在 Grandchild 组件中,我们可以在 props 中声明 message,并在组件内部使用这个数据。同时,我们可以在组件中定义一个方法,通过 $emit 方法触发一个自定义事件,将数据传递给 Child 组件:

<template>
  <div>
    {{ message }}
    <button @click="sendMessage">Send message to grandparent</button>
  </div>
</template>

<script>
export default {
  props: {
    message: String
  },
  methods: {
    sendMessage() {
      this.$emit('update', 'Hello from grandchild')
    }
  }
}
</script>

通过这种方式,我们可以实现跨级组件之间的通信。

Vuex 状态管理

在 Vue.js 应用程序中,有时候需要在多个组件之间共享同一个状态。在这种情况下,我们可以使用 Vuex 这个状态管理库来管理应用程序的状态。

在 Vuex 中,我们可以将应用程序的状态存储在一个集中的 store 中。组件可以通过 getters 来获取 store 中的状态,通过 mutations 来修改 store 中的状态,通过 actions 来执行异步操作。

例如,我们有一个 store,其中存储了一个计数器的值,我们可以在组件中使用 Vuex 的辅助函数来获取和修改这个计数器的值:

<template>
  <div>
    <p>Counter: {{ counter }}</p>
    <button @click="increment">Increment counter</button>
  </div>
</template>

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

export default {
  computed: {
    ...map

标签:Vue,js,export,props,组件,message
From: https://blog.51cto.com/u_16123429/6504664

相关文章

  • Vue全局过滤器的使用以及在template三元运算符中内使用过滤
    新建filters.js如下,内容过滤可以自己写函数,记得export导出importdayjsfrom"dayjs";//转小写letlower=value=>value.toLowerCase();//转大写letupper=value=>value.toUpperCase();letcurrencyStyle=(value,style)=>{//货币格式/***sty......
  • Vue进阶(幺贰柒):插槽详解
    (文章目录)一、概述插槽就是子组件中用slot标签定义的预留位置,可以设置name属性,也可以不设置name属性,设置name属性的叫具名插槽,不设置name属性的叫不具名插槽,在父组件中使用子组件时候,可以在使用子组件标签内通过声明插槽名或不声明插槽名的方式往子组件中的具名插槽或者不具名插......
  • TienChin 开篇-运行 RuoYiVue
    开篇目的:让大家随心所欲的DIY若依的脚手架不会涉及到太多基础知识踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑)下载RuoYiVueGitee:https://gitee.com/y_project/RuoYi-Vue下载完毕之后,这个项目当中存在一个ruoyi-ui这个是前端,只是放在了这个项目当中方便我们进......
  • 基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板
    最近得空学习了下uniapp结合vue3搭建跨端项目。之前也有使用uniapp开发过几款聊天/仿抖音/后台管理等项目,但都是基于vue2开发。随着vite.js破局出圈,越来越多的项目偏向于vue3开发,就想着uniapp搭配vite4.x构建项目效果会如何?经过一番尝试果然真香~版本信息HBuilderX:3.8.4Vite......
  • vue链接 sse 接口 实现实施通讯
    sendSSEMessage(){fetch('http://152.xxx.xx.76:xxxxx/api/v1/chat/message/send?prompt=什么是Python&chat_session_id=1',{headers:{token:"abbb78cbbdde1727ac43bd7770497eee6d598310"......
  • java基于springboot+vue的网吧管理系统,附源码+数据库+论文+PPT,适合课程设计、毕业设计
    1、项目介绍随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,网吧管理系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计的基......
  • Vue进阶(幺贰陆):表格复用 TypeError: _self.$scopedSlots.default is not a function解
    (文章目录)一、前言在使用elementUI的el-table组件时,表头应用v-if判断来动态显示,正常来说这样的操作是没有问题的,但是如果在这基础上使用<templateslot-scope="scope">操作的话,表头一旦切换就会报错,错误信息如下:_self.$scopedSlots.defaultisnotafunction二、解决方......
  • js的new做了什么
    new对象底层发生了什么functionPerson(phone,age){this.age=age;this.phone=phone;this.showone=function(){};}Person.prototype.docall=function(){console.log("电话:",this.phone);};letperson=newPerson("12344",23);c......
  • 关于js单线程的问题
    为什么说js是单线程?为了搞清楚这个问题,我们需要先了解这几个问题:什么是线程?什么是进程?他们之间的关系?什么是任务队列(EventQueue),任务分类(宏任务、微任务)?什么是事件循环?为什么说js是单线程?为什么js要是单线程?接下来我们一起来看一下:什么是线程?什么是进程?他......
  • centos8使用Yum安装nodejs步骤方法、nodejs升级切换版本的方法
    先确认系统是否已经安装了epel-release包(EPEL是企业版Linux的额外软件包,是Fedora小组维护的一个软件仓库项目,为RHEL/CentOS提供他们默认不提供的软件包。):Bash#yuminfoepel-release如果有输出有关epel-release的已安装信息,则说明已经安装,如果提示没有安装或可安装,则安装......