解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 1( Props )

news2024/11/29 8:47:47

  本章带领大家理解组件、props、emits、slots、providers/injects,Vue 插件 等Vue组件使用的基础知识。

  • 5.1 组件注册
  • 5.2 Props
    • 5.2.1 组件之间如何传值
    • 5.2.2 参数绑定 v-bind
    • 5.2.3 参数类型
    • 5.2.4 props 默认与必填
    • 5.2.5 验证设置
    • 5.2.6 useAttrs 属性设置

第一章 Vue3项目创建 1 Vue CLI 创建vue项目
第一章 Vue3项目创建 2 使用 Webpack 5 搭建 vue项目
第一章 Vue3项目创建 3 Vite 创建 vue项目
第二章 Vue3 基础语法指令
第三章 Vue Router路由器的使用
第四章 VUE常用 UI 库 1 ( element-plus,Ant ,naiveui,ArcoDesign)
第四章 VUE常用 UI 库 2 ( ailwind 后台框架)
第五章 Vue 组件应用 1( Props )
第五章 Vue 组件应用 2 ( Emit )
第五章 Vue 组件应用 3( Slots )
第五章 Vue 组件应用 4 ( provide 和 inject )
第五章 Vue 组件应用 5 (Vue 插件)

5.1 组件注册

  Vue 3中有一个非常重要的概念是组件注册,一个 Vue 文件可以被引用到别外一个Vue 文件中,在引用的Vue文件模板中可以使用到被引用到Vue 文件。Vue 文件会被“注册”别外的Vue文件中成为它的子组件,这些子组件会被 父 Vue文件中的模板渲染时找到其对应的实现。组件注册有两种方式:全局注册和局部注册。

1 全局注册

使用 vue 根实例进行注册的组件为全局注册。使用的方法app.component() ,简单的理解就是注册给createApp()的组件都是全局组件,它可以在 Vue 应用中全局可用。

import { createApp } from 'vue'
import App from './App.vue'
import index from './components/index.vue';//导入组件index.vue
const app = createApp(App)
app.component('index',index);//注册全局组件
app.mount('#app')

components目录中创建一个index.vue文件。

<script setup></script>
<template>
  <div>欢迎来到zht代码世界</div>
</template>

App.vue中模板中可以使用这个全局组件功能。

<script setup>
</script>
<template>
<index/>------------使用了全局组件index
</template>

2 局部组件

全局注册虽然很方便,但有使用起来会有几个问题:

  1. 全局注册在打包的时候都会被打在一个包中(这种情况叫“tree-shaking”),如果你注册了很多的全局组,即使它并没有被实际使用到,但是仍然会被打包在一个 JS 文件中,浏览器使用的时候一次全部加载进入缓存中来。
  2. 全局注册在大型项目中使项目的依赖关系变得复杂。在父组件中使用子组件时,不太容易定位到子组件的实现。和程序中使用过多的全局变量一样,这会影响整个项目代码的可维护性。

相比之下,局部注册的组件是在使用它的父组件中显式导入,并且只能在该父组件中使用。它的优点是使组件之间的依赖关系更加明确,并且对 tree-shaking 更加友好。

App.vue中模板可以直接导入index.vue,将index.vue注册为它的子组件。

<script setup>
 import index from './components/index.vue';//导入组件index.vue
</script>
<template>
<index/>------------使用了全局组件index
</template>

5.2 Props

  Props作用是将字符串、数字、数组和对象等值从父组件传递给子组件。当你想到在 JavaScript 中传递参数的时候,首先想到的可能是使用函数传递参数,就像函数中使用arguments一样处理参数。在vue中Props也可以像arguments一样在组件间传值,两个父子组件通过 Props 传递参数。在 Props 传递参数的时候可以在组件内部设定一个初始化函数,对 Props中的参数进行一个初始化的预定处理。

  Vue.js 有一种机制,通过设置要传递的值的数据类型和默认值,使用 Props 将正确的数据传递给组件,以免导致错误。必须将正确的数据传递给组件,才能使组件正常工作。在路由的使用中就介绍过路由之间用Props如何传递参数,现在要介绍的组件之间如何使用Props。

