VUE3 组件通信

  1. props

    1. 用途:可以实现父子组件、子父组件、甚至兄弟组件通信

    2. 父组件

      <template><div><Son :money="money"></Son></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      let money = ref(1000)
      </script><style scoped></style>
    3. 子组件

      <template><div>{{ props.money }}</div>
      </template><script setup lang="ts">
      /*	两种方式都可以使用		*/
      // defineProps({
      //     money: {
      //         type: Number,
      //         default: 666
      //     }
      // })
      let props = defineProps(['money'])
      </script><style scoped></style>
  2. 自定义事件

    1. 用途:可以实现子父组件通信

    2. 父组件

      <template><div><Son  @zdy = 'handle'></Son></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      const handle = (a:any,b:any)=>{console.log(a,b) //
      }
      </script><style scoped></style>
    3. 子组件

      <template><div><Son  @zdy = 'handle'></Son></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      const handle = (a:any,b:any)=>{console.log(a,b) //
      }
      </script><style scoped></style>
  3. 全局事件总线$bus:

    1. 用途:可以实现任意组件通信

    2. 安装 

      pnpm i mitt
    3. 配置

      1. 新建bus.js文件

        import mitt from 'mitt'
        const $bus = mitt()
        export default $bus
    4. 使用

      1. 父组件

        <template><div><Son  @zdy = 'handle'></Son></div>
        </template><script setup lang="ts">
        import Son from './son.vue'
        import { ref } from 'vue';
        import $bus from '../utils/bus.js'
        $bus.on('dataToParent',(a:any)=>{console.log(a)
        })
        </script><style scoped></style>
      2. 子组件

        <template><div><button @click="dataToParent">点击向父组件发送全局事件总线数据</button></div>
        </template><script setup lang="ts">
        import $bus from '../utils/bus.js'
        const dataToParent = ()=>{$bus.emit('dataToParent','hello')
        }
        </script><style scoped></style>
  4. v-model

    1. 父组件

      <template><div><Son :money="money"></Son></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      let money = ref(1000)
      </script><style scoped></style>
    2. 子组件

      <template><div>{{ money }}</div>
      </template><script setup lang="ts">
      defineProps(['money'])
      </script><style scoped></style>
  5. useAttrs

    1. 父组件

      <template><div><Son :money="money" title="attr传参" size='default' type="primary"></Son></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import { ref } from 'vue';
      let money = ref(1000)
      </script><style scoped></style>
    2. 子组件

      <template><div>{{ $attrs.money }} --{{ $attrs.title }}</div>
      </template><script setup lang="ts">
      import { useAttrs } from 'vue';
      let $attrs = useAttrs()
      console.log($attrs)
      </script><style scoped></style>
  6. provide与inject

    1. 父组件

      <template><div><Son :money="money"></Son></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import { ref,provide } from 'vue';
      let money = ref(1000)
      provide('name','wang')
      </script><style scoped></style>
    2. 子组件

      <template><div></div>
      </template><script setup lang="ts">
      import { inject } from 'vue';
      let name = inject('name')
      console.log(name)
      </script><style scoped></style>
  7. ref与$parent

    1. 父组件

      <template><div><div>当前父组件的money是{{ money }}</div><button @click="take100FromSon">从儿子手里拿100元</button><Son :money="money" ref="son"></Son><Dau></Dau></div>
      </template><script setup lang="ts">
      import Son from './son.vue'
      import Dau from './daughtor.vue'
      import { ref } from 'vue';
      let son = ref()
      let money = ref(1000)
      const take100FromSon = ()=>
      {son.value.money -=100;money.value+=100
      }
      defineExpose({money
      })
      </script><style scoped></style>
    2. 儿子组件1

      <template><div>儿子的手里有{{ money }}</div>
      </template><script setup lang="ts">
      import { ref } from 'vue';
      let money = ref(500)
      defineExpose({money
      })
      </script><style scoped></style>
    3. 儿子组件2

      <template><div>
      女儿的手里有{{ money }}元
      <button @click="take1000FromFather($parent)">从父亲手里拿1000元</button></div>
      </template><script setup lang="ts">
      import { ref } from 'vue';
      let money = ref(5000)
      const take1000FromFather = ($parent:any)=>{$parent.money-=1000money.value+=1000
      }
      </script><style scoped></style>
  8. pinia

    1. 安装pinia 

      pnpm i pinia
    2. 初始化pinia

      1. 创建一个store文件夹,在下面新建一个index.js文件

        import {createPinia} from 'pinia'
        let store = createPinia()
        export default store 
      2. 在main.js文件中声明

        import store from './pinia'
        app.use(store)
    3. 使用pinia

      1. 在store下新建一个modules文件夹,用来管理pinia文件,例如,创建了一个test.js文件。

        import {defineStore} from 'pinia'
        import {ref} from 'vue'
        export const testPinia = defineStore('testPinia',()=>{const a = ref('hello')const sendMessage = ()=>{a.value = 'hello,vue'console.log(a.value)}return{a,sendMessage}
        })
      2. 组件中使用

        <template><div></div>
        </template><script setup lang="ts">
        import {testPinia} from '../pinia/modules/test.js'
        const testpinia = testPinia()
        console.log(testpinia.a)
        testpinia.sendMessage()
        </script><style scoped></style>
  9. slot

    1. 默认插槽

      1. 父组件

        <template>
        <Son><h1>我是默认插槽填充的结构</h1>
        </Son>**具名插槽:**
        </template><script setup lang="ts">
        import Son from './son.vue'
        </script><style scoped></style>
      2. 子组件

        <template><div><slot></slot></div></template><script setup lang="ts"></script><style scoped></style>
      3. 效果图

    2. 具名插槽

      1. 父组件

        <template><h1>slot</h1><Son><template v-slot:a> <!-- //可以用#a替换  --><div>填入组件A部分的结构</div></template><template v-slot:b><!-- //可以用#b替换 --><div>填入组件B部分的结构</div></template></Son>
        </template><script setup lang="ts">
        import Son from './son.vue'
        </script><style scoped></style>
      2. 子组件

        <template><div><h1>todo</h1><slot name="a"></slot><slot name="b"></slot></div></template><script setup lang="ts"></script><style scoped></style>
      3. 效果图

    3. 作用域插槽

      1. 概念:可以理解为,子组件数据由父组件提供,但是子组件内部决定不了自身结构与外观(样式)

      2. 父组件

        <template><div><h1>slot</h1><Son :todos="todos"><template #="{$row,$index}"><!--父组件决定子组件的结构与外观--><span :style="{color:$row.done?'green':'red'}">{{$row.title}}</span></template></Son></div>
        </template><script setup lang="ts">
        import Son from "./son.vue";
        import { ref } from "vue";
        //父组件内部数据
        let todos = ref([{ id: 1, title: "吃饭", done: true },{ id: 2, title: "睡觉", done: false },{ id: 3, title: "打豆豆", done: true },
        ]);
        </script>
        <style scoped>
        </style>
      3. 子组件

        <template><div><h1>todo</h1><ul><!--组件内部遍历数组--><li v-for="(item,index) in todos" :key="item.id"><!--作用域插槽将数据回传给父组件--><slot :$row="item" :$index="index"></slot></li></ul></div>
        </template>
        <script setup lang="ts">
        defineProps(['todos']);//接受父组件传递过来的数据
        </script>
        <style scoped>
        </style>
      4. 效果图

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

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

