Vue组件基础

Vue组件基础是DOM+DOM+js前端组成下的页面布局区域划分,每个组件展示时都要在页面上有一定的大小。每个设定好的页面区域都可以定义Vue的组件,组件中包含了HTML模板、样式、Vue组件对象的定义。Vue的组件是包含页面设计在内的,是一种为页面某个设计区域提供独立支撑的解决方案或实例。

1、组件的定义

     组件一般通过单文件来定义,文件后缀名为“.vue”。无论组件是使用构建的方式还是不适用构建的方式,组件的定义中通常包含三个部分,分别是HTML的模板、style、Vue组件对象。使用构建的方式构建组件,最后也可以通过build的方式将工程内容转换为静态的非构建方式组件。组件的定义格式可参照如下:

<script setup lang="ts">
// 添加vue组件定义
</script><template>
<!-- 添加Vue组件对用的HTML模板 -->
</template><style>
/* 为HTML模板增加对用的class  */
</style>

2、组件的使用

    Vue组件的使用有两种不同的方式,第一种是组件直接引用的局部引用方式,另一种是组件的全局引用方式。组件的具备引用方式是组件定义完成后,不注册为Vue的全局对象,使用时需要找到对应的组件定义文件,显示的在使用处注明。如下所示:

<script setup lang="ts">
import StandardForm from './components/StandardForm.vue';  //引入
// 添加vue组件定义
</script><template>
<!-- 添加Vue组件对用的HTML模板 -->
<StandardForm/> <!-- 使用 -->
</template><style>
/* 为HTML模板增加对用的class  */
</style>

另一种方式为全局引用方式。在组件定义完成后,需要在整个工程初始化时明确的注册组件。组件注册完成后,这个组件就是全局组件。在使用时不需要显式的引入就可以直接使用。比较组件的局部引用和全局引用,局部引用需要明确组件的定义文件位置,全局引用不需要明确组件的定义文件位置,但是需要在使用前有明确的全局注册。组件全局注册和使用的案例如下:

//组件注册:
import { createApp } from 'vue'const app = createApp({})
app.component(// 注册的名字
'MyComponent',
// 组件的实现{/* add component code here */}
)//组件的使用:
<!--  在调用全局组件的HTML模板中,直接添加-->
<MyComponent/>

组件使用过程中,组件的来源对组件的使用有很大的影响。局部引用的组件因需要直接指明组件的定义文件位置,所以组件的之间的依赖关系非常明显;全局引用的组件需要注册组件,使用时不会指明组件定义文件的具体位置,当工程非常庞大或者维护的非常差时,组件的依赖关系就有些模糊。因此除了公共依赖的组件和提供公共支持功能的组件之外,不要做全局注册。

3、组件的自定义属性

     组件上的自定义属性时参照HTML标签设置的。在使用组件时,必须显式的给组件的自定义属性赋值。组件的自定义属性如下所示:

<script setup lang="ts">
defineProps<{msg: string
}>()
</script><template><div><h1>{{ msg }}</h1></div>
</template>

使用时如下:

<HelloWorld msg="You did it!" />

组件的自定义属性和组件内部的数据或状态是不同的,即便它们之间可能有交集。组件的自定义属性是给别的组件用的,组件内部的数据或状态是给组件自己用的。

4、组件上的监听事件

      组件上除了有自定义属性之外,还可以有自定义事件的句柄,例如在整个组件上定义的点击事件、双击事件、输入事件等。将整个组件视为整体的一个HTML标签,那么标签上的监听事件就是仿照正常HTML标签的事件做处理,如将组件上的事件句柄给予一个确定的事件名称,暴露给使用者。使用者给这个暴露出来的事件句柄提供对应的事件处理函数。以下为组件上监听事件的案例:

   带有自定义属性和自定义事件的组件,如下:

<script setup lang="ts">
defineProps<{msg: string
}>()
defineEmits<{(e:"aclick",msg:string): void   
}>()
</script><template><div @click="$emit('aclick')"><h1>{{ msg }}</h1></div>
</template>

使用这个组件的父组件,如下:

<script setup lang="ts">
import {ref} from "vue"
import HelloWorld from './components/HelloWorld.vue'const message=ref("You did it!");function triggerClickOnHelloWorld(){console.log("Hello world");message.value="Hello World!";  
}
</script><template><HelloWorld v-bind:msg="message" @aclick="triggerClickOnHelloWorld"/>
</template>

从以上案例可以看出,子组件中的自定义事件和自定义属性在父组件中是可以访问和处理的,子组件等同于一个独立不可拆分的HTML标签。父组件按照规则是不可以访问子组件内部的数据和状态,除非子组件的数据是作为自定义属性。

