vue3-02-vue3中的组件通信

news2024/11/27 6:32:57

目录

  • 组件通信
    • 一、vue3组件通信和vue2的区别
    • 二、父子通信
      • 2.1 props通信
        • 1)父→子传递数据(父组件向子组件传递数据)
        • 2)子→父传递数据
      • 2.2 v-model
        • 1)v-model的本质
        • 2)给modelValue起别名
        • 3)$event
      • 2.3 父子修改对方的数据
        • 1)父修改子的数据
        • 2)子修改父的数据
    • 三、 祖孙通信
      • 3.1 $attrs
      • 3.2 provide、inject
    • 四、 任意组件之间通信
      • 4.1 mitt
      • 4.2 pinia
        • 1. 搭建pinia环境
        • 2. 存储数据
          • 写法一:选项式
          • 写法二:组合式
        • 3. 读取 / 使用数据
        • 4. 修改数据
        • 5. 补充

该篇内容是我看b站尚硅谷vue3视频总结的,内容仅是我自己总结使用,所以可能有错误和不完善的地方

组件通信

一、vue3组件通信和vue2的区别

在这里插入图片描述

常见搭配形式:
在这里插入图片描述

二、父子通信

父子通信的方法有3种:

  • props
  • v-model
  • $refs、$parent

2.1 props通信

1)父→子传递数据(父组件向子组件传递数据)

在这里插入图片描述

2)子→父传递数据
  1. 利用参数传值
    注意:下图中传参的方式,父组件把sendToy参数传给子组件,当一点击子组件的button,toy就会传给sendToy,父组件的sendToy触发getToy函数,getToy函数里的value就是我们传递的toy
    在这里插入图片描述

自定义事件
上述中儿子给父亲传值,利用参数传值太麻烦,可以借助自定义事件来实现
注意,参数传值用的是冒号:,事件用的是@
在这里插入图片描述

利用自定义事件
上诉例子利用自定义事件来写:
在这里插入图片描述

2.2 v-model

概述: 实现父 ↔ 子之间相互通信
v-model和props的区别:

  • v-model是父子之间控制同一个数据,且这个数据是双向绑定的,其中一方修改另一方会自动修改
  • props是向对方传递自己的数据,例如父组件把自己的car传递给子组件
1)v-model的本质

Father.vue
在这里插入图片描述

v-model用在组件标签上,子组件接收并向父组件发送数据,完成双向绑定:
Child.vue
在这里插入图片描述

2)给modelValue起别名
  • 父组件引入子组件标签,在子组件标签上通过modelValue进行传值,子组件接收也是通过modelValue接收
  • 但是有时候我们传值的时候,参数名不想用modelValue,可以通过下列方式,给modelValue起别名
  • 起别名还有另外一个重要作用:可以v-model绑定多个数据

Father.vue
在这里插入图片描述

Child.vue
在这里插入图片描述

3)$event

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 父子修改对方的数据

在这里插入图片描述

1)父修改子的数据

在这里插入图片描述

  1. 父单独修改某个子组件的数据

注意:

  • ref 用在普通DOM标签上,获取的是DOM节点
  • ref 用在组件标签上(如下例),获取的是组件实例对象
    在这里插入图片描述
  1. 父一下子修改所有子组件的数据
    注意:$refs 可以用于获取父组件的所有子组件的实例对象
    在这里插入图片描述
2)子修改父的数据

注意:$parent 可以获取子组件的父组件
在这里插入图片描述

三、 祖孙通信

有两种方法:
1.$attrs
2.provide、inject

3.1 $attrs

在这里插入图片描述

说明:

  • 组件关系说明:祖、父、孙(爷爷、爸爸、孙子)
  • 想要通过$attrs实现祖→孙通信,必须借助父组件
  • 祖把数据传给父,被父组件接收的值在props中,未被接收的值在 a t t r s 中,父组件把 attrs中,父组件把 attrs中,父组件把attrs中的值传给孙,孙接收数据

举例:
在这里插入图片描述

3.2 provide、inject

