vue父子组件通信方式哪几种

2023-11-20

第一种:props和$emit()

parent.vue

<template>
  <div id="app">
    <div>父组件:{{message}}</div>
    <ChildrenComponet :message="message" @changeMsgFn="message=$event"/>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{
      message:'默认数据'
    }
  },
  components: {
    ChildrenComponet
  },
  methods:{
    changeMessage(msg){
      console.log(msg)
      this.message = 'Bye';
    }
  }
}
</script>

children.vue

<template>
  <div>
      子组件:{{message}}
      <button @click="handleClick">按钮</button>
  </div>
  
</template>

<script>

export default {
  props:['message'],
  methods:{
    handleClick(){
      this.$emit('changeMsgFn','Bye')
    }
  }
}
</script>

<style>

</style>

按按钮之前:
在这里插入图片描述
按按钮之后:
在这里插入图片描述

第二种,回调函数callback

parent.vue

<template>
  <div id="app">
    ------父组件------
    {{message}}
    <ChildrenComponet :message="message" :changeMsgFn="changeMessage"/>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{
      message: 'hello!'
    }
  },
  components: {
    ChildrenComponet
  },
  methods:{
    changeMessage(){
      this.message = 'Bye'
    }
  }
}
</script>
<template>
  <div>
    ------子组件------
    {{message}}
    <button @click="changeMsgFn">按钮</button>
  </div>
  
</template>

<script>
// import GrandChild from './GrandChild.vue'
export default {
  props: ['message', 'changeMsgFn'],
  components:{
    // GrandChild
  },
  data(){
    return {

    }
  },
  methods:{

  }
}
</script>

点击按钮前:
在这里插入图片描述

点击按钮后:
在这里插入图片描述

第三种,$parent和$children

parent.vue

<template>
  <div id="app">
    <div>父组件:{{message}}</div>
    <ChildrenComponet :message="message"/>
    <button @click="changeChildrenNumber">改变子number</button>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{
      message:'默认数据'
    }
  },
  components: {
    ChildrenComponet
  },
  methods:{
    changeChildrenNumber(){
      this.$children[0].number = 50
    }
  }
}
</script>

children.vue

<template>
  <div>
      子组件:{{number}}
      <button @click="handleClick">按钮</button>
  </div>
  
</template>

<script>

export default {
  data(){
    return {
      number:'初始number'
    }
  },
  props:['message'],
  methods:{
    handleClick(){
      this.$parent[0].message = '测试$parent,我是子组件'
    }
  }
}
</script>

<style>

</style>

点击“改变子number”前:

在这里插入图片描述
点击“改变子number”后
在这里插入图片描述

children.vue

<template>
  <div>
      子组件:{{number}}
      <button @click="handleClick">改变父number,测试$parent</button>
  </div>
  
</template>

<script>

export default {
  data(){
    return {
      number:'初始number'
    }
  },
  methods:{
    handleClick(){
      this.$parent.message = '改变$parent成功'
    }
  }
}
</script>

<style>

</style>

parent.vue

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <div>父组件:{{message}}</div>
    <ChildrenComponet/>
    <button @click="changeChildrenNumber">改变子number</button>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{
      message:'默认数据'
    }
  },
  components: {
    ChildrenComponet
  },
  methods:{
    changeChildrenNumber(){
      this.$children[0].number = 50
    }
  }
}
</script>

点击前:
在这里插入图片描述
点击后:
在这里插入图片描述

第四种,provide和inject

parent.vue

<template>
  <div id="app">
    <ChildrenComponet/>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{

    }
  },
  provide:{
    message:"hello"
  },
  components: {
    ChildrenComponet
  },
  methods:{

  }
}
</script>

children.vue

<template>
  <div>
      子组件:{{message}}
  </div>
  
</template>

<script>

export default {
  inject:['message'],
  data(){
    return {

    }
  },
  methods:{

  }
}
</script>