在这里插入图片描述

5.2.1 组件之间如何传值

  让我们创建一个简单的例子,看看如何使用 props传递参数。首先在index.vue文件中进行修改,使用defineProps函数获得props中的参数用于接收和显示名称,defineProps函数中的参数类型为数组。

index.vue

在components目录中创建一个index.vue文件。

<script setup>
defineProps(['name']);
</script>
<template>
  <h1>{{ name }}</h1>
</template>
<style></style>

App.vue

在index组件中使用name属性设置一个字符串参数,将这个字符串传递给index.vue文件中的defineProps([‘name’]);函数,在模板将这个参数字符串显示出来。

<script setup>
import index from './components/index.vue';
</script>
<template>
<index name="我是一个Props 参数" />
</template>

在这里插入图片描述
组件可以重复使用传递不同的参数字符串。

<script setup>
import index from './components/index.vue';
</script>
<template>
<index name="我是一个Props 参数" />
<index name="我是二" />
<index name="我是三" />
</template>

5.2.2 参数绑定 v-bind

  很多情况下我们需要在script标签中定义参数,而这些script标签中的参数需要进行值传递。这种情况下会使用到v-bind 指令进行参数名称绑定。如果不使用v-bind 设置绑定,name属性中设置的字符串(“productName”)将原样传递这个字符串(“productName”)给子组件,而不是script中的productName对象。

App.vue

<script setup>
import index from './components/index.vue';
const productName="const传值";//传递的参数
</script>
<template>
//通过v-bind 指令绑定productName参数与name关系
<index v-bind:name="productName" />
<index name="我是一个Props 参数" />
<index name="我是二" />
<index name="我是三" />
</template>

ref 函数绑定

如果在 props 中传递的数据需要用户交互而发生变化,可以使用 ref 函数定义一个反应变量,并使用 v-bind 设置该变量。

<script setup>
import index from './components/index.vue';
import { ref } from 'vue';
const productName = ref('const 参数');
</script>
<template>
<index v-bind:name="productName" />
<index name="我是一个Props 参数" />
<index name="我是二" />
<index name="我是三" />
</template>

描述指令 v-bind:name,也可以使用缩写形式(语法糖):name来绑定。

5.2.3 参数类型

  上面的示例中对Props 参数使用的非常简单就是以字符串为参数进行值传递。Props也可以将字符串以外的任何内容作为要传递的值进行参数传递。但是,随着代码变得越来越复杂,很多时候我们可能会传递一个数字而不是字符串,或者传递一个Json对象。Props 中传入的这些不同类型的数据都会被defineProps函数接收与处理。

  在vue.js中为了定义不同类型的参数,可以通过defineProps函数中的type属性来设置props中输入了什么类型的值。例如下面中 index 组件的 props 名称中包含字符串,因此首先将类型设置为 String。String的首字母大写,小写会报错。这声明该name属性将包含一个 String(字符串)。id属性类型被定义为数字类型,type设置为 Number,这样代表id获得值为数字类型。

index.vue

  在index.vue组件中,获得来在父组件传递过来的参数,使用defineProps函数获得并且设置出这三个参数的数据类型。之前,我们只是用 props 设置数组并设置获得name属性。当我们需要设置不同属性的类型时候,可以参照下面的写法进行设置。

<script setup>
 //defineProps 接收父组件Props中的参数
 //设置name     字符串类型 type: String
 //设置id       数字类型   type: Number     
 //设置dept     对象类型   type: Object
