Vue学习笔记 - 深入组件 - 注册,透传Attribute,异步组件

Vue2父组件传值给子组件 -- 向子组件传递属性 --></div><script></script>-- 子组件 ChildComponent.vue --><template><div>-- 将属性绑定到特定元素 -->inheritAttrs: false // 禁用默认属性继承 阅读详情

学完互动教程,已经有个基本印象,再看看文档,基础部分有涉及了,所以看深入组件那部分文档

注册

全局注册

可以使用 Vue 应用实例的 .component() 方法,让组件在当前 Vue 应用中全局可用

import { createApp } from 'vue'

const app = createApp({})

app.component(
  // 注册的名字
  'MyComponent',
  // 组件的实现
  {
    /* ... */
  }
)

如果使用单文件组件,你可以注册被导入的 .vue 文件:

import MyComponent from './App.vue'

app.component('MyComponent', MyComponent)

.component() 方法可以被链式调用:

全局注册的组件可以在此应用的任意组件的模板中使用

局部注册

全局注册的问题

  1. 打包的时候,没有用到的组件也不会被移除(tree-shaking)
  2. 全局注册在大型项目中使项目的依赖关系变得不那么明确

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

<script>
import ComponentA from './ComponentA.vue'

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

<template>
  <ComponentA />
</template>

昨天学的互动教程里的写法就是局部注册的方式

组件名格式

使用 PascalCase 作为组件名的注册格式

PascalCase 就是大驼峰的命名

  1. PascalCase 是合法的 JavaScript 标识符。这使得在 JavaScript 中导入和注册组件都很容易,同时 IDE 也能提供较好的自动补全。
  2. <PascalCase /> 在模板中更明显地表明了这是一个 Vue 组件,而不是原生 HTML 元素。同时也能够将 Vue 组件和自定义元素 (web components) 区分开来

这两点确实有道理

透传 Attributes

Attributes 继承

“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。

当一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上

表述有点书面化,但是看完例子后非常容易理解

<!-- 比如 <MyButton> 的模板是下面这样的 -->
<button>Click Me</button>

<!-- 父组件中使用MyButton组件 -->
<MyButton class="large" />

<!-- 最终渲染的结果: 父组件中声明的class属性透传到MyButton组件了 -->
<button class="large">Click Me</button>

<!-- 如果原来MyButton组件里已经有class属性,最后结果相当于把父组件里的属性再追加上去 -->
<button class="btn">Click Me</button>

<button class="btn large">Click Me</button>

这里有个问题,如果是id怎么办,也是直接加上去?

打开创建的前几天创建的Vue的Demo工程

# 报权限错误可以加sudo
npm run dev

App.vue 是 Helloworld.vue的父组件,而且Helloworld.vue 满足单个元素作为根渲染

App.vue 添加id属性

...
<HelloWorld msg="You did it!" id="new_attr_id" />

...
<style scoped>
<!-- 如果结果是父组件,则是蓝色 -->
#new_attr_id {
    color: blue;
}
#attr_id {
    color: green;
}
...

Helloworld.vue

...
<div class="greetings" id="attr_id">
...

最终结果显示了父组件

Snip20250409_18.png

去掉父组件里的id,则显示子组件的id

Snip20250409_19.png

小结:

  1. Attribute 透传: 子组件根节点加样式,一般适用于class,id,style。其中class是追加的,而id是使用父组件替换掉子组件

依赖注入

应用层 Provide
import { createApp } from 'vue'

const app = createApp({})

app.provide(/* 注入名 */ 'message', /* 值 */ 'hello!')
Prop 逐级透传问题

通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一棵巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:

17441674003760.jpg

注意,虽然这里的 <Footer> 组件可能根本不关心这些 props,但为了使 <DeepChild> 能访问到它们,仍然需要定义并向下传递。如果组件链路非常长,可能会影响到更多这条路上的组件。这一问题被称为“prop 逐级透传”,显然是我们希望尽量避免的情况。