相关文章

量子加速超算简介

量子加速超算简介 有用的量子计算的发展是全球政府、企业和学术界的巨大努力。 量子计算的优势可以帮助解决世界上一些与材料模拟、气候建模、风险管理、供应链优化和生物信息学等应用相关的最具挑战性的问题。 要实现量子计算的优势&#xff0c;需要将量子计算机集成到现有的…

容器部署对比:通用容器部署 vs 使用腾讯云容器镜像服务(TCR)部署 Stable Diffusion

目录 引言1 通用容器部署的主要步骤1.1 准备环境1.2 构建 Docker 镜像1.3 上传镜像1.4 部署容器1.5 配置网络1.6 监控和维护 2 使用腾讯云容器镜像服务&#xff08;TCR&#xff09;部署的主要步骤2.1 下载 Stable Diffusion web UI 代码2.2 制作 Docker 镜像2.3 上传镜像到 TCR…

Scala--02--IDEA编写Hello World

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Scala 插件安装1&#xff09;插件离线安装步骤2&#xff09; 插件在线安装&#xff08;推荐可选&#xff09; 2.HelloWorld 案例1&#xff09;打开 IDEA->点击…

Javaweb学习记录(三)请求响应案例

下面为一个请求响应案例&#xff0c;postman发送请求&#xff0c;服务器响应将一个xml文件中的数据通过读取解析&#xff0c;将其用Result类标准的格式返回前端&#xff0c;在前端用json的方式显示 后端Controller代码 1、通过本类的字节码文件得到类加载器并寻找到需要解析的…

Jenkins-pipeline流水线构建完钉钉通知

添加钉钉机器人 在钉钉群设置里添加机器人拿出Webhook地址&#xff0c;设置关键词 Jenkins安装钉钉插件 Dashboard > 系统管理 > 插件管理&#xff0c;搜索构建通知&#xff0c;直接搜索Ding Talk也行 安装DingTalk插件&#xff0c;重启Jenkins 来到Dashboard > 系…

汽车专业翻译应该如何进行呢?

随着全球汽车行业的不断发展&#xff0c;大量的汽车业相关技术资料、产品说明、会议交流、推广分享等都需要进行语言转换&#xff0c;进而促进了汽车翻译业务的需求旺盛。那么&#xff0c;汽车专业翻译应该如何进行呢&#xff0c;北京哪个翻译公司比较好&#xff1f; 业内人士指…

Webpack学习记录

记录学习笔记&#xff0c;欢迎指正 1.大型项目为什么需要打包 1.1 使用打包工具原因 编译或转译文件&#xff1a; 项目中可能用到ES6语法&#xff0c;可能有浏览器不支持。需要打包工具将代码编译输出为ES5语法的代码。项目中可能使用Sass&#xff0c;Less等预处理器&#xff…