运行结果:
在这里插入图片描述

第五种,$attrs+$listeners

parent.vue

<template>
  <div id="app">
    ------父组件------
    <div>姓名:{{ name }}</div>
    <div>年龄:{{ age }}</div>
    <ChildrenComponet :name="name" :age="age" @changeName="changeName"/>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{
      name:'小米',
      age: 33,
    }
  },
  components: {
    ChildrenComponet
  },
  methods:{
    changeName(){
      this.name = '小夏'
    }
  }
}
</script>

children.vue

<template>
  <div>
      ------子组件------
      <button @click="$listeners.changeName">按钮</button>
      <GrandChild v-bind="$attrs" />
  </div>
  
</template>

<script>
import GrandChild from './GrandChild.vue'
export default {
  components:{
    GrandChild
  },
  data(){
    return {

    }
  },
  methods:{

  }
}
</script>

GrandChildren.vue

<template>
  <div>
      ------孙组件------
      姓名:{{$attrs.name}}
      年龄:{{$attrs.age}}
  </div>
</template>

<script>
export default {

}
</script>

<style>

</style>

运行结果(从父亲传到了孙子):
在这里插入图片描述
点击按钮后:
在这里插入图片描述

第六种,ref

parent.vue

<template>
  <div id="app">
    ------父组件------
    <ChildrenComponet ref="childComp"/>
    <button @click="changeName">按钮</button>
  </div>
</template>

<script>
import ChildrenComponet from './components/ChildrenComponet.vue'
export default {
  name: 'App',
  data(){
    return{
      name:'小米',
      age: 33,
    }
  },
  components: {
    ChildrenComponet
  },
  methods:{
    changeName(){
      console.log('点击前', this.$refs.childComp.age)
      this.$refs.childComp.changeAge()
      console.log('点击后', this.$refs.childComp.age)
    }
  }
}
</script>

children.vue

<template>
  <div>
      ------子组件------

  </div>
  
</template>

<script>
// import GrandChild from './GrandChild.vue'
export default {
  components:{
    // GrandChild
  },
  data(){
    return {
      age:20
    }
  },
  methods:{
    changeAge(){
      this.age = 50
    }
  }
}
</script>

点击后:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue父子组件通信方式哪几种 的相关文章

  • linux扩展/dev/sda1分区方法

    一 准备 扩展虚拟机的磁盘空间 在虚拟机关闭状态下 点击虚拟机 gt 设置 gt 硬盘 gt 扩展 扩展自己需要的容量 二 开始扩展 idriver ubuntu su 1 切换至root用户 root ubuntu home idrive