provide 和 inject 可以帮助我们解决这一问题

17441674841802.jpg

示例图已经比较清楚说明了Provider和Inject的用途了

完整示例

App.vue

<script>
import Child from './Child.vue'

export default {
  components: { Child },
  provide() {
    return {
      message: '传给孙子组件'
    }
  }
}
</script>

<template>
  <Child />
</template>

Child.vue

<script>
import GrandChild from './GrandChild.vue'

export default {
  <!-- 局部注册子组件 -->
  components: {
    GrandChild
  }
}
</script>

<template>
  <GrandChild />
</template>

GrandChild.vue

<script>
export default {
  <!-- 声明使用父组件传下来的message -->
  inject: ['message']
}
</script>

<template>
  <p>
    Message to grand child: {{ message }}
  </p>
</template>

2025-04-09 11.07.39.png

异步组件

基本用法

在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。Vue 提供了 defineAsyncComponent 方法来实现此功能:

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() => {
  return new Promise((resolve, reject) => {
    // ...从服务器获取组件
    resolve(/* 获取到的组件 */)
  })
})
// ... 像使用其他一般组件一样使用 `AsyncComp`

导入单文件组件

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() =>
  import('./components/MyComponent.vue')
)

最后得到的 AsyncComp 是一个外层包装过的组件,仅在页面需要它渲染时才会调用加载内部实际组件的函数。它会将接收到的 props 和插槽传给内部组件,所以你可以使用这个异步的包装组件无缝地替换原始组件,同时实现延迟加载。

加载与错误状态
const AsyncComp = defineAsyncComponent({
  // 加载函数
  loader: () => import('./Foo.vue'),

  // 加载异步组件时使用的组件
  loadingComponent: LoadingComponent,
  // 展示加载组件前的延迟时间,默认为 200ms
  delay: 200,

  // 加载失败后展示的组件
  errorComponent: ErrorComponent,
  // 如果提供了一个 timeout 时间限制,并超时了
  // 也会显示这里配置的报错组件,默认值是:Infinity
  timeout: 3000
})

最后的感想

Vue的文档很清晰,导致这部分大多数是"转译"下原来的文档,价值寥寥,只能算熟悉框架了…

耐心点,慢慢来

参考

1分钟了解LangChain是什么? 是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。 阅读详情

相关推荐

数控弯管机xyz转换ybc的算法_数控弯管机技术的更新和应用.pdf

您所在位置:网站首页 > 海量文档&nbsp>&nbsp汽车/机械/制造&nbsp>&nbsp机械/模具设计数控弯管机技术的更新和应用.pdf3页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。2.该文档所...

weixin_31493101的博客 1520

Vue 19 | 动态、异步组件

只渲染基本的页面,对于一些需要通过触发某个事件而出现的页面或内容,在触发时才会发出请求,然后再进行渲染,这些都是针对首次加载来说。在使用动态组件时写上component标签,添加is属性,传入的内容就是想要渲染的内容"currentTabComponent"注意,这个 attribute 可以用于常规 HTML 元素,但这些元素将被视为组件,这意味着所有的 attribute。使用异步组件的方式把各种包分拆成多个小包,当使用时才请求获取资源,相比一次性获取完整的包,效率上要更高效。

千禧年无敌优香大王的博客 334

网络可视化工具netron详细安装流程

netron安装目录1.netron 简介2.不同操作系统下的安装使用方式2.1 在线版本:只要有浏览器就可以2.2 不同操作系统安装使用3.netron支持的网络框架4.netron测试演示 1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构。如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构。 这时,就可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。 2.不同操作系统下的安装使用方式 2.1

江南研习社 12万+

七、Vue组件

本文介绍了Vue 3中组件的定义、注册和使用方法,并重点讲解了Vue 3.5新增的useTemplateRef()特性。

nsdhakshda的博客 401