const props =defineProps({
  name: {
    type: String,
  },
  id: {
    type: Number,
  },
  dept: {
    type: Object,
  },
});
</script>
<template>
  <h1>id:{{ id }}</h1>
  <h1>名称:{{ name }}</h1>
  <h1>部门:{{ dept.name }} 部门id:{{ dept.id }}</h1>
</template>
<style></style>

App.vue

  App.vue中的index组件绑定三个参数name,id,dept到props中。注意这里的dept属性实际上是一个对象类型。

<script setup>
import index from './components/index.vue';
import { ref } from 'vue';
const productName = ref('const 参数');
const dpet = ref({name:"部门一",id:"10"});
</script>
<template>
<index v-bind:name="productName" id="我不是数字" :dept="dpet"/>
<index name="我是一个Props 参数" />
</template>

在这里插入图片描述

参数类型一览

  • String

  • Number

  • Boolean

  • Array

  • Object

  • Date

  • Function

  • Symbol

类型不对发出警告

  让我们来看看如果props中定义的属性类型与传入的参数类型不对会发生什么?测试一下我们定义一个数子类型的参数,给它值传入一个字符类型,看看会有什么变化。

--------------------- index.vue ---------------------
<script setup>
 //defineProps 接收父组件Props中的参数
 //设置name     字符串类型 type: String
 //设置id       数字类型   type: Number     
 //设置dept     对象类型   type: Object
const props =defineProps({
  name: {
    type: String,
  },
  id: {
    type: Number,
  },
});
</script>
<template>
  <h1>id:{{ id }}</h1>
  <h1>名称:{{ name }}</h1>
</template>
<style></style>
--------------------- App.vue ---------------------
<script setup>
import index from './components/index.vue';
import { ref } from 'vue';
const productName = ref('const 参数');
</script>
<template>
<index v-bind:name="productName" id=“我不是数字”/>
<index name="我是一个Props 参数" />
</template>

在浏览器中会看到这个参数正常显示出来了,但是在控制台中会出现警告,我们会看到下面的警告内容。

在这里插入图片描述

控制台警告显示

  类型不对的时候会在控制台会出现一条警告,执行了类型检查并传递了一个数字而不是字符串。我们可以通过这条警告,来检查自己的代码中是否存在参数类型与参数不一致的情况。

5.2.4 props 默认与必填

在props对象的属性中可以设置这默认值,必添项。

1 默认值 default

  如果在子组件中调用的时候没有给props属性中的值传递任何参数的时候,这个时候props就会在配置中找到这个属性的默认值进行赋值。例如下面,默认值设置为“默认名字”。

defineProps({
  name: {
    type: String,
    default: '默认名字',
  },
});

index.vue组件中中如果设置了name属性的默认值,App.vue中如果没有为index组件设置name属性,将使用默认值。

<index name=“我是一个参数” />
<index />------------没有设置属性值,子组件中将显示默认值

组件部分将显示name属性的默认值“默认名字”。

在这里插入图片描述

如果我们在组件props的参数中没也有设置默认值会反生什么?

defineProps({
  name: {
    type: String,
  },
});

如果未设置默认值,控制台不会显示警告等消息。浏览器上没有显示任何内容,因为没有值通过 props 传递index 组件不会收到name参数的值。
在这里插入图片描述
2 设置必填项 Required

  required 属性来设置是否需是必填项。继续前面的内容,下面的例子让我们设置props属性内容为 required 而不设置 default 并且不在 component 标签中设置 props内容。required 的值可以是 true 或 false,我们将 prop 的中name属性设置为 required :true。

defineProps({
  name: {
    type: String,
    required: true,---必填项
  },
});

在浏览器控制台,将看到一条警告,指出即使这次需要该名称,也未提供该名称。警告说缺少道具“名称”
在这里插入图片描述
将 required 设置为 true 会导致显示警告, required 的默认情况为 false。

3 设置默认和必填项

  在项目开发中设置了default默认值,在组件中如果没有给props属性值,将会使用到默认值,所以不需要设置reuqired这个属性。换句话说,不需要像下面这样写 default 和 required 。