5、组件标签环绕的内容

      组件标签环绕的内容,类似于`<div>Hello Wrold</div>`,被环绕的内容也应该可以被组件解析。为了满足这种解析情况,Vue增加了插槽slot的标签,这个标签可以在组件定义时,指定环绕内容的位置。样例如下:

<script setup lang="ts">
defineProps<{msg: string
}>()
defineEmits<{(e:"aclick",msg:string): void
}>()
</script><template><div @click="$emit('aclick')"><h1>{{ msg }}</h1><slot></slot>  <!-- 指定插槽的位置--></div>
</template>

实际使用时的处理:

<script setup lang="ts">
import {ref} from "vue"
import HelloWorld from './components/HelloWorld.vue'const message=ref("You did it!");function triggerClickOnHelloWorld(){console.log("Hello world");message.value="Hello World!";  
}
</script><template><HelloWorld v-bind:msg="message" @aclick="triggerClickOnHelloWorld">This is the first slot</HelloWorld>
</template>

因为插槽实际的值是由使用组件的父组件确定,并有子组件的标签环绕,所有插槽的内容并不会在组件中变得混乱。当一个组件中有多个插槽时,那么在实际使用时,需要在组件环绕的内容中为每个插槽指定对应关系,如定义时名字a的插槽对应实际使用时名字为a的文段段落。更复杂一点,可能时动态的确定这种对应关系。

6、动态组件

    动态组件是指组件在页面上频繁切换,切换后,旧的组件内容将会被卸载掉。动态组件是利用类似于继承关系的原理,所有的组件都有公共的父类component,所有组件的定义都是component的子类,这样不同组件都是component的子类,所有的子类都是父类型的。在页面上使用component父类型时,需要使用is的动态属性指定其具体的实现子类型,即具体的组件。

<component :is="StandardForm"></component>

 需要动态切换类型时,只需要将具体的组件值用动态属性替换,动态属性受任意事件影响,其值在不同组件之间来回变动。这样就可以实现动态组件了。具体案例如下:

<script setup lang="ts">
import {shallowRef} from "vue"
import StudyVue from './components/StudyVue.vue';
import StandardForm from './components/StandardForm.vue';const currentComponent=shallowRef(StudyVue);function changeComp(){console.log("change component");if(StudyVue==currentComponent.value){currentComponent.value=StandardForm;}else{currentComponent.value=StudyVue;}
}
</script><template><component :is="currentComponent"></component><button type="button" @click="changeComp">切换组件</button>
</template>

7、组件模板的解析

    直接在DOM中编写模板的时候,注意驼峰格式名称有可能会解析成为连字符格式的名称。特殊位置下的标签,只能解析某种类型的标签,如tr、td、li等,可以将用is属性来解决。

<table><tr is="vue:blog-post-row"></tr>
</table>

 如果是在标准的组件定义文件(单文件)、内联字符串模板(template:``)、<script type="text/x-template"></script>中,则不需要考虑模板解析的问题。

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

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

相关文章

【Python百宝箱】Python轻松操控邮件:SMTP、POP3和IMAP的魅力

前言 在数字时代&#xff0c;电子邮件作为信息传递的主要手段&#xff0c;对个人和企业的日常工作至关重要。Python提供了多个强大的库&#xff0c;使得电子邮件的发送和接收变得轻松而灵活。本文将深入介绍Python中与电子邮件相关的主要库&#xff0c;为读者提供从基础到高级…

Diffusion Model: DDIM

本文相关内容只记录看论文过程中一些难点问题&#xff0c;内容间逻辑性不强&#xff0c;甚至有点混乱&#xff0c;因此只作为本人“备忘”&#xff0c;不建议其他人阅读。 DENOISING DIFFUSION IMPLICIT MODELS: https://arxiv.org/abs/2010.02502 前序知识 DDPM&#xff1a;…

零基础学python第一天||数和四则运算

数和四则运算 一提到计算机&#xff0c;当然现在更多人把她叫做电脑&#xff0c;这两个词都是指computer。不管什么&#xff0c;只要提到她&#xff0c;普遍都会想到她能够比较快地做加减乘除&#xff0c;甚至乘方开方等。乃至于&#xff0c;有的人在口语中区分不开计算机和计…

kkflieview概念以及整合步骤

KKFlyView 是一款Android视图动画库&#xff0c;能够实现类似于飞行器驾驶舱的视觉效果。整合 KKFlyView 的步骤如下&#xff1a; 首先&#xff0c;将库添加到项目中。可以通过 Gradle 添加依赖项&#xff0c;也可以手动下载库并将其添加到项目中。 在布局文件中添加 KKFlyVie…

ElasticSearch之禁用交换分区

