11 【组件通信】

news2024/12/29 6:30:23

1.props

适用于的场景:父子组件通信

注意事项:

如果父组件给子组件传递数据(函数):本质其实是子组件给父组件传递数据

如果父组件给子组件传递数据(非函数):本质就是父组件给子组件传递数据

书写方式:3种

[‘todos’],{type:Array},{type:Array,default:[]}

特殊情况:路由传递props
1:布尔值类型,把路由中params参数映射为组件props数据
2:对象,静态数据,很少用
3:函数,可以把路由中params|query参数映射为组件props数据

2.自定义事件

使用于场景:子组件给父组件传递数据

o n 与 on与 onemit

  • $emit绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数。

3.全局事件总线$bus

使用于场景:万能

组件实例的原型的原型指向的Vue.prototype

Vue.prototype.$bus = this;

  • 对于比较小型的项目,没有必要引入 vuex 的情况下,可以使用 eventBus。
  • 它的实现思想也很好理解,在要相互通信的两个组件中,都引入同一个新的vue实例,然后在两个组件中通过分别调用这个实例的事件触发和监听来实现通信。

4.pubsub-js

适用于场景:万能

vue当中几乎不用(因为vue中有全局事件总线和这个第三方提供的库功能重复)

在React框架中使用比较多(发布与订阅)

5.Vuex

适用于场景:万能

数据非持久化

核心概念:
State:保存所有组件的共享状态
Getters:类似状态值的计算属性
Mutations:修改 State中状态值的唯一方法,里面包含状态变化监听器和记录器
Actions:用于异步处理 State中状态值,异步函数结束后调用Mutations
Modules:当一个 State 对象比较庞大时,可以将 State 分割成多个Modules 模块。

6.插槽

适用于场景:父子组件通信 — (结构)

默认插槽
具名插槽
作用域插槽:子组件的数据来源于父组件,但是子组件的自己的结构有父亲决定。

  • 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。

7.小总结

  1. 可以实现任意组件的通信的方法有两个:事件总线 和 Vuex,事件总线难维护数据但轻量,Vux维护数据方便但比较重量。
  2. 可以实现父与子孙跨越层级通信的方法也有两个:$attrs/$listenersprovide/inject$attrs/$listeners 具有响应性且可以双向通信,provide/inject无响应性且只能单向通信(父传子)
  3. 只能实现父与子组件通信的方法有一个:props/emit,方法比较基础,适合只有父子组件通信的方法,若想跨层级通信需要中间组件做转发,比较麻烦。

8.v-model

CustomInput.vue

<template>
  <div style="background: #ccc; height: 50px;">
    <h2>input包装组件</h2>
    <!-- 
      :value 动态数据v-bind
      @input 给原生DOM绑定原生DOM事件
    -->
    <input type="text" :value="value" @input="$emit('input',$event.target.value)">
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    name: 'CustomInput',
    props:['value']
  }
</script>

ModelTest.vue

<template>
  <div>
    <!-- 深入学习v-model:实现父子组件数据同步(实现父子组件通信) -->
    <hr />
    <!-- 
      组件身上的:value是props,父子组件通信
      这里的@input是 非原生DOM的input事件 ,属于自定义事件
    -->
    <CustomInput :value="msg" @input="msg = $event" />
    <!--上面那种写法可以简化为下面这种写法,可以实现父子组件数据同步,
    v-model不仅可以在表单元素身上使用,还可以在非表单元素身上使用,
    后台管理系统中经常在非表单元素身上,或者已经封装好的身上v-model-->
    <CustomInput v-model="msg" />
    <span>{{ msg }}</span>
  </div>
</template>

<script type="text/ecmascript-6">
import CustomInput from './CustomInput.vue'
export default {
  name: 'ModelTest',
  components: {
    CustomInput
  },
  data() {
    return {
      msg: '我爱你中国'
    }
  },

}
</script>

image-20220720160842780

9.属性修饰符.sync

9.1 基础结构

SyncTest.vue

image-20220720161216737

效果:

image-20220720161239089

9.2 不使用sync修饰符

SyncTest.vue

<template>
  <div>
    小明的爸爸现在有{{money}}元
    <h2>不使用sync修改符</h2>
    <!-- 
      :money 父组件给子组件传递props
      @update:money给子组件绑定的自定义事件,只不过名字叫做update:money
      目前这种操作,其实和v-model很相似,可以实现父子组件数据同步
      money=$event 给monet重新赋值,为子组件传回来的数据
    -->
    <Child :money="money" @update:money="money = $event" />
    <h2>使用sync修改符</h2>
    <hr>
  </div>
</template>
 