概述: 实现祖孙组件之间直接通信
和$attrs的区别:

  • $attrs需要借助父组件,而且父如果接收祖传的数据,那么这个数据孙就接收不到了
  • provide、inject可以实现祖孙之间直接通信,不需要借助父组件
  • 祖(爷爷)组件中provide提供的数据,所有后代(包括父、孙、重孙…)都可以接收
    使用步骤:
  • 在祖(爷爷)组件中通过provide配置向后代组件提供数据
  • 在后代组件中通过inject配置来声明接收数据
    举例:
    在这里插入图片描述

四、 任意组件之间通信

任意组件之间的通信有两种方法:

  • mitt
  • pinia

4.1 mitt

概述: 与消息订阅与发布(pubsub)功能类似,可以实现任意组件间通信
说明: 相当于有了一个第三方,双方借助这个第三方进行通信
使用步骤:
1.安装mitt:npm install mitt
2.配置src/utils/emitter.ts
在这里插入图片描述

3.提供数据的组件:在合适的时候触发事件,然后提供数据
在这里插入图片描述

4.接受数据的组件:绑定事件,同时在销毁前解绑事件
在这里插入图片描述

举例:(注意每个组件中都要引入第三方,也就是emitter)
在这里插入图片描述
在这里插入图片描述

4.2 pinia

1. 搭建pinia环境

注意:pinia相当于vue2中的vuex,是状态管理工具
在这里插入图片描述

2. 存储数据

在这里插入图片描述

用法:(两种写法)
在这里插入图片描述

写法一:选项式

count.ts

// 引入defineStore用于创建store
import {defineStore} from 'pinia'

// 定义并暴露一个store
export const useCountStore = defineStore('count',{

  // 状态---相当于data
  state(){
    return {
      sum:6
    }
  },
  // 动作---相当于methods
  actions: {
    increament(value:number) {
      if(value < 10) {
        this.sum += value
      }
    }
  },
  // 计算---相当于computed
  getters: {
    sumAll(state) {
      return this.sum + this.tall + this.age
    }
  }
})
写法二:组合式
import { defineStore } from "pinia"
import axios from 'axios'
import {nanoid} from 'nanoid'

// 选项式
// export const useTalkStore = defineStore('loveTalk', {
//   state() {
//     return {
//       talkList: JSON.parse(localStorage.getItem('talkList') as string) || []
//     }
//   },
//   actions: {
//     async getTalk() {
//     // 发请求,下面这行的写法是:连续解构赋值+重命名
//     let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
//     // 把请求回来的字符串,包装成一个对象
//     let obj = {id:nanoid(),title}
//     // 放到数组中
//     this.talkList.unshift(obj)
//     }
//   }
// })

// 组合式
import {reactive} from 'vue'
export const useTalkStore = defineStore('loveTalk', () => {
  const talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || [])

    async function getTalk() {
    // 发请求,下面这行的写法是:连续解构赋值+重命名
    let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
    // 把请求回来的字符串,包装成一个对象
    let obj = {id:nanoid(),title}
    // 放到数组中
    this.talkList.unshift(obj)
    }

    return { talkList, getTalk}
})
3. 读取 / 使用数据

count.vue读取count.ts中的数据 — 使用state、actions、getters里的数据,使用$subscirbe()监视state里的数据变化
count.ts

import { defineStore } from "pinia"
export const useCountStore = defineStore('count', {
  state() {
    return {
      sum: 0,
      tall: 100,
      age: 18
    }
  },
  actions: {
    increament(value:number) {
      if(value < 10) {
        this.sum += value
      }
    }
  },
  // getters:相当于计算属性
  getters: {
    sumAll(state) {
      return this.sum + this.tall + this.age
    }
  }
})

count.vue

