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

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: {

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansible自动化运维学习——综合练习

目录 (一)练习一 1.新建一个role——app 2.创建文件 3.删除之前安装的httpd服务和apache用户 4.准备tasks任务 (1)创建组group.yml (2)创建用户user.yml (3)安装程序yum.yml (4)修改模板httpd.conf.j2 (5)编写templ.yml (6)编写start.yml (7)编写copyfile.yml (8…

TEE GP(Global Platform)技术委员会及中国任务小组

TEE之GP(Global Platform)认证汇总 一、TEE GP技术委员会 二、GP中国任务小组 参考&#xff1a; GlobalPlatform Certification - GlobalPlatform

基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章

最近在整理和编写基于C#的WinForm应用程序&#xff0c;然后碰到一个其他读者也可能碰到的问题&#xff0c;就是C#的Borderless无边框窗体的动画效果问题。 在Visual Studio 2022里&#xff0c;C#的WinForm程序提供了Borderless无边框窗体的样式效果&#xff0c;但是它没提供在无…

用QFramework来重构 祖玛游戏

资料 Unity - 祖玛游戏 GitHub 说明 用QF一个场景就够了&#xff0c;在UIRoot下切换预制体达到面板切换。 但测试中当然要有一个直接跳到测试面板的 测试脚本&#xff0c;保留测试Scene&#xff08;不然初学者也不知道怎么恢复测试Scene&#xff09;&#xff0c;所以全文按S…

经营在线业务的首选客服工具--SS客服

随着网购正在快速取代传统零售业&#xff0c;各行各业的企业都在大力发展电子商务以取悦客户。但是&#xff0c;有这么多可用的电子商务平台&#xff0c;选择一款符合自己发展的平台确实不容易。电子商务平台不仅是企业在线销售产品和服务的地方&#xff0c;也是他们管理日常运…

按键消抖实现

一、使用状态机实现按键消抖 可将按键按下整个过程看做四个状态&#xff1a;按键空闲状态&#xff0c;按下抖动状态&#xff0c;稳定按下状态&#xff0c;释放抖动状态。 代码实现&#xff1a; /** Description: 状态机方式按键消抖(多按键)* Author: Fu Yu* Date: 2023-07-27…

听GPT 讲K8s源代码--pkg(八)

k8s项目中 pkg/kubelet/envvars&#xff0c;pkg/kubelet/events&#xff0c;pkg/kubelet/eviction&#xff0c;pkg/kubelet/images&#xff0c;pkg/kubelet/kubeletconfig这些目录都是 kubelet 组件的不同功能模块所在的代码目录。 pkg/kubelet/envvars 目录中包含了与容器运行…

服务器用友数据库中了locked勒索病毒后怎么解锁数据恢复

随着信息技术的迅速发展&#xff0c;服务器成为现代企业中不可或缺的重要设备。然而&#xff0c;由于网络安全风险的存在&#xff0c;服务器在日常运作中可能遭受各种威胁&#xff0c;包括恶意软件和勒索病毒攻击。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的用…

Jenkins+Gitlab+Maven集成CI/CD

MavenGitlab集成 配置好下列环境 # Java环境 JAVA_HOME /usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64# Maven环境 MAVEN_HOME /usr/local/maven# Maven环境变量 PATHEXTRA $MAVEN_HOME/bin1. 配置settings.xml路径 2. 安装maven插件 创建项目 配置gitlab地址和指…

19.2:纸牌问题

给定一个整型数组arr&#xff0c;代表数值不同的纸牌排成一条线 玩家A和玩家B依次拿走每张纸牌 规定玩家A先拿&#xff0c;玩家B后拿 但是每个玩家每次只能拿走最左或最右的纸牌 玩家A和玩家B都绝顶聪明 请返回最后获胜者的分数 方法一&#xff1a;暴力解法 自然智慧。 pack…

Redis 基础知识和核心概念解析:探索 Redis 的数据结构与存储方式

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

1200*B. Vanya and Lanterns

Examples input 7 15 15 5 3 7 9 14 0 output 2.5000000000 input 2 5 2 5 output 2.0000000000 解析&#xff1a; 最大距离即为每相邻两盏灯之间的最大距离/2 注意起点没有灯&#xff0c;终点可能有灯&#xff0c;需要分别判断 #include<bits/stdc.h> using nam…

Cesium态势标绘专题-直线箭头(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

大语言模型LLM

目录 一、语言模型的发展 语言模型&#xff08;Language Model&#xff0c;LM&#xff09;目标是建模自然语言的概率分布&#xff0c;具体目标是构建词序列w1,w2,...,wm的概率分布&#xff0c;即计算给定的词序列作为一个句子出现可能的大小P(w1w2...wm)。但联合概率P的参数量…

0-虚拟机补充知识

虚拟机克隆 如果想要构建服务器集群&#xff0c;没有必要一台一台的去进行安装&#xff0c;只要通过克隆就可以。 快速获得多台服务器主要有两种方式&#xff0c;分别为&#xff1a;直接拷贝操作和vmware的克隆操作 直接拷贝 将之前安装虚拟机的所有文件进行拷贝&#xff0…

git撤销上一次的commit

一行命令 git reset --soft HEAD^如果在vscode上面&#xff0c;就可以

Oracle 截取指定字符到目标串的末尾

SQL&#xff1a; SELECT-- 目标字符串 目标字符串 指定符号 最后一个 最后一个字符位置1 substr( HG/2106010103/YG\FJSJ\SXKTFJ\FJ03_JPHD, instr( HG/2106010103/YG\FJSJ\SXKTFJ\FJ03_…

transformer 笔记

目录 目前在NLP领域当中&#xff0c;主要存在三种特征处理器——CNN、RNN 以及 Transformer&#xff0c;当前Transformer的流行程度已经大过CNN和RNN&#xff0c;它抛弃了传统CNN和RNN神经网络&#xff0c;整个网络结构完全由Attention机制以及前馈神经网络组成。 Transformer…

【蓝图】p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统

p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统 p40对象引用、变量有效性p41实现键盘控制物体自转创建bool值控制旋转实现通过键盘控制自转 p42p43简单点名系统Get All Actors Of Class&#xff08;获得场景中所有该类的actor演员&#xff09;getFor Each L…