<script type="text/ecmascript-6">
  import Child from './Child.vue'
  export default {
    name: 'SyncTest',
    data() {
      return {
        money: 10000
      }
    },
    components: {
      Child,
    },
  }
</script>

Child.vue

<template>
  <div style="background: #ccc; height: 50px;">
    <span>小明每次花100元</span>
    <!-- $emit触发自定义事件,第一个参数是触发自定义事件的名字,
    第二个参数是子组件需要把父亲还剩多少钱告诉父亲 -->
    <button @click="$emit('update:money',money-100)">花钱</button>
    爸爸还剩{{money}}元
  </div>
</template>
 
<script type="text/ecmascript-6">
  export default {
    name: 'Child',
    props:['money']
  }
</script>

效果:

image-20220720161712884

image-20220720161627872

9.3 使用sync修饰符

<template>
  <div>
    小明的爸爸现在有{{money}}元
    <h2>使用sync修改符</h2>
    <!-- 
      :money.sync的作用:
      第一,父组件给子组件传递props money
      第二,给当前子组件绑定了自定义事件,而且事件名称即为update:money
    -->
    <Child :money.sync="money" />
    <hr>
  </div>
</template>

<script type="text/ecmascript-6">
  import Child from './Child.vue'
  export default {
    name: 'SyncTest',
    data() {
      return {
        money: 10000
      }
    },
    components: {
      Child,
    },
  }
</script>

:money.sync,代表父组件给子组件传递props[money],给当前子组件绑定一个自定义事件(update:money)

10. a t t r s 和 attrs和 attrslisteners

10.1 封装ElementUI按钮,并且是带Hover提示的按钮

新建HintButton,里面放一个index.vue,这个文件用来封装按钮

image-20220720162833922

AttrsListenersTest.vue

<template>
  <div>
    <h2>自定义带Hover提示的按钮</h2>
    <!-- 当用户再使用我们封装的按钮的时候,需要向HintButton组件传递相应的参数 (我们这里做的就是el-button二次封装) -->
    <HintButton type="success" icon="el-icon-delete" size="mini" title="提示按钮" 
    @click="handler"></HintButton>
  </div>
</template>

<script >
import HintButton from './HintButton/index.vue';
  export default {
    name: "AttrsListenersTest",
    methods: {
      //点击事件的回调
      handler() {
        alert(666)
      }
    },
    components: { HintButton }
}
</script>

HintButton

这回我们子组件接收父组件传递过来的参数,我们就不用props了,我们利用组件实例身上的一个属性$attrs也可以接收父组件传递给子组件的数据

在子组件中打印一下$attrs

image-20220720163113596

我们注释props:['title'],利用$attrs接收参数的时候,会发现参数全部接收到了

image-20220720163132358

我们打开props:['title'],利用 a t t r s 接收参数的时候 , 会发现参数除了 p r o p s 接收的 t i t l e , 其他参数都被 attrs接收参数的时候,会发现参数除了props接收的title,其他参数都被 attrs接收参数的时候,会发现参数除了props接收的title,其他参数都被attrs接收了

image-20220720163223688

所以,这里可以总结为:对于子组件而言,父组件给的数据可以利用props接收,注意,如果子组件通过props接收的属性,在$attrs属性当中是获取不到的

因为我们需要封装ElementUI按钮,并且是带Hover提示的按钮

HintButton/index.vue中:

我们在el-button外面来一个a标签,因为a标签有一个title属性,就带有提示功能

<template>
  <div>
    <!-- 可以巧妙利用a标签实现按钮带有提示功能 -->
    <a :title="title">
      <!-- 
        这是复杂的写法,也可以实现效果,但是当属性过多的时候就很麻烦了
        <el-button :type="$attrs.type" :icon="$attrs.icon" :size="$attrs.size"></el-button>
      -->
      <!-- 下面这种写法v-bind不能用 : 不然没效果,这是简单的写法实现效果 -->
      <!-- v-on也不能用 @ 不然没效果-->
      <el-button v-bind="$attrs" v-on="$listeners"></el-button>
    </a>
  </div>
</template>

<script>
  export default {
    props:['title'],
    mounted () {
      //$attrs属于组件实例自身的一个属性,可以获取到父组件传递过来的props数据
      //对于子组件而言,父组件给的数据可以利用props接收,
      //注意,如果子组件通过props接收的属性,在$attrs属性当中是获取不到的
      console.log(this.$attrs);
      //$listeners,它也是组件实例自身的一个属性,它可以获取到父组件给子组件传递的自定义事件
      console.log(this.$listeners);
    },
  }
</script>
<style lang="scss" scoped>
</style>

image-20220720163348444

10.2 $listeners获取父组件给子组件传递的自定义事件

