组件间嵌套与父子组件通信

news2024/11/20 12:37:18

1.组件的嵌套

比如在App.vue内使用注册的ShowInfo组件,这就是组件嵌套,其中ShowInfo是子组件,App是父组件

◼ 前面我们是将所有的逻辑放到一个App.vue中:
 在之前的案例中,我们只是创建了一个组件App;
 如果我们一个应用程序将所有的逻辑都放在一个组件中,那么这个组件就会变成非常的臃
肿和难以维护;
 所以组件化的核心思想应该是对组件进行拆分,拆分成一个个小的组件;
 再将这些组件组合嵌套在一起,最终形成我们的应用程序;


◼ 我们来分析一下下面代码的嵌套逻辑,假如我们将所有的代码逻辑都放到一个App.vue组件
中:
 我们会发现,将所有的代码逻辑全部放到一个组件中,代码是非常的臃肿和难以维护的。
 并且在真实开发中,我们会有更多的内容和代码逻辑,对于扩展性和可维护性来说都是非
常差的。
 所以,在真实的开发中,我们会对组件进行拆分,拆分成一个个功能的小组件。

在每个单独的vue文件内书写维护,然后在App.vue文件内导入+注册+使用

2.父子组件间的通信

◼ 父子组件之间如何进行通信呢?
 父组件传递给子组件:通过props属性;
 子组件传递给父组件:通过$emit触发事件

3.父传子

◼ 在开发中很常见的就是父子组件之间通信,比如父组件有一些数据,需要子组件来进行展示
 这个时候我们可以通过props来完成组件之间的通信;
◼ 什么是Props呢?
 Props是你可以在组件上注册一些自定义的attribute;
 父组件给这些attribute赋值,子组件通过attribute的名称获取到对应的值;
◼ Props有两种常见的用法:
 方式一:字符串数组,数组中的字符串就是attribute的名称;
 方式二:对象类型,对象类型我们可以在指定attribute名称的同时,指定它需要传递的类型、是否是必须的、默认值等等;

 import写的范围

<script>
import ShowInfo from "./ShowInfo.vue";

export default {

3.1字符串数组

1.props数组语法

 弊端: 1> 不能对类型进行验证,都是字符串类型,无法精确化数字类型等

    2.没有默认值

 <show-info></show-info>这样父组件没有任何返回值

父组件App.vue

<template>
  <show-info name="why" age="18" height="1.8"></show-info>
  <show-info name="kobe" age="33" height="2.3"></show-info>


</template>

<script>
  import ShowInfo from "./ShowInfo.vue";


  export default
  {
    components:{
      ShowInfo
    }
  }
</script>

<style scoped>

</style>

ShowInfo.vue

<template>
  <div class="infos">
    <h2>姓名:{{name}}</h2>
    <h2>年龄:{{age}}</h2>
    <h2>身高:{{height}}</h2>
  </div>
</template>

<script>
  export default
  {
    props:["name","age","height"]
  }
</script>

<style scoped>

</style>

 3.2对象类型

当使用对象语法的时候,我们可以对传入的内容限制更多:
 比如指定传入的attribute的类型;
 比如指定传入的attribute是否是必传的;如果必传,父组件那里必须写入值
 比如指定没有传入时,attribute的默认值;

可以这么写,但是最好写上默认值 ,实际开发普遍有默认值

<template>
  <div class="infos">
    <h2>姓名:{{name}}</h2>
    <h2>年龄:{{age}}</h2>
    <h2>身高:{{height}}</h2>
  </div>
</template>

<script>
  export default
  {
    props:
    {
      name:String,
      age:Number,
      height:Number
    }
  }
</script>

<style scoped>

</style>

报错提示:age期待是数字,所以改为:age,这样js代码就从字符串类型转换为number类型

<template>
  <show-info name="why" :age="18" :height="1.8"></show-info>
  <show-info name="kobe" :age="33" :height="2.3"></show-info>
</template>

App.vue

<template>
  <!-- 1.展示why的个人信息 -->
  <!-- 如果当前的属性是一个非prop的attribute, 那么该属性会默认添加到子组件的根元素上 -->
  <show-info name="why" :age="18" :height="1.88" 
             address="广州市" abc="cba" class="active" />
 
  <!-- 2.展示kobe的个人信息 -->
  <show-info name="kobe" :age="30" :height="1.87" />
 
  <!-- 3.展示默认的个人信息 -->
  <show-info :age="100" show-message="哈哈哈哈"/>
 
</template>
 
<script>
  import ShowInfo from './ShowInfo.vue'
 
  export default {
    components: {
      ShowInfo
    }
  }
</script>
 
<style scoped>
</style>

ShowInfo.vue

<template>
  <div class="infos">
    <h2 :class="$attrs.class">姓名: {{ name }}</h2>
    <h2>年龄: {{ age }}</h2>
    <h2>身高: {{ height }}</h2>
 
    <h2>Message: {{ showMessage }}</h2>
  </div>
 
  <div class="others" v-bind="$attrs"></div>
</template>
 
<script>
  export default {
    // inheritAttrs: false,
     
    // 作用: 接收父组件传递过来的属性
    // 1.props数组语法
    // 弊端: 1> 不能对类型进行验证 2.没有默认值的
    // props: ["name", "age", "height"]
 
    // 2.props对象语法(必须掌握)
    props: {
      name: {
        type: String,
        default: "我是默认name"
      },
      age: {
        type: Number,
        required: true,
        default: 0
      },
      height: {
        type: Number,
        default: 2
      },
      // 重要的原则: 对象类型写默认值时, 需要编写default的函数, 函数返回默认值
      friend: {
        type: Object,
        default() {
          return { name: "james" }
        }
      },
      hobbies: {
        type: Array,
        default: () => ["篮球", "rap", "唱跳"]
      },
      showMessage: {
        type: String,
        default: "我是showMessage"
      }
    }
  }
</script>
 
<style scoped>
</style>

那么type的类型都可以是哪些呢?
 String
 Number
 Boolean
 Array
 Object
 Date
 Function
 Symbol

对象与数组类型,如果想要有默认值,必须写成函数,有返回值

 friend: {
        type: Object,
        default() {
          return { name: "james" }
        }
      },

◼ Prop 的大小写命名(camelCase vs kebab-case)
 HTML 中的 attribute 名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符;
 这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名)命名;