操作系统将进程加载至内存中执行时&#xff0c;对于当前未使用到的内存页&#xff0c;可能会将相关内存页交换至硬盘上&#xff0c;即swap。 对于性能敏感、时延敏感的应用程序比如ElasticSearch&#xff0c;swap特性会明显影响性能和稳定性&#xff0c;因此最好禁用swap特性。…

OSG粒子系统与阴影-雨效、雪效模拟(2)

雪效模拟示例 雪效模拟示例的代码如程序清单11-2所示&#xff1a; 1. /* 雪效模拟示例 */ 2. void snow_11_2(const string &strDataFolder) 3. { 4. osg::ref_ptr<osgViewer::Viewer> viewer new osgViewer::Viewer(); 5. osg::ref_ptr<osg::G…

做管理的那4件事

01、用人&#xff0c;不废人 什么是用人&#xff0c;不废人&#xff1f;核心就是两个点。 1.不对人坏 在工作中&#xff0c;有一些管理者因为格局不够&#xff0c;缺乏胸怀。 所以总是摆架子&#xff0c;而且喜欢用权压人&#xff0c;当有人不听他的话&#xff0c;就给人穿小…

一个tomcat中部署的多个war,相当于几个jvm

请直接去看原文 原文链接:一个tomcat有几个jvm-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 前几天向unmi提问&#xff0c;今天他答复了。我觉得答复很清楚&#xff0c;…

如何学习VBA:3.2.8 OnTime方法与OnKey方法

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

System-V共享内存和基于管道通信实现的进程池

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…

Jquery ajax 进行网络请求,同步阻塞引起的UI线程阻塞 (loading图片不显示 )

jax重新获取数据刷新页面功能&#xff0c;因为ajax属于耗时操作&#xff0c;想在获取数据且加载页面时显示加载遮罩层&#xff0c;结果发现了ajax的好多坑。 ajax 执行http网络请示时时&#xff0c;让遮罩层显示&#xff0c;ajax加载完毕后遮罩层消失。 因为我想让loadChart()…

LeetCode算法题解|474. 一和零

474. 一和零 题目链接&#xff1a;474. 一和零 题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子…

c++模板模板参数,可变数量的模板参数

当使用模板模板参数时&#xff0c;我们可以将一个模板作为另一个模板的参数&#xff0c;从而实现更大的灵活性和重用性。模板模板参数的主要优势之一是它允许我们编写适用于多种模板类型的通用代码。 下面是一些关于模板模板参数的更多信息 template <template <typenam…

外贸独立站外部优化:提升网站可见度与吸引力的策略

随着全球电子商务的快速发展&#xff0c;外贸独立站已经成为众多企业拓展海外市场、提升品牌影响力的关键工具。然而&#xff0c;要想在竞争激烈的外贸市场中脱颖而出&#xff0c;除了产品优质、服务周到外&#xff0c;还需要做好网站的外部优化工作。本文将详细探讨如何通过有…

卷积神经网络(CNN)识别验证码

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据4.标签数字化 二、构建一个tf.data.Dataset1.预处理函数2.加载数据3.配置数据 三、搭建网络模型四、编译五、训练六、模型评估七、保存和加载模型八、预测 …

Ubuntu18.04安装A-Loam保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.A-Loam的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话&#xff0c;有时候加了这行也不好使&#xff0c;我是疯狂试了20次&#…

十六、互斥量

互斥量的目的就是为了实现互斥访问。 1、概述 (1)举例说明&#xff1a; 怎么独享厕所&#xff1f;自己开门上锁&#xff0c;完事了自己开锁。 你当然可以进去后&#xff0c;让别人帮你把门&#xff1a;但是&#xff0c;命运就掌握在别人手上了。 …

3.3.2 深度理解BITS_TO_LONGS函数

文章目录 定义物理意义内核应用应用一:直接使用应用二 间接使用测试驱动层示例应用层示例参考定义 BITS_TO_LONGS定义在include/linux/bitops.h中,具体如下 #define BITS_PER_BYTE 8 #define

Task.Run为什么会存在内存泄漏的风险?

由于值类型是拷贝方式的赋值&#xff0c;捕获的本地变量和类成员是指向各自的值&#xff0c;对本地变量的捕获不会影响到整个类。但如果把类中的值类型改为引用类型&#xff0c;那这两者最终指向的是同一个对象值&#xff0c;这是否意味着使用本地变量还是无法避免内存泄漏&…

【java】-D参数使用

在开发过程中我们使用开源工具经常会用到在启动命令时候加入一个 -Dxxx 类型的参数。到底-Dxxx是干什么用的了。 官方文档 地址&#xff1a;文档地址 java命令使用 下面是来源于官方文档&#xff1a; java [options] classname [args] java [options] -jar filename [args…