这个时候我们想给按钮绑定一个点击事件,点击弹出一个666什么的,我们知道HintButton是一个组件,在组件身上写@click他就变成了自定义事件了

@click.native其实是可以解决的,但是我们这里有另外的解决办法,所以我这样来演示:

父组件绑定自定义事件

image-20220720163615015

我们想给HintButton绑定单击事件 实际上是给el-button绑定单击事件

我们先看看$listeners身上有没有父组件传递过来的自定义事件,并且利用v-on来给el-button绑定单击事件

HintButton/index.vue中:

子组件中

image-20220720163647822

打印发现:$listeners确实可以获取父组件给子组件传递的自定义事件

image-20220720163745480

此时我们再点击一个按钮,会发现成功弹出了666

image-20220720163812048

10.3 总结

l i s t e n e r s 与 listeners与 listenersattrs(组件通信方式的一种)

他们两者都是组件实例的属性,可以获取到父组件给子组件传递的props与自定义事件

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

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

相关文章

为何要将行驶证转为Excel?在线怎么操作?需要注意些什么?

一、为何要将行驶证转为excel表格&#xff1f;有何好处&#xff1f; 将行驶证转为Excel一般是为了方便信息的整理和管理。将行驶证上的信息录入Excel表格中&#xff0c;可以实现快速搜索、排序和筛选等功能&#xff0c;避免了手动整理信息的繁琐和容易出错的问题。此外&#xf…

ChatGPT 时代,程序员的生存之道 | 人工智能 AI

ChatGPT 近期炙手可热&#xff0c;仿佛没有什么问题是它不能解决的。出于对 ChatGPT 的好奇&#xff0c;我们决定探索下它对于前端开发人员来讲&#xff0c;是作为辅助工具多一些&#xff0c;还是主力工具更多一些&#xff1f; 2D 能力测试 我们就挑选一个著名的递归回溯问题—…

MySQL的知识点整理(学习笔记)

目录 一、认识数据库 1. 什么是数据库 2. 数据库类型 3. 常见的数据库管理系统 4. MySQL介绍 5. MySQL的安装&管理工具的安装 6. SQL概述 7. 在DOS系统中操作MySQL 8. MySql常用命令 二、操作数据库 1、使用navicat创建数据库 2、备份和还原数据库 3、MySQL数据…

医疗文本智能标注工具接连落地,景联文科技助力“GPT+健康医疗”稳步前行

随着医疗技术的飞速发展和普及&#xff0c;医疗数据量日益庞大&#xff0c;医疗数据的处理成为了一个极为重要的问题。医疗数据中包含着众多的病历记录、化验报告、影像资料等&#xff0c;这些数据需要专业人员运用专业的知识进行处理。目前&#xff0c;很多医院和相关研究机构…

懒人必备Jetpack MVVM框架

目录 效果图 项目依赖 使用介绍 项目使用的三方库及其简单示例和资料 网络请求相关使用介绍 谷歌Jetpack框架使用介绍 常见问题 github地址 Android Jetpack MVVM框架开发&#xff0c;基于AndroidX开发&#xff0c;傻瓜式使用&#xff0c;适用于所有项目 谷歌 Android…

mathtype7中文版下载安装后如何关联word

随着网络时代的发展&#xff0c;许多数据都需要上传网络。无论是否是数学专业的师生&#xff0c;在平时的学习中常需要输入数学公式。可数学公式中文字部分少&#xff0c;公式中常包含许多特殊符号&#xff0c;虽然通过输入法可以输入某些特殊公式符号&#xff0c;但不完美&…

springboot项目外卖管理 day02-新增员工以及员工信息编辑

文章目录 一、新增员工1.1、需求分析1.2、数据模型1.3、代码开发 二、员工信息分页查询2.1、需求分析 2.2、代码开发2.3、分页插件2.4、员工信息分页查询 三、启用/禁用员工账号3.1、需求分析3.2、代码开发3.3、根据id修改员工信息3.4、代码修复 4、编辑员工信息4.1、功能需求4…

企业级信息系统开发讲课笔记4.6 Spring Boot整合MyBatis

文章目录 零、学习目标一、Spring Boot数据访问概述二、Spring Boot 整合MyBatis&#xff08;一&#xff09;基础环境搭建1、数据准备&#xff08;1&#xff09;创建博客数据库&#xff08;2&#xff09;创建文章表&#xff08;3&#xff09;文章表插入记录&#xff08;4&#…

protobuf 的安装