Ubuntu Server 24.04 安装 (超详细)

本文介绍最小化安装 Ubuntu Server的详细过程。

炀炀的专栏 1万+

Cursor Pro版保姆级开通教程:绕过7天试用,支付宝一步搞定(附地区报错解决方案)

本文详细介绍了Cursor Pro版的订阅流程,包括支付宝支付步骤和解决区域报错的实用方案。针对开发者常见的网络问题和云服务器配置需求,提供了从本地环境调整到云端部署的完整指南,帮助用户高效解锁Pro版的代码补全、私有代码库等核心功能。

weixin_28710999的博客 2087

VUE详解——组件篇

本文为本人在学习vue时所记录的有关组件的笔记,其中详细介绍了vue中的组件及其使用,其中大部分内容来自vue官方中文文档,对于其中的一些知识也加入了一些自己的理解。

深夜无眠的博客 1131

IPSec Over GRE和GRE Over IPSec技术

IPSec Over GRE 和 GRE Over IPSec 一. 技术介绍 IPsec     主要作用是对数据进行加密,因为他能提供所有有时候被单独用作实现加密的一种方法!IPsec建立的是一个逻辑隧道,并不是真正意义上的隧道!并且不能提供路由功能,因为IPsec不支持非ip流量,也不支持广播(组播)! GRE     (通用路由封装)能很好的提供一个真正意义上的点对点的隧道,GRE是一种三层VPN封装技术。GRE可以对某些网络层协议(如IPX、Apple Talk、IP等)的报文进行封装,使封装后

qq_56228347的博客 9866

前端流行框架Vue3教程:18. 透传 Attributes

透传attribute指的是传递给一个组件,却没有被该组件声明为props或emits的attribute或者v-on事件监听器。最常见的例子就是class、style和id当一个组件以单个元素为根作渲染时,透传的attribute会自动被添加到根元素上透传 Attributes 是 Vue 的一个特性,允许父组件传递任意属性到子组件上,而无需显式声明。这在封装可复用的组件时非常有用。

程序员涛哥的博客 564

别再只盯着Text-VQA了!这4个主流VQA数据集(含中英双语)的保姆级下载与对比指南

本文深入解析了Text-VQA、ST-VQA、OCR-VQA和EST-VQA这4个主流视觉问答数据集的特性与应用场景,提供了详细的下载与预处理指南。通过对比分析,帮助开发者根据项目需求选择最适合的数据集,避免因选型不当导致的模型性能问题,特别适合需要处理中英双语或多模态文本理解的AI项目。

weixin_42524708的博客 360

linux内核学习(一)---内核社区介绍及补丁提交

本系列开始会对linux内核进行系统性的学习,以源码与内核社区为基础,了解前沿的内核机制,同时也深度了解linux内核中的一些经典机制 本章会先对linux内核社区进行简单的介绍,包括源码下载、内核社区的修改提交

文艺小少年的博客 536

Vue基础学习四

Vue 基础学习四 组件v-model、透传属性、依赖注入、插槽、异步组件。单根组件的透传Attributes 会自动添加到根元素(class、style 属性会自动合并,如果根元素已经有了class 或style attribute),如需禁用属性透传,选项式添加inheritAttrs:false实现,3.3 +版本组合式可以使用defineOption({inheritAttrs:false})实现。

qq_41897351的博客 921

SAP NetWeaver Business Client (NWBC) 的深入解析

SAP NetWeaver Business Client(NWBC)作为 SAP 提供的一种用户界面,旨在为终端用户提供无缝集成传统 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序的体验。SAP NetWeaver Business Client(NWBC)是 SAP 推出的用户界面,旨在为终端用户提供单一入口,集成传统的 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序。在实际业务场景中,NWBC 的应用提升了用户的工作效率和体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1601

308、Vue学习笔记14 -【动态组件 & 异步组件】 2020.04.16