【Selenium(一)】

简介 Selenium是一个开源的自动化测试工具&#xff0c;主要用于Web应用程序的自动化测试。它支持多种浏览器&#xff0c;包括Chrome、Firefox、Internet Explorer等&#xff0c;以及多种编程语言&#xff0c;如Java、Python、C#、Ruby等&#xff0c;使得它成为Web自动化测试中…

python(Django)自动化之链接数据库

1、安装数据库 具体安装mysql的教程其实在csdn上都有具体教程大家可以看看 2、更换django的配置 具体是在settings.py中将代码更改成如下&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: autotest,USER: root,PASSWORD: chengxian8.8,HOST: 12…

腾讯云Kubernetes的容器服务平台TKE以及函数计算服务云感受

目录 一、整体结构 二、内容深度 三、技术实用性 一、容器技术 1. 腾讯自身 2. 美团 二、函数计算技术 1. 滴滴出行 2. 小红书 实际应用 容器技术实践示例 函数计算技术实践示例 高级技术探讨示例 书中感受 这边文章是对《2023腾讯云容器和函数计算技术实践精选集…

【iOS】——Blocks

文章目录 前言一、Blocks概要1.什么是Blocks 二、Block模式1.block语法2.block类型变量3.截获自动变量值4._Block修饰符5.截获的自动变量 三、Blocks的实现1.Block的实质2.截获自动变量值3._Block说明符4.Block存储域 前言 一、Blocks概要 1.什么是Blocks Blocks是C语言的扩…

Github 2024-03-18开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-18统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7TypeScript项目3非开发语言项目1Solidity项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型…

mac清除dns缓存指令 mac清除缓存怎么清理

你是否曾经被要求清理dns缓存并刷新&#xff1f;清理dns缓存一般是由于修改了主机文件&#xff0c;或者想排除一些网络上的故障。在Mac上清除dns缓存需要使用命令行来实现。在本文中&#xff0c;软妹子将向大家介绍mac清除dns缓存指令&#xff0c;并展示mac清除缓存怎么清理。 …

超越传统的极限:解密B树与B+树的数据结构之美!

超越传统的极限&#xff1a;解密B树与B树的数据结构之美&#xff01; B树和B树是在计算机科学中常用的平衡查找树数据结构&#xff0c;它们在处理大规模数据和磁盘存储方面具有重要的优势。本文将深入介绍B树和B树的基本概念、特点以及它们在数据库和文件系统中的应用&#xff…

嵌入式-4种经典继电器驱动电路-单片机IO端口/三极管/达林顿管/嵌套连接

文章目录 一&#xff1a;继电器原理二&#xff1a;单片机驱动电路三&#xff1a;经典继电器驱动电路方案3.1 继电器驱动电路方案一&#xff1a;I/O端口灌电流方式的直接连接3.1.1 方案一的继电器特性要求3.1.2 方案一可能会损坏I/O口 3.2 继电器驱动电路方案二&#xff1a;三极…

使用CSS的object-position实现图片在img标签中的定位

在CSS中&#xff0c;object-position属性它允许我们精确地控制替换元素&#xff08;如<img>、<video>等&#xff09;内容在其容器内的位置。通过指定水平和垂直方向的偏移量&#xff0c;可以轻松地调整元素内容在容器内的起始点&#xff0c;实现精准定位。 1 语法…

每周编辑精选|微软开源 Orca-Math 高质量数学数据集、清华大学研究团队发布条件去噪扩散模型 SPDiff...

Orca-Math 是微软研究院发布的数学推理模型&#xff0c;该模型展示了较小的专业模型在特定领域的价值&#xff0c;它们可以匹配甚至超越更大模型的性能。微软近期开源了用于训练 Orca-Math 的 Orca-Math-200K 数学单词问题数据集&#xff0c;现已在 hyper.ai 官网提供下载&…

MS17_010 漏洞利用与安全加固

文章目录 环境说明1 MS17_010 简介2 MS17_010 复现过程3 MS17_010 安全加固 环境说明 渗透机操作系统&#xff1a;kali-linux-2024.1-installer-amd64漏洞复现操作系统: cn_windows_7_professional_with_sp1_x64_dvd_u_677031 1 MS17_010 简介 MS17_010 漏洞后门利用程序 Eter…

【机器学习-04】最小二乘法的推导过程及使用方法(python代码实现)

最小二乘法是一种常用的数据拟合方法&#xff0c;它可以通过最小化残差平方和来找到数据的最佳拟合线。有了上述内容铺垫之后&#xff0c;本文将介绍最小二乘法的推导过程&#xff0c;并提供使用Python实现最小二乘法的代码示例。 1.模型及方程组的矩阵形式改写 首先&#xff…

robots协议详解:爬虫也要有边界感

随着互联网的迅猛发展,信息的获取变得越来越便捷,而网络爬虫(Spider)技术就是其中之一。网络爬虫是一种自动化程序,它能够遍历互联网上的网页,提取信息,用于各种用途,例如搜索引擎索引、数据挖掘、价格比较等。但是,爬虫技术虽然强大,但是也是一把双刃剑,在正当使用…