protobuf 的安装 安装步骤最后的解决办法git clone遇到的问题解决办法: 后续遇到的问题1.果然还是报错了: 2023-06-05更新Abseil的安装2023-06-06更新代码 安装步骤 这个博主的操作对我有效,这个写的好 apt-get install autoconf automake libtool curl make g unzip(成功) g…

【AUTOSAR】Bootloader说明(二)---- 初始化流程及配置

按照DSP复位后的执行情况&#xff0c;Boot-loader分为以下几部分&#xff1a; DSP启动及系统初始化RAM自检应用程序有效性检查UDS命令处理FALSH操作 DSP启动及系统初始化 选择从FLASH启动 DSP的启动模式配置为从FLASH启动【参考】&#xff0c;硬件引脚配置如下&#xff1a; 引…

Vue.js 中的 Nuxt.js 是什么?如何使用 Nuxt.js?

Vue.js 中的 Nuxt.js 是什么&#xff1f;如何使用 Nuxt.js&#xff1f; Nuxt.js 是一个基于 Vue.js 的服务端渲染应用框架&#xff0c;它提供了一种简单的方式来创建基于 Vue.js 的应用程序。Nuxt.js 提供了许多有用的功能&#xff0c;如自动路由、代码分割、服务端渲染等&…

你了解 .gitkeep文件吗?

目录 简介 作用 例程 简介 本文主要介绍在git中, .gitkeep的作用。 作用 git无法追踪一个空的文件夹&#xff0c;当用户需要追踪(track)一个空的文件夹的时候&#xff0c;按照惯例&#xff0c;大家会把一个称为.gitkeep的文件放在这些文件夹里。 例程 就个人而言&#…

VST的天花板?苹果Vision Pro解析

看了那么多预测、分析之后&#xff0c;苹果MR头显&#xff08;Apple Vision Pro&#xff09;真正的来了。 十多年前&#xff0c;Oculus Rift DK1开启了近代新一轮VR热潮。十年之后&#xff0c;发展未及预期&#xff0c;VR仍未走向大众。如今整个AR/VR行业都在期待&#xff0c;…

一文带你了解11个Linux最常用命令

文章目录 1. 前言2. 文件与目录的查看:ls3. 显示当前路径:pwd4. 创建目录:mkdir5. 切换目录:cd6. 创建文件:touch7. 查看指定文件:cat8. 向终端输出:echo9. 树形结构显示目录: tree10. 删除文件或目录: rm11.复制文件或目录: cp12.文本编辑器: vim13. 总结 1. 前言 Linux的命令…

强大交互功能,真实产品体验一步到位!

动态交互效果是原型项目的灵魂&#xff0c;也是原型与设计产出物的关键区别。一个好的交互设置不仅能准确地传达静态界面难以表达的逻辑、流程和细节体验&#xff0c;还能呈现出丰富精彩的视觉效果&#xff0c;提高项目的质量。对于产品经理来说&#xff0c;学会交互设计是必不…

教你一招,能解决90%的机房问题

近年来&#xff0c;随着科技的发展&#xff0c;蓄电池的使用十分普遍&#xff0c;而蓄电池的广泛应用&#xff0c;也出现了一系列的问题&#xff0c;如不及时处理&#xff0c;可能给系统造成更严重的损失。 为什么需要电池监控&#xff1f; 01.人工值班巡检已经不能满足机房电…

人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTM+CRF模型,实现简单的命名实体识别

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTMCRF模型&#xff0c;实现简单的命名实体识别&#xff0c;BiLSTMCRF 模型是一种常用的序列标注算法&#xff0c;可用于词性标注、分词、命名实体识别等任务。本…

chatgpt赋能python:Python如何到下一行

Python如何到下一行 Python是一种高级编程语言&#xff0c;因其简单易学、可读性高、广泛的应用领域与强大的工具库而迅速成为了广泛使用的语言之一。在Python编程中&#xff0c;换行操作是经常使用的操作。本文将介绍Python中的换行操作以及如何在代码中使用它。 换行符 换…

百度APP iOS端包体积50M优化实践(三) 资源优化

01 前言 百度APP iOS端包体积优化系列文章的前两篇重点介绍了包体积优化整体方案、各项优化收益和图片优化方案&#xff0c;图片优化是从无用图片、Asset Catalog和HEIC格式三个角度做深度优化。本文重点介绍资源优化&#xff0c;在百度APP实践中&#xff0c;资源优化包括大资…

存储过程和函数的区别

目录 零、基本格式 一、返回值 二、参数传递 1、存储过程 2、函数 三、执行方式 四、事务处理 1、存储过程 2、函数 五、数据库兼容性 课上老师提出的讨论题&#xff1a;存储过程和函数的区别&#xff1f; 有同学回复&#xff1a;在数据库后端编程中&#xff0c;存储…