defineProps({
  name: {
    type: String,
    default: '默认名字',
    required: true,
  },
});

虽然此处设置了String的初始值,但设置数组或对象时可能会出现以下信息。

[Vue warn]: Invalid default value for prop "[props name]": Props with type Object/Array   must use a factory function to return the default value.

在这种情况下,您应该使用一个函数

defineProps({
  name: {
    type: String,
      default: () => [],
      default:[] //设置默认数组与对象
  },
});

5.2.5 验证设置

  现在我们轻松的理解了props中的类型、默认和必需的设置。但是我们还有一个重要的 Validation 功能没有介绍,下面让我们一起来深理解Validation使用。Validation主要的功能是验证和检查输入的值是否正确。在下面的例子中,来验证index组件name属性的值是否包含"默认名字", “zht”, "zhtbs"这几个字符串。如果不包含这些字符串,控制台发出警告。

index.vue

<script setup>
const props =defineProps({
  name: {
    type: String,
    default: '默认名字',
    //验证函数
    validator: (value) => {
        return ["默认名字", "zht", "zhtbs"].indexOf(value) !== -1;
      },
  }
});
</script>
<template>
  <h1>名称:{{ name }}</h1>
</template>
<style></style>

App.vue

<script setup>
import index from './components/index.vue';
</script>
<template>
<index name="我是一个参数" />
<index name="zhtbs" />
<index />
</template>

  由于验证器中指定的数组元素中不包含"我是一个参数",因此控制台日志中的消息将显示自定义验证器失败的警告。

在这里插入图片描述

  validator 我们来详细解释一下验证函数返回值,validator可以通过返回true或者false来判断成功或者失败,所以return true就一定会成功,当返回值被设置为 false 时,就会在控制台日志中收到警告。

<script setup>
const props =defineProps({
  name: {
    type: String,
    default: '默认名字',
    validator: (value) => {
        return false;//不管值是什么都会收到验证警告
      },
  }
});

  例如 对Props中接收到的值的字符串长度进行校验,可以这样写设置校验。如果字符数大于 6,此验证将为 true,因此如果您输入 3 个字符的包,它将为 false 并显示警告。

defineProps({
  name: {
    type: String,
    default: '默认名字',
    validator: (value) => {
	//验证name是否大于6个字符
      return value.length > 6;
    },
  },
});

  Slots也可以用在父组件与子组件的传值方面。Props 允许传递字符串、数字、数组和对象等参数,而 Slots 允许您传递 HTML 标签。为了更好的加深了对 Props 的理解,请在 Props 之后学习了解Slots 的使用。

5.2.6 useAttrs 属性设置

  在script setup中useAttrs 函数返回了 a t t r s 对象的引用。 attrs对象的引用。 attrs对象的引用。attrs对象保存了父组件模板中引用的子组件设置的class和style样式值,在把它们传回给子组件使用的一个通信工具类。在vue程序中会自动将组件中引用的子组件设置的class和style属性的值装入到 a t t r s 对象。 attrs对象。 attrs对象。attrs也会像props一样装入其他的参数属性,在子组件中这些被装入的其他参数也会被$attrs对象引用到。
在这里插入图片描述

App.vue

在使用到的子组件中,设置class属性和,id 和 style 参数值,它将会传递给子组件。

<script setup>
import index from './components/index.vue';
</script>
<template>
 <index id="main" style="color:red" class="active" />
</template>

index.vue

在子组件中通过useAttrs()获得attrs对象,将attrs对象中的class样式绑定到p标签中的class。

<script setup>
import { useAttrs } from 'vue';
const attrs = useAttrs();
console.log(attrs);
</script>
<template>
<p :class="attrs.class">class属性确认中</p>
</template>
<style></style>

浏览其中会看到字体变红,和attrs对象中的内容。

