vue3组件间怎么通信?简述一下通信方式

news2024/11/22 10:37:29

在写 vue3 的项目中,我们都会进行组件通信,除了使用 pinia 公共数据源的方式除外,我们还可采用那些更简单的API方法呢?给大家介绍介绍几种父子组件和子父组件通信的方式。

 

 

 

1、父子组件通信

1.1 defineProps

父子组件通信我们第一个想到的就是props,我们在子组件显示声明所接受的props,然后我们在从父组件传入对应的 key与value, 这样我们就可以在子组件上接收到父组件传过来的属性与值。

具体实现如下: 

// children.vue
<template>
  <ul class="list-group">
      <li class="list-group-item" v-for="item in list" :key="index">
        {{item}}
      </li>
  </ul>
</template>
<script setup>
import { defineProps } from 'vue';
const props = defineProps({
    list :{
        type: Array,
        default: () => {}
    }
})
</script>

 

// parent.vue
<template>
  <div class="parent-wrap">
      <input type="text" v-model="value" class="form-control" placeholder="请输入">
      <div class="input-group-append">
          <button class="btn btn-primary" @click="handleAdd">添加</button>
      </div>
  </div>
  <!-- child -->
  <childrenVue :list="list"></childrenVue>
</template>
<script setup>
import { ref } from 'vue';
import childrenVue from './children.vue';
const value = ref('')
const list = ref(['javaScript', 'Html', 'CSS'])
const handleAdd = () =>{
    list.value.push(value.value)
    value = ''
}
</script>

 

如上图所示,我们既实现了在子组件上显示了父组件传过来的 list 数组,还使可以向list添加数据使子组件数据更新。

1.2 provide/inject

当我们聊完了props,我们第二个要介绍的就是 vue3 的一个组合式选项 provide 和inject。

projct用于提供可以被后代组件注入的值,而inject用于声明要通过从上层提供方匹配并注入进当前组件的属性。 其代码实现如下:

// children.vue
<template>
    <ul class="list-group">
        <li class="list-group-item" v-for="item in list" :key="item">{{item}}</li>
    </ul>
</template>
<script setup>
import { inject } from 'vue';
const list = inject('list')
</script>

 

// parent.vue
<template>
    <div class="parent-wrap">
        <input type="text" v-model="value" class="form-control" placeholder="请输入">
        <div class="input-group-append">
            <button class="btn btn-primary" @click="handleAdd">添加</button>
        </div>
    </div>
    <!-- child -->
    <childVue />
</template>
<script setup>
import childVue from "./child.vue";
const { ref, provide, readonly } = require("vue");
const value = ref('')
const list = ref(['javaScript', 'HTML', 'CSS'])
provide('list', readonly(list.value))
const handleAdd = () => {
list.value.push(value.value)
}
</script>

 

如上图所示,我们使用 provide API向外提供了一个 key 为 list,值为list.value,同时将 list,value 设置成了只读属性,防止子组件修改父组件的数据源。然后我们 injectAPI接收了 list,实现了父子组件的通信。

2.子父组件通信

2.1 defineEmits

上面我介绍了两种父向子传值的方法,但在我们开发中,我们还会遇到子向父组件传值的情况,那我们该怎么解决呢? 第一个方法就是vue3中的 defineEmits API,代码实现如下:

// children.vue
<template>
    <div class="parent-wrap">
        <input type="text" v-model="value" class="form-control" placeholder="请输入" />
        <div class="input-group-append">
            <button class="btn btn-primary" @click="handleAdd">添加</button>
        </div>
    </div>
</template>
<script setup>
const { ref, defineEmits } = require("vue");
const value = ref('')
const emits = defineEmits(['add']) //父传子
  // 给父组件传一个函数
const handleAdd = () => {
    emits('add', value.value)
    value.value= ''
}
</script>

 

// parent.vue
<template>  
    <childVue @add='handleAdd'/>
    <ul class="list-group">
        <li class="list-group-item" v-for="item in list" :key="item">{{item}}</li>
    </ul>
</template>
<script setup>
import { ref } from '@vue/reactivity';
import childVue from './child.vue';
const list = ref(['javaScript', 'HTML', 'CSS'])
const handleAdd = (val) => {
    list.value.push(val)
}
</script>

 

如上图所示,我们在子组件上emit一个出了一个 add事件给父组件接收,同时在父组件上调用来执行添加的逻辑,再将 inputvalue变为空,实现了父组件向子组件传参。