0、目录1、在动态组件上使用 keep-alive2、异步组件3、处理加载状态4、参考链接 1、在动态组件上使用 keep-alive 我们之前曾经在一个多标签的界面中使用 is attribute 来切换不同的组件: <component v-bind:is="currentTabComponent"></component> 当在这些组件之间切换的时候,你有时会想保持...

youyouwuxin1234的博客 220

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

vue3组件笔记

后代组件会用注入名来查找期望注入的值。一个组件可以多次调用 provide(),使用不同的注入名,注入不同的依赖值。<KeepAlive> 默认会缓存内部的所有组件实例,但我们可以通过 include 和 exclude prop 来定制该行为。<KeepAlive> 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。第二个参数是提供的值,值可以是任意类型,包括响应式的状态,任何后代的组件树,无论层级有多深,都可以。一个父组件相对于其所有的后代组件,会作为。

weixin_49035434的博客 737

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

vue3学习随便记9-深入组件(注册、prop/非prop attribute)

深入组件 组件注册

sjg20010414的专栏 632

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Vue:深入理解组件

目录 1. 组件注册 全局注册 局部注册 2. Prop Prop的大小写 Prop验证 传递Prop 3. 插槽 基本使用 后备内容 作用域插槽 4. 动态组件 & 异步组件 动态组件 在动态组件上使用 keep-alive 异步组件 (一)组件注册 两种组件的注册类型:全局注册和局部注册。 1. 全局注册 全局注册的组件可以用在其被注册之后的任何 (通过 new Vu...

林夏天的博客 527

vue按需动态异步加载组件的几种方法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

索然无味 1万+

vue2.x props 接收父组件传入的值

vue2.x props 接收父组件传入的值

monian187的博客 2339

VUE组件传值的几种方式

一、组件传值有几种类型呢? 父组件给子组件传值 子组件给父组件传值 非父子组件的传值 二、下面具体说说有哪几种传递方式

邱小健的博客 783

学习VUE3——组件(一)

组件学习(一),包含组件注册、数据传递、事件传递回调等、v-model绑定、透传Attributes

lss_033_lss的博客 999

小白浅学Vue3

小白浅学Vue3

weixin_47268883的博客 1188

Vue组件基础

定义一个组件: 1 <template> 2 <header> 3 <h1>{{title}}</h1> 4 </header> 5 </template> 6 7 <script> 8 export default { 9 name: 'app...

weixin_30820151的博客 85

Vue | Vue.js 组件化 - 组件间通信

Props是你可以在组件上注册一些自定义的attribute父组件给这些attribute赋值,子组件通过attribute的名称获取到对应的值。

CoderHing的博客~ 1531

vue3 禁用 Attribute 继承

意外在控制台发现传给子组件的属性以这样的方式呈现 ,感觉有些意外, 于是查了官网文档 当组件返回单个根节点时,非 prop attribute 将自动添加到根节点的 attribute 中。如果组件有多个根节点,那么会发出警告 非 Prop 的 Attribute是组件没有props 和 emits 接收的属性,常见示例包括class、style 和 id 属性, 平时使用组件时总是直接在组件上加 class 或 style 都能修改大概就是这个原因。 在注册组件时,可以通过修改inheritAttr

qq_40890601的博客 1074

Vue.js组件注册与通信

Vue.js详谈组件化 前面已经总结过: vue入门 vue常用指令总结 在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。例如可能会有相同的头部导航 但是如果每个页面都独自开发,这无疑增加了我们开发的成本。所以我们会把页面的不同部分拆分成独立的组件,然后在不同页面就可以共享这些组件,避免重复开发 在vue里,所有的vue实例都是组件 文章目录Vue.js详谈组件...

JunsIr的技术栈 1163
上一篇: Vue学习笔记 - 互动教程 02
下一篇: Vue学习笔记 - 逻辑复用 - 组合式函数
忘川三
博客等级 码龄12年 208粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值