随机推荐

  • Kettle教程(一):ETL简介、Kettle安装部署

    文章目录 前言 一 ETL 1 ETL是啥 2 ETL有啥价值 二 Kettle 1 简介 2 安装 三 总结 前言 随着大数据的不断发展 企业级别的数据转换显得尤为重要 从本文开始和大家一起学习一款开源ETL工具 Kettle 一 ETL
  • Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 1 什么是插件化 能运行的宿主APP去加载没有下载的APK文件 并使用APK文件里面的功能 这就叫插
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • equals()方法的重写

    equals 本身是一个方法 并不是运算符 而且仅适用于引用数据类型 在java的引用数据时使用时 比较的并不是具体的数值 而是地址值 此时并不能有效地比较引用数据类型中的具体数据 比较地址值对于引用数据类型而言没有用 就出现了equals
  • 数组添加元素的方法-6种

    数组添加元素的方法 6种 使用 length 属性追加元素 使用length属性 可以在数组末尾后面添加一个元素 var arr 1 2 3 4 5 arr length 6 console log arr 1 2 3 4 5 6 使用 p
  • 远程控制 ToDesk

    ToDesk 远程控制软件 支持跨平台的远程控制 有且不限于PC对PC iOS Android也可以直接控制 最近发现的一个好用的远程连接软件 也是近些年非常火热的 远程控制软件 ToDesk 虽然 QQ 和 向日葵 也都可以满足我们实现的
  • 深入理解spring注解之@ComponentScan注解

    2018 05 20 10 02 23 今天主要从以下几个方面来介绍一下 ComponentScan注解 ComponentScan注解是什么 ComponentScan注解的详细使用 1 ComponentScan注解是什么 其实很简单
  • nginx配置同时支持https/wss协议(http/https ws/wss)都可以

    在Nginx代理集群支持SSL 整体架构如下 SSL SSL Secure Socket Layer 安全套接层 简单来说是一种加密技术 通过它 我们可以在通信的双方上建立一个安全的通信链路 因此数据交互的双方可以安全地通信 而不需要担心数
  • iis6.0配置与漏洞复现

    实验环境 windows sesrver 2003 asp环境 1 iss服务器的搭建 1 点击开始 gt 控制面板 gt 添加或删除程序 2 点击添加或删除程序 3 点击应用程序服务器 gt 点击详细信息 点击确定完成配置 4 点击开始
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • python 使用setup.py安装packages

    前置条件 安装了python 我的版本是python 3 6 5 安装pip 1 打开cmd 2 安装pip python m ensurepip 3 升级pip python m pip install upgrade pip 本地安装
  • 【ChatGPT实践篇】给小孩制作一个数字人恐龙科普短视频

    以下文章来源于飞书 1 科普文本生成 起初我也是试了不少prompts去让chatgpt自由发挥 生成恐龙科普文章 但科普内容要么过于复杂 要么过于宽泛 无法到达自己想要的效果 既然如此 我决定定制化科普内容 让它实现我的想法 1 1 确定
  • 编译原理13:SLR(1)分析表、LR(1)分析表

    更强的LR分析 可以根据当前单词 来选择是移进还是归约 只要所有移进项目中的点后面的那些终结符 与归约项目生成的非终结符的Follow集合的元素没有重叠 若当前单词属于上述Follow集合里则规约 SLR 1 冲突解决办法 SLR 1 分析
  • c++学习笔记

    c 学习笔记 1 安装环境 1 安装环境 windows 下载MinGW w64 linux
  • 在Mac上安装ArduinoIDE并布置环境支持NodeMcu

    前言 笔者最近在研究Swoole 因为对物联网很感兴趣 在某宝上买来了 NodeMcu 开发板 关于NodeMcu大家请提前做好功课 我选择的是CP2102版 Swoole TCP Server负责和小车通讯 Swoole WebScoke
  • 处理大并发之一 对异步非阻塞的理解

    处理大并发之一 对异步非阻塞的理解 在研究nginx和node js的时候常会遇到异步 非阻塞等 之前自己也经常使用epoll 对其同步与阻塞 异步与非阻塞有了一定的认识 现对参考资料总结下 首先讨论下使用事件驱动 异步编程的优点 充分利用
  • 记一次Elasticsearch节点状态red的整改过程

    文章目录 问题起因 Round 1 Round 2 Round 3 Round 4 总结 问题起因 自己负责审计日志模块的管理功能 同事突然对我说 写入的日志数据全部不能用了 我立即答复 回怼 不可能 说罢 还是去登录系统查看 能查出数据
  • 基于self-attention的BIGRU时间序列预测Python程序

    基于self attention的BIGRU时间序列预测Python程序 特色 1 单变量 多变量输入 自由切换 2 单步预测 多步预测 自动切换 3 基于Pytorch架构 4 多个评估指标 MAE MSE R2 MAPE等 5 数据从e
  • paddlepaddle(四)训练与预测验证

    目录 1 内置高级API封装训练 1 1使用paddle Model 封装模型 1 2用Model prepare 配置模型 1 3用Model fit 训练模型 1 4用Model evaluate 评估模型 1 5用Model pred
  • vue父子组件通信方式哪几种

    第一种 props和 emit parent vue