2.2 v-model:xxx + emit

在介绍完 defineEmits后, 我们再来介绍一种与其有异曲同工之处的v-model:xxx + emit的方法,实现如下:

// children.vue
<template>
    <div class="parent-wrap">
      <input type="text" v-model="value" class="form-control" placeholder="请输入" />
        <div class="input-group-append">
            <button class="btn btn-primary" @click="handleAdd">添加</button>
        </div>
    </div>
</template>
<script setup>
const { ref, defineProps, defineEmits } = require("vue");
const value = ref('')
const props = defineProps({
    list: {
        type: Array,
        default: () => []
    }
})
const emits = defineEmits(['list'])
  // 给父组件一点东西
const handleAdd = () => {
    // props.list.push(value.value)  //不建议直接修改props的值 把握不住数据源的流转
    const arr = props.list
    arr.push(value.value)
    emits('list', arr)
    value.value= ''
}
</script>

 

<template>  
    <childVue v-model:list="list" @list ='add'/>
    <ul class="list-group">
        <li class="list-group-item" v-for="item in list" :key="item">{{item}}</li>
    </ul>
</template>
<script setup>
import { ref } from '@vue/reactivity';
import childVue from './child.vue';
const list = ref(['javaScript', 'HTML', 'CSS'])
const add =(val) => {
    console.log(val);
    console.log(list);
}
</script>

 再和上面的defineEmits方法比较完以后,相信大家也看出了这两者的异曲同工在哪了。我们这里是先将父组件的list传给了子组件,再在子组件修改了父组件的数据源,同时再emit还给父组件,实现了子组件向父组件传值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/449399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Redis数据结构——链表

【Redis】Redis数据结构——链表 注意事项&#xff1a; 本文第三点redis中操作列表的相关命令可参考博文&#xff1a; 【Redis】Redis基础命令集详解_Etui۹(&#xff65;༥&#xff65;)و ̑̑的博客-CSDN博客 本文参考内容如下&#xff1a; 1、Redis数据结构——链表 - 随心…

MySQL_第07章_单行函数

第07章_单行函数 讲师&#xff1a;尚硅谷 - 宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a; http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我…

音视频八股文(3)--ffmpeg常见命令(2)

07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令&#xff0c;从第 2 秒位置开始播放&#xff0c;播放时长为 10 秒&#xff0c;并且在窗口标题中显示 “test time”&#xff1a; ffplay -window_title "test time" -ss 2 -t 10 -autoe…

[计算机图形学]辐射度量学、渲染方程与全局光照(前瞻预习/复习回顾)

一、前言 我们前面讲到的Blinn-Phong着色&#xff0c;Whitted-Style光线追踪都有一定问题&#xff0c;那就是它们并没有严格的按照物理规则定义各个变量。比如&#xff0c;Blinn-Phong中的光的强度&#xff0c;并没有一个确切的单位。同时Whitted-Style光线追踪我们也做了很多简…

二十分钟深入详解<二叉搜索树>!!!

目录 前文 一&#xff0c;什么是二叉搜索树&#xff1f; 1.1 二叉搜索树的概念 二&#xff0c; 二叉搜索树的常用操作及其实现 2.1 查找 2.2 插入 2.3 删除 三&#xff0c;二叉搜索树的应用 3.1 K模型 3.2 KV模型 四&#xff0c;二叉搜索树的性能分析 五&#xff0c;…

SolidWorks建模|渲染装饰件

使用SOLIDWORKS软件建模是许多工程师的选择&#xff0c;对于SOLIDWORKS渲染&#xff0c;也有很多问题&#xff0c;接下来&#xff0c;我们就用SOLIDWORKS建模渲染装饰件的例子来讲解。 1.点击“插入”-“曲面”-“拉伸曲面”&#xff0c;选择上视基准面作为草绘平面&#xff0…

CC2564CRVMR无线音频解决方案、ADE9000ACPZ模拟前端 (AFE) 电路图【MX66L2G45GXRI00 2Gb】FLASH - NOR

CC2564CRVMR 双模蓝牙控制器是一个完整的Bluetooth BR、EDR和低能耗HCI解决方案&#xff0c;可减少设计工作量并缩短上市时间。CC2564C器件基于TI的第七代蓝牙内核&#xff0c;提供符合蓝牙4.2标准的产品验证解决方案。当与微控制器单元 (MCU) 耦合时&#xff0c;该HCI器件具有…