<h2>当前求和为:{{ sum }},tall:{{ tall }},Age:{{ age }},所有总和为:{{ sumAll }}</h2>
<button @click="add"></button>
<button @click="minus"></button>
...
  import { ref } from "vue"
  import {useCountStore} from '@/store/count'
  import { storeToRefs } from 'pinia'
  
  
  // *********使用state里的数据   --  在html标签里通过{{ XXX }}使用即可*************
  const countStore = useCountStore()
  // 这里不用toRefs的原因是:如果使用toRefs,则countStore里的所有数据,包括state、actions、getters全部变为响应式数据了,storeToRefs只会将数据做转换
  const { sum, tall, age, sumAll } = storeToRefs(countStore) // 把countStore里的sum, tall, age, sumAll转为响应式数据
  
  
  // **********使用actions里定义的函数*********************
  function add(){
    countStore.increament(n.value)
  }
  
  
    // **************使用getters里面的数据*******************
    // 我们在上面已经通过const { sum, tall, age, sumAll } = storeToRefs(countStore)引入了sumAll,在html标签里可以像state里的数据一样使用   
    
    // 通过store的$subscribe()方法监听state及其变化
    countStore.$subscribe(() => {
    console.log('state里的数据发生变化了')
  })
4. 修改数据

三种方法:

  function add(){
    // 第一种方法 -- 单个数据,直接修改
    countStore.sum += n.value
    // 第二种方法 -- 多个数据,批量修改
    countStore.$patch({
       sum: 200,
       tall: 180,
       age: 80
     })

    // 第三种方法  --  使用actions里定义的函数(actions中可以编写一些业务逻辑)
    countStore.increament(n.value)
  }
5. 补充

nanoid安装命令:npm install nanoid
作用:生成唯一值
引入:import {nanoid} from nanoid
使用:let obj = { id:nanoid(),name:‘张三’,age:18 }

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

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

相关文章

【资源】wordpress 子比主题

简介 子比主题是一款功能强大的WordPress主题模板&#xff0c;支持社区论坛、商城、支付、古腾堡编辑器等多种功能。很多资源类网站都是基于此搭建的。搭建后的效果基本上和官网一致&#xff0c;可查看官网的演示效果。 官方网站&#xff1a;https://www.zibll.com/ 如要获取…

精酿啤酒的酿造过程 你喝的不仅仅是酒

大家下午好呀&#xff01;今天我要带大家一起探索精酿啤酒的神秘世界&#xff01;&#x1f31f;&#x1f31f; 第一步&#xff1a;原料准备 精酿啤酒的四大原料&#xff1a;麦芽、啤酒花、水和酵母。 别小看这些原料&#xff0c;它们的品质直接决定了啤酒的风味。&#x1f33e;…

网络协议七 应用层 HTTP 协议

应用层常见的协议 HTTP协议 一. 如何查看我们的http 协议全部的内容有哪些呢&#xff1f; 一种合理的方法是 通过 wireshark 软件&#xff0c;找到想要查看的HTTP --->追踪流--->HTTP流 来查看 结果如下&#xff1a;红色部分 为 发送给服务器的&#xff0c;蓝色部分为服…

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置 文章目录 控件安装和模块导入在ui上添加QChartView控件QChartView图表配置附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09;C语言与C的不同C中写C语言代码…

Stable Diffusion 必备插件推荐,菜鸟轻松成高手!

前言 一个刚学AI绘画的小菜鸟如何快速成为Stable Diffusion高手&#xff1f;答案就是SD插件。 只要学会使用SD的各种插件&#xff0c;帮你写正向和负向提示词&#xff0c;修复人脸/身体/手指&#xff0c;高清放大图片&#xff0c;指定人物pose&#xff0c;图片微调等等都可以…

YOLO系列算法解析

一、深度学习算法概述 1、不同阶段算法优缺点分析 One-stage: 优点&#xff1a;速度非常快&#xff0c;适合做实时监测任务 缺点&#xff1a;效果通常不好 2、yolo评价指标 yolo评价指标&#xff1a;map和fps Map指标&#xff1a;综合衡量检测效果 精度&#xff1a;识别准确率…

代码随想录 day 37 动态规划

第九章 动态规划 part05 力扣上没有纯粹的完全背包的题目&#xff0c;我在卡码网上制作了题目&#xff0c;大家可以去做一做&#xff0c;题目链接在下面的文章链接里。 后面的两道题目&#xff0c;都是完全背包的应用&#xff0c;做做感受一下 完全背包 视频讲解&#xff1a…

这些错误都没遇到过,还敢说你做过自动化测试?!