在这里插入图片描述

  但是我们会发现一个问题,就是attrs中的其他参数没有被绑定到模板元素上,这个时候它们都都会变成p标签中属性。

在这里插入图片描述

  我们来看修改一下index.vue中的代码,增加几个html标签在这些标签中使用useAttr对象中的属性。

<script setup>
import { useAttrs } from 'vue';
const attrs = useAttrs();
console.log(attrs);
</script>
<template>
  <p :class="attrs.class">class属性确认中</p>
  <h2 class="info">子页面</h2>
  <p :style="attrs.style">style属性确认中</p>
</template>
<style></style>

浏览器中显示结果。
在这里插入图片描述

我们会看到在多个html标签中useAttr对象中的值没有变成为这些html标签中的属性。

  • 当模板中只有一个html标签绑定attrs对象时候,attrs中所有的值都会成为这个html元素中的属性。
  • 当模板中多个htm标签绑定attrs对象,attrs对象中的值不会成为它们元素属性

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

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

相关文章

Centos7安装wps无法打开及字体缺失的问题解决

在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm&#xff0c;生成了桌面图标并信任&#xff0c;可以新建文件&#xff0c;但是软件无法打开。在终端执行如下命令&#xff0c;用命令行启动wps&#xff1a; cd /opt/kingsoft/wps-office/office6/ ./…

深度学习修炼(二)全连接神经网络 | Softmax,交叉熵损失函数 优化AdaGrad,RMSProp等 对抗过拟合 全攻略

文章目录 1 多层感知机&#xff08;全连接神经网络&#xff09;1.1 表示1.2 基本概念1.3 必要组成—激活函数1.4 网络结构设计 2 损失函数2.1 SOFTMAX操作2.2 交叉熵损失函数 3 优化3.1 求导计算过于复杂&#xff1f;3.2 链式法则导致的问题&#xff1f;3.3 梯度下降算法的改进…

自定义协议、序列化与反序列化

在编写TCP和UDP程序的时候&#xff0c;我们很自然的就使用了读取的函数对数据进行获取&#xff0c;对于UDP来说提供的是无连接的以数据报的形式进行传输&#xff0c;对于TCP来说是面向数据流的&#xff0c;在之前的程序中我们只是进行了读取的操作&#xff0c;但是并没有对读取…

通讯网关软件008——利用CommGate X2Mysql实现OPC数据转储Mysql

本文介绍利用CommGate X2MYSQL实现从OPC Server读取数据并转储至MYSQL数据库。CommGate X2MYSQL是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从OPC Server读取数据并转储至MYSQL数据…

Go语言进化之路:泛型的崛起与复用的新篇章

一、引言 泛型编程在许多编程语言中都是一项非常强大的特性&#xff0c;它可以使程序更加通用、具有更高的重用性。然而&#xff0c;Go语言在很长一段时间内一直没有提供泛型功能。在过去的一些版本中&#xff0c;Go语言开发者试图引入泛型&#xff0c;但最终都因为各种原因被…

分布式系统——分布式系统知识脑图

摘要 本博文主要介绍分布式系统知识脑图&#xff0c;帮助大家更好的快速的了解分布式系统相关知识。同时也是为大家在工作中应对分布式系统设计提供相关参考。 一、分布式系统知识脑图 博文参考

origin自定义颜色

点击图例&#xff0c;然后点击菜单栏的颜色右边的三角形。选择自定义颜色 在红绿蓝里输入自己想要的颜色配比。点击确定 如图&#xff0c;定义好五组颜色。我这里用的是比较经典的五色配图 蓝&#xff1a;1,86,153 黄&#xff1a;250,192,15 橙&#xff1a;243,118,74 浅蓝…

mysql workbench常见问题

1、No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar 方法一&#xff1a;双击你要使用的库 方法二&#xff1a;USE 数据库名 2、复制表名&#xff0c;字段名 3、保存链接