Unity与Andriod交互错误合集

一、无法调用安卓中的方法no non-static method with name‘’ 报错如下&#xff0c;。在保证代码中的方法名没有问题&#xff0c;并且调用的方法名的返回值和传递的参数等都没有问题的情况下&#xff0c; 第一、查看在Unity项目中jar包存放的位置是否正确&#xff0c;需要放在…

LeetCode算法小抄 -- 经典图论算法 之 并查集算法

LeetCode算法小抄 -- 经典图论算法 之 并查集算法 经典图论算法并查集算法动态连通性思路平衡性优化路径压缩Union Find 算法[130. 被围绕的区域](https://leetcode.cn/problems/surrounded-regions/)[990. 等式方程的可满足性](https://leetcode.cn/problems/satisfiability-o…

2023-spring 2.探险营地 — 字符串

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;2023-spring 2.探险营地 题目描述&#xff1a;探险家小扣的行动轨迹&a…

SAM Segment Anything

https://arxiv.org/pdf/2304.02643v1.pdf 包含三个主题&#xff1a;Task、Model、Data Task&#xff08;任务&#xff09;&#xff1a; 需要定义一个 足够通用的图像分割任务&#xff0c;可以提供一个强大的预训练目标&#xff0c;并支持广泛的下游应用程序。 Model&#xf…

mybatis的参数处理详解

mybatis的参数处理详解 parameterType配置参数 1、参数的使用说明 使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型&#xff0c;引用类型&#xff08;例如:String 类型&#xff09;&#xff0c;还可以是实体类类型&#xff08;POJO 类&#xff09;。同时也…

C++学习:类和对象(上)

类和对象 这是C这样的面向对象的语言具有的特性&#xff0c;相较于C语言来说&#xff0c;更加方便的去编写代码&#xff0c;调用代码。 当需要大量重复的调用同一个函数的时候&#xff0c;我们每创建一个函数&#xff0c;就会建立一个栈帧&#xff0c;这样对于空间来讲不友好…

【南京大学PA】 PA0 环境配置 lab (vim | gcc | lab)

本文章学习NJU 的 PA 课程记的笔记 南大PAWLS空间管理 注意事项 whoami 指令 显示你当前的用户IDsudo whoami linux配置 cpp 环境 apt-get install build-essential # build-essential packages, include binary utilities, gcc, make, and so on apt-get install man …

高效办公——Excel表格-03篇(Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子)

高效办公——Excel表格-03篇&#xff08;Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子&#xff09; 1. commandE&#xff08;Windows系统&#xff1a;ctrlE&#xff09;——快速分列/重组2. 高效复制的快捷键2.1 command D&#xff08;快速复制上一单元格的…

面试篇:MySQL

一、如何定位慢查询 1、慢查询原因&#xff1a; 聚合查询多表查询表数据量过大查询深度分页查询 表现&#xff1a;页面加载慢、接口无响应&#xff0c;或者响应时间过长&#xff08;超过1s&#xff09; 2、如何定位慢查询 3、面试官&#xff1a;MySQL中&#xff0c;如何定…

Leetcode-day4【88】【167】【125】【345】

文章目录 88. 合并两个有序数组题目解题思路解题思路【学习】尾插入法 167. 两数之和 II - 输入有序数组题目解题思路 125. 验证回文串题目解题思路 345. 反转字符串中的元音字母题目解题思路 88. 合并两个有序数组 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums…

Nacos封装通用HttpClient

一、Nacos下Http请求设计众多处理模块处理&#xff0c;包括更新、Prometheus监控等众多功能&#xff0c;Nacos对这块做了统一封装&#xff0c;扩展性也很好&#xff0c;有新旧版本和同步和异步版本. 二、具体封装模块. 1、引入依赖如下. <dependency><groupId>co…

C++ STL学习之【反向迭代器】

✨个人主页&#xff1a; 夜 默 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录 &#x1f307;前言&a…

[持续更新]mac使用chatgpt的几种方法~

1. monica 使用edge浏览器或者chrome浏览器&#xff0c;直接在官网下载即可&#xff0c;网址直通&#xff1a; bing: https://www.microsoft.com/zh-cn/edge/download?formMA13FJ google&#xff1a; Google Chrome 网络浏览器 备注&#xff1a;你需要先搭上梯子哈 安装打…