3.3非Prop的Attribute

◼ 什么是非Prop的Attribute呢?
 当我们传递给一个组件某个属性,但是该属性并没有定义对应的props或者emits时,就称之为 非Prop的Attribute;
 常见的包括class、style、id属性等;

  <show-info name="why" :age="18" :height="1.8" address="广州市"></show-info>

这里的address不是定义好的属性类型,父组件内没有定义,称为非Prop的Attribute
◼ Attribute继承
 当组件有单个根节点时,非Prop的Attribute将自动添加到根节点的Attribute中: 

◼ 如果我们不希望组件的根元素继承attribute,可以在父组件中设置 inheritAttrs: false:

  export default {
   inheritAttrs: false,

 禁用attribute继承的常见情况是需要将attribute应用于根元素之外的其他元素;
 我们可以通过 $attrs来访问所有的 非props的attribute;

多个根节点的attribute
 多个根节点的attribute如果没有显示的绑定,那么会报警告,我们必须手动的指定要绑定到哪一个属性上

4.子传父

◼什么情况下子组件需要传递内容到父组件呢?
当子组件有一些事件发生的时候,比如在组件中发生了点击,父组件需要切换内容

(比如父组件负责显示counter数字,子组件负责实现点击按钮的增减)
 子组件有一些内容想要传递给父组件的时候;


◼ 我们如何完成上面的操作呢?
 首先,我们需要在子组件中定义好在某些情况下触发的事件名称;
 其次,在父组件中以v-on的方式传入要监听的事件名称,并且绑定到对应的方法中;
 最后,在子组件中发生某个事件的时候,根据事件名称触发对应的事件;

父组件内部引用组件,监听内部add/sub(命名来自emit)事件,点击时候触发父组件的方法

子组件内部发送事件名和对应参数

此处子组件被点击,应该实现count+/-,但是由于count值在父组件内,子组件必须emit传值,传递具体改+/-的参数,父组件根据传递的参数进行对应的实现

App.vue

<template>
  <div class="app">
    <h2>当前计数: {{ counter }}</h2>
 
    <!-- 1.自定义add-counter, 并且监听内部的add事件 -->
    <add-counter @add="addBtnClick"></add-counter>
    <add-counter @add="addBtnClick"></add-counter>
 
    <!-- 2.自定义sub-counter, 并且监听内部的sub事件 -->
    <sub-counter @sub="subBtnClick"></sub-counter>
  </div>
</template>
 
<script>
  import AddCounter from './AddCounter.vue'
  import SubCounter from './SubCounter.vue'
 
  export default {
    components: {
      AddCounter,
      SubCounter
    },
    data() {
      return {
        counter: 0
      }
    },
    methods: {
      addBtnClick(count) {
        this.counter += count
      },
      subBtnClick(count) {
        this.counter -= count
      }
    }
  }
</script>
 
<style scoped>
</style>

AddCounter.vue 

<template>
  <div class="add">
    <button @click="btnClick(1)">+1</button>
    <button @click="btnClick(5)">+5</button>
    <button @click="btnClick(10)">+10</button>
  </div>
</template>
 
<script>
  export default {
    methods: {
      btnClick(count) {
        this.$emit("add", count)
      }
    }
  }
</script>
 
<style scoped>
</style>

SubCounter.vue

<template>
  <div class="sub">
    <button @click="btnClick(1)">-1</button>
    <button @click="btnClick(5)">-5</button>
    <button @click="btnClick(10)">-10</button>
  </div>
</template>
 
<script>
  export default {
    methods: {
      btnClick(count) {
        this.$emit("sub", count)
      }
    }
  }
</script>
 
<style scoped>
</style>

emits数组与对象写法

<script>
  export default {
    // 1.emits数组语法
    emits: ["add"],
    // 2.emmits对象语法
    // emits: {
    //   add: function(count) {
    //     if (count <= 10) {
    //       return true
    //     }
    //     return false
    //   }
    // },
    methods: {

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

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

相关文章

第八次CCF计算机软件能力认证

第一题&#xff1a;最大波动 小明正在利用股票的波动程度来研究股票。 小明拿到了一只股票每天收盘时的价格&#xff0c;他想知道&#xff0c;这只股票连续几天的最大波动值是多少&#xff0c;即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。 输入格式 输入…

C++_01_初步认识C++语言

本人博客园亦可见 一、认识 “C语言” 一、首先聊聊什么是语言&#xff1f; 语言是一套具有“语法”、“词法”规律的系统&#xff0c;是思维的工具。   计算程序设计语言是计算机可以识别的语言&#xff0c;用于描述解决问题的方法&#xff0c;供计算机阅读和执行。 语言由…

火山引擎DataLeap的Data Catalog系统公有云实践 (上)

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 前言 Data Catalog 通过汇总技术和业务元数据&#xff0c;解决大数据生产者组织梳理数据、数据消费者找数和理解数的业务场景。本篇内容源自于火山引擎大数据研发治…

《合成孔径雷达成像算法与实现》Figure2.18与2.20

代码复现如下&#xff1a; xlinspace(-20,20,32); ylinspace(-20,20,32); SINC_1zeros(length(x),length(y)); for i1:length(x)for j1:length(y)SINC_1(i,j)sinc(x(i))*sinc(y(j));end end%SINC_1imrotate(SINC_1,8,bilinear,crop); %Zfftshift(fft2(SINC_1)); Zfft2(SINC_1)…

[Python进阶] 元类metaclass(type类)及object类

4.9 元类metaclass(type类)及object类 4.9.1 object类 在面向对象编程中&#xff0c;类是对象的蓝图或模板。类定义了一组属性和方法&#xff0c;并且根据该模板可以创建新的对象。由于每个对象都是基于类来创建的&#xff0c;因此它们共享相同的属性和方法。 object类是一个…

Docker私有仓库部署与管理

目录 Docker--harbor Harbor 简介 Harbor 部署 1. 部署 Docker-Compose 服务 2. 部署 Harbor 服务 维护管理Harbor 1. 通过 Harbor Web 创建项目 2. 创建 Harbor 用户 3. 查看日志 4. 修改 Harbor.cfg 配置文件 5. 移除 Harbor 服务容器同时保留镜像数据/数据库&…

解析数字孪生的现在和未来

数字孪生是一种将现实世界与数字世界相连接的技术&#xff0c;它可以通过建立数字化的物理模型来模拟和预测现实世界的行为和性能&#xff0c;随着技术的成熟逐渐在越来越多行业得以应用&#xff0c;那有没有人好奇数字孪生是怎么来的呢&#xff1f;今天就带大家来盘一盘数字孪…

Unity中的MonoBehaviour 及其生命周期

关于MonoBehaviour 类的类图的详细介绍&#xff1a; Unity中的MonoBehaviour脚本-基础知识和继承关系_拂面清风三点水的博客-CSDN博客 关于MonoBehaviour 类的生命周期&#xff1a; Unity - Manual: Order of execution for event functions&#xff1a; Awake&#xff1a;当…

脑电信号处理与特征提取——5.频谱分析和时频分析(张治国)

目录 五、频谱分析和时频分析 5.1 频谱估计 5.1.1 基本概念 5.1.2 频谱估计方法&#xff1a;周期图 5.1.3 频谱估计方法&#xff1a;Welch法 5.1.4 频谱估计方法的比较 5.1.5 频谱特征提取 5.2 时频分析 5.2.1 短时傅里叶变换 5.2.2 连续小波变换 5.3 事件相关同步…

24考研数据结构-线性表6

目录 2.4.8 静态链表2.4.9 顺序表和链表的比较2.4.9.1 逻辑结构2.4.9.2 存储结构2.4.9.3 基本操作 - 创建2.4.9.4 基本操作 - 销毁2.4.9.5 基本操作-增/删2.4.9.6 基本操作-查2.4.9.7 顺序、链式、静态、动态四种存储方式的比较2.4.9.8 存储密度的问题2.4.9.9 存储方式的选择以…

产品需求、系统架构设计经验篇

需求设计思维导图UML 建模原型规范什么样的需求该忽略1.拍拍脑袋得来的想法&#xff0c;往往是没用的2.用户反馈的信息&#xff0c;不应该直接纳入需求3.扭改用户习惯的需求&#xff0c;一律不考虑 什么样的需求该重视1.从运维系统中根据数据结果分析得出的结论2.重视有洞见者的…

pandas pivot_table数据透视表、MultiIndex多级索引创建

参考&#xff1a; https://blog.csdn.net/ljr_123/article/details/115250639 1、 pivot_table数据透视表 import pandas as pd# 创建示例数据 data {Year: [2019, 2019, 2020, 2020, 2019, 2019, 2020, 2020],Quarter: [Q1, Q2, Q1, Q2, Q1, Q2, Q1, Q2],Product: [A, A, A…

解密数字孪生:解决实际问题的神奇技术

数字孪生是一种将现实世界与数字世界相连接的创新技术&#xff0c;通过将实际物体或系统的数据和行为模拟到数字平台上&#xff0c;实现真实与虚拟之间的交互和信息共享。数字孪生的应用不仅仅局限于虚拟现实&#xff08;VR&#xff09;和仿真领域&#xff0c;它在解决实际问题…

pytorch实现梯度下降算法例子

如题&#xff0c;利用pytorch&#xff0c;通过代码实现机器学习中的梯度下降算法&#xff0c;求解如下方程&#xff1a; f ′ ( x , y ) x 2 20 y 2 {f}(x,y) x^2 20 y^2 f′(x,y)x220y2 的最小值。 Latex语法参考&#xff1a;https://blog.csdn.net/ViatorSun/article/d…

【雕爷学编程】Arduino动手做(87)---ULN2003步进电机模组2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

openAI API使用教程、openai.Completion.create() 详细解释一下

openAI提供了几种不同场景的模型,主要有text completion、code completion、chat completion、image completion,例如chat completion,则调用方式为。而且请求的token和回复的token数会被加一起计费,例如说输入了10个token,openAI回复了20个token,那么最终收费是按照30个…

微信登录账户文件、聊天信息存储转移(存储空间足够、想保留历史聊天记录、文件)

1、打开电脑版微信、点击左下角的三根横线 2、点击左侧的“设置” 3、弹出层左侧点击“文件管理” 4、记录历史存储路径验证使用 历史默认存储位置“./我的文档/WeChat Files” 5、在其他存储空间充足盘符创建存储路径&#xff08;也可在 步骤7过程创建&#xff09; 具体位…

SpringBoot开发小技巧使用(DEBUG、启动图标修改、Lombok、devtools、Spring Initializr)

目录 1. 通过DEBUG查看自动配置的组件2. springboot启动图标修改3. Lombok4. devtools5. 通过IDEA的Spring Initializr快速创建新项目 1. 通过DEBUG查看自动配置的组件 在resources/application.properties中添加如下&#xff0c;开启DEBUG功能&#xff1a; debugtrue然后启动…

.Net Core 6.0依赖注入

.Net Core 6.0依赖注入 往期文章&#xff1a; .ner Core实现接口限流.net Core程序发布到IIS(Window Server 2019) 文章目录 .Net Core 6.0依赖注入前言一、ICO 和DI和DLICO [控制反转]DI [依赖注入]DL [依赖查找] 二、.net Core 中的依赖注入【Autofac】瞬时模式作用域模式单…

中文输入法开发-关键代码

续上篇介绍了嵌入式Linux下中文输入法&#xff0c; 嵌入式Linux下开发中文输入法_嵌入式输入法_小刚学長的博客-CSDN博客 本篇继续介绍核心关键功能 展现效果图如下&#xff1a; 1、如何跟应用关联起来&#xff0c;比如说&#xff0c;希望当LineEdit 输入状态激活后&#xff0…