【PostgreSQL内核学习(十一)—— (CreatePortal)】

CreatePortal 概述CreatePortal 函数GetPortalByName 函数PortalHashTableLookup 函数 MemoryContextAllocZero 函数 AllocSetContextCreate 函数ResourceOwnerCreatePortalHashTableInsert总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们…

AI大模型服务应用场景

大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型通常在各种领域&#xff0c;例如自然语言处理、图像识别和语音识别等&#xff0c;表现出高度准确和广泛的泛化能力。伴随…

2023-9

内核向应用层发送netlink单播消息&#xff1a; nlmsg_unicast -> netlink_unicast -> netlink_sendskb -> __netlink_sendskb -> 把skb链入struct sock 的 sk_receive_queue 链表中&#xff0c;再调用sk->sk_data_ready(sk); -> sock_def_readable -> wak…

排序算法:归并排序(递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

关于使用API接口获取商品数据的那些事(使用API接口获取商品数据的步骤和注意事项。)

随着电商行业的不断发展&#xff0c;越来越多的企业和个人需要获取各大电商平台上的商品数据。而最常用的方法是使用API接口获取商品数据。本文将为您介绍使用API接口获取商品数据的步骤和注意事项。 一、选择API接口 首先需要了解各大电商平台提供的API接口&#xff0c;目前…

算法通关村第14关【黄金】| 数据流的中位数

思路&#xff1a;使用一个小根堆一个大根堆来找中位数 小根堆保存较大的一半数字&#xff0c;大根堆保存较小的一半数字 奇数queMin的队头即为中位数&#xff0c;偶数queMin和queMax队头相加/2为中位数 初始状态&#xff1a; queMin: [] queMax: [] 添加数字 1&#xff1a; …

【Java 基础篇】Java 进程详解:从基础到实践

Java 是一种广泛应用于各种类型的软件开发的编程语言&#xff0c;而与 Java 紧密相关的一个概念就是进程。本篇博客将从基础开始&#xff0c;详细介绍 Java 进程的概念、创建、管理以及一些实际应用场景。无论您是初学者还是有一定经验的开发者&#xff0c;都能从本文中获取有关…

如何高效批量查询快递单号,提高工作效率?

在日常生活中&#xff0c;快递单号的查询是一项常规任务。过去&#xff0c;这项任务需要通过人工一个一个地在快递平台上查询&#xff0c;既耗时又费力。然而&#xff0c;随着科技的发展&#xff0c;我们有了更多的工具可以帮助我们高效地完成这项任务。本文将介绍如何使用固乔…

【List篇】LinkedList 详解

目录 成员变量属性构造方法add(), 插入节点方法remove(), 删除元素方法set(), 修改节点元素方法get(), 取元素方法ArrayList 与 LinkedList的区别Java中的LinkedList是一种实现了List接口的 双向链表数据结构。链表是由一系列 节点(Node)组成的,每个节点包含了指向 上一个…

Java“牵手”1688商品评论数据采集+1688商品评价接口,1688商品追评数据接口,行业商品质检接口,1688API接口申请指南

1688商品评论平台是阿里巴巴集团旗下的一个在线服务市场平台&#xff0c;为卖家提供商品评价服务。平台上有多种评价工具和数据支持&#xff0c;可以帮助卖家更好地了解商品的质量和特点&#xff0c;从而做出更明智的采购决策。 1688商品评论平台支持多种评价方式&#xff0c;…

R语言画多变量间的两两相关性图

语言代码&#xff1a; setwd("D:/Desktop/0000/R") #更改路径df<-read.csv("kaggle/Seed_Data.csv") head(df) df$target<-factor(df$target) # 因为目标是数字&#xff0c;所以加他&#xff0c;不加会报错 cols<-c("steelblue","…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(LeNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素&#xff1a; 缺少的成分&#xff1a;数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中&#xff0c;ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…