在执行冒烟测试、回归测试或多浏览器兼容性测试时&#xff0c;利用web自动化测试可以显著节省人力成本&#xff0c;因此web自动化测试的价值非常大。然而&#xff0c;任何从事过web自动化测试的人都会有这样的体会:写自动化代码相对简单&#xff0c;但维护的成本却非常高。一日…

若依服务器上云部署

准备条件&#xff1a; 安装好mysql和redis并配置好密码。 1.安装JDK&#xff0c;我这里使用的是1.8 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11…

40 - asctime()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例2 1 函数原型 asctime()&#xff1a;时间类型转换&#xff0c;函数原型如下&#xff1a; char* asctime (const struct tm * timeptr);ctime()库描述如下&#xff1a; Convert tm structure to string 1. Interpre…

MySQL4 多表查询 内连接

内连接 多表查询内连接 多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) pr…

【文件IO】文件系统操作

文章目录 基本操作概述1. 文件属性2. 文件构造方法3. 文件方法1. 文件创建2. 文件删除3. 查看目录下所有的文件名4. 遍历目录5. 创建目录5. 目录重命名 基本操作概述 创建文件删除文件创建目录重命名文件判定文件存在… Java 中&#xff0c;提供了一个 File 类&#xff0c;进…

电商平台的推荐算法需要备案吗?

答案是肯定的&#xff01; 政策要求&#xff1a; 根据我国《互联网信息服务算法推荐管理规定》&#xff08;以下简称《规定》&#xff09;第六条&#xff0c;具有舆论属性或社会动员能力的互联网信息服务&#xff0c;包括电商平台的推荐算法&#xff0c;需要进行备案。 电商平…

使用js和css 实现div旋转围绕圆分布排列

记录&#xff0c;以防忘记 围绕圆 import React, { useEffect } from react; import ./index.scoped.scss;const Test () > {const arr Array.from({ length: 28 }, (_, index) > index 1);useEffect(() > {const dayTotal arr.length;// 动态设置每个点的旋转角…

快速找出问题快件:批量查询与筛选技巧

在日常生活中&#xff0c;我们经常需要查询大量的快递信息。尤其在电商、物流等行业&#xff0c;快速、准确地查询和筛选快递信息至关重要。固乔快递查询助手是一款强大的工具&#xff0c;能帮助用户批量查询快递&#xff0c;并快速筛选出问题快件。下面我们将详细介绍如何使用…

opengl创建柱面和鱼眼重展uv

专业软件 先看一下专业软件 可以拉取很多的uv点 以下是使用 OpenGL 创建不规则面片并指定 UV 的一般步骤&#xff1a; 1 顶点数据准备 2 定义面片的顶点坐标。这些顶点构成了面片的形状。 3 为每个顶点指定对应的纹理坐标&#xff08;UV&#xff09;。 4 创建顶点缓冲区对象…

Springboot整合hutool验证码

在 Spring Boot 中&#xff0c;你可以将 Hutool 生成验证码的功能集成到 RESTful API 接口中。 依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.14</version> <!-- 使用最新版…

EF Core 索引器属性(Indexer property)场景及应用

EF Core 索引器属性&#xff08;Indexer property&#xff09;场景及应用 简介 EF Core 中的索引器属性&#xff08;Indexer Property&#xff09;是指通过一个特殊的属性来访问实体类中的数据&#xff0c;而不必明确声明实体属性。这种属性在一些动态或未预定义的场景中非常…

【Java算法专场】位运算(下)

目录 判定字符是否唯一 ​编辑 算法分析 算法步骤 算法代码 hash表 位运算 两整数之和 算法分析 算法步骤 算法代码 只出现一次的数字 II 算法分析 算法步骤 算法代码 只出现一次的数字 III 算法分析 算法步骤 算法代码 面试题 17.19. 消失的两个数字 算…

python 如何实现执行selenium自动化测试用例自动录屏?

做自动化测试已经好多年了&#xff0c;随着项目技术的正增长提升&#xff0c;我们也不断完善并提高自己的技术能力&#xff0c; 下面给大家分享一个 selenium 自动化执行测试用例的录屏功能。希望对大家有帮助&#xff01; 首先&#xff0c;我们为什么要执行自动化录屏功能呢…