Vue2:组件

Vue2:组件

    • 非单文件组件
      • 定义
      • 注册
      • 使用
    • 单文件组件


组件是Vue中最核心的内容,在编写页面时,将整个页面视为一个个组件,再把组件拼接起来,这样每个组件之间相互独立,有自己的结构样式,使页面编写思路更清晰,模块更分明,而且提高了复用性。

Vue中组件分为非单文件组件单文件组件

非单文件组件

所谓非单文件组件,是指一个组件的htmlcssJavaScript三者是可以分离的,它们可以分别放在不同的文件中,这种组件并不常用,更多的时候使用单文件组件。不过两者的语法是相通的,后者需要引入脚手架,所以主要使用前者来讲解组件语法。


定义

组件的创建依赖于Vue.entend方法:

const vc = Vue.extend({组件对象})

调用方法时,传入一个组件对象,此时Vue.extend返回值就是一个组件对象。

在组件对象中,大部分语法和vm一致比如数据data、方法methods等。

示例:

const hello = Vue.extend({data(){ return {message: "hello Wrold!",count: 0}},methods: {add(){this.count++}},
})

以上代码定义了一个hello组件,其包含datamethods属性,但是vm不太一样的是data必须是一个函数,函数返回值是配置对象,如果在vm中,data应该写为下面这样:

data{ message: "hello Wrold!",count: 0
}

这是因为组件是可以复用的,如果直接以对象的形式写data,那么多个组件会共用一个data对象,导致组件之间数据共享。当把data写为一个函数,每次使用组件时,都会返回一个新创建的data对象,组件之间的数据就是相互独立的了。

现在的组件有数据和方法了,但是还缺少html结构,在vm中这可以通过el来指定挂载的元素,随后就可以直接在元素内部使用模板了:

<div id="root">
</div><script>new Vue({el:'#root',// ...})
</script>

但是非单文件组件不能这样做,其使用一个template配置项,传入一个字符串,在字符串内写html结构:

const hello = Vue.extend({template:`<div class="demo"><p> {{message}} </p><p> {{count}} </p><button @click="add">count++</button>	</div>`,// ...
})

这里要注意使用的是模板字符串,否则无法在一个字符串内部换行。在template的字符串内部,可以写html结构,{{}}插值语法、@click事件监听等等功能。

另外的,在template中最外层必须只有一个标签,不能同时存在多个标签同时在最外层的情况。

比如刚才的组件不能写为:

const hello = Vue.extend({template:`<p> {{message}} </p><p> {{count}} </p><button @click="add">count++</button>	`,// ...
})

此处把最外层的<div>丢掉了,导致template下同时存在三个标签,这是不允许的。


注册

现在已经定义好了一个组件,组件想要被使用,就需要被注册到vm中,分为全局注册局部注册两种形式。

  • 全局注册:
Vue.component('组件名', 组件对象)
  • 局部注册:
new Vue({components:{组件名: 组件对象}
})

全局注册的组件,可以被所有vm使用,而局部注册的组件,只有当前vm可以使用。由于大部分情况下都只有一个vm,所以基本都使用局部注册。

将刚才的hello组件注册到vm中:

<div id="root"><p>{{msg}}</p>
</div>
<script> new Vue({el:'#root',data:{msg:'我是VM'},components:{hello}})
</script>

其中components:{hello}就是在注册hello组件,不过由于组件名和对象名相同进行了缩写,原本应该写为hello:hello

组件命名时,如果组件名有多个单词,采用kebab-case命名,比如:

components:{'hello-world': hello
}

如果使用了脚手架,还可以使用驼峰命名:HelloWorld

如果现在查看浏览器的输出结果,是看不到组件的内容的:

在这里插入图片描述

注册组件时,组件还没有生效,如果想要hello组件生效,还需要进行组件标签的引入。


使用

组件的使用非常简单,当组件成功注册后,直接把组件当作一个html标签使用

<div id="root"><p>{{msg}}</p><hello></hello>
</div>

当注册完hello组件后,就可以使用<hello>这个标签,这个标签就代表了这个组件:

在这里插入图片描述

此时就可以看到组件的内容生效了。

并且组件可以复用,也就是可以使用多个<hello>标签:

<div id="root"><p>{{msg}}</p><hello></hello><hello></hello>
</div>

输出结果:

在这里插入图片描述

此处点击了count++按钮,两个组件的count值不一样了,这是因为之前的data是一个函数,两个组件使用的不是同一个data对象,数据之间相互独立。

由于组件的使用是基于html标签的,所以组件命名不要与现有标签冲突,比如说不要出现某个组件名称叫做divbody等。

以上是组件的复用,除此之外组件还可以进行嵌套:

const date = Vue.extend({template:`<div class="demo"><p> 当前时间为: {{time}} </p></div>`,data(){ return {time: "2024.11.14"}}
})const hello = Vue.extend({template:`<div class="demo"><p> {{message}} </p><p> {{count}} </p><button @click="add">count++</button>	<date></date></div>`,// ...components:{date}
})

以上代码定义了两个组件datehello,并在hello中使用components引入了组件date

其余代码和原先一致,在vm中引入了hello

在这里插入图片描述

此时嵌套的组件date作为了hello的一部分,在vm中一起展示了。


单文件组件

非单文件组件中,要把html结构定义在template,并且要以字符串的形式,这样实在是太麻烦了。单文件组件提供了更加方便的语法:

单文件组件以.vue为结尾,一个文件就是一个组件的全部内容,在一个文件内部同时编写htmlcssJavaScript内容,并且这些内容共同构成一个组件。

一个.vue基本结构如下:

<template> <!-- .html -->
</template><script> //.js
</script><style> /* .css */
</style>

其包含三个标签:

  • <template>:该组件的html结构
  • <script>:该组件的JavaScript脚本
  • <style>:该组件的css样式

比如hello组件的单文件形式:

<template> <!-- .html --><div class="demo"><p> {{message}} </p><p> {{count}} </p><button @click="add">count++</button>	</div>
</template><script> //.jsconst hello = Vue.extend({data(){ return {message: "hello Wrold!",count: 0}},methods: {add(){this.count++}}})export default hello
</script><style> /* .css */.demo{background-color: orange;}
</style>

样式不在写在template属性内部,而是写在<template>标签内部。在<style>中,为组件添加了一个背景色。在<script>中,定义了该组件的对象,并通过export暴露给外部,这样其它文件就可以导入这个组件。

其它的使用方式与非单文件组件一致,并且这种单文件组件一般结合脚手架使用,就不再讲解了。


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

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

相关文章

力扣 LeetCode 28. 找出字符串中第一个匹配项的下标(Day4:字符串)

解题思路&#xff1a; KMP算法 需要先求得最长相等前后缀&#xff0c;并记录在next数组中&#xff0c;也就是前缀表&#xff0c;前缀表是用来回退的&#xff0c;它记录了模式串与主串(文本串)不匹配的时候&#xff0c;模式串应该从哪里开始重新匹配。 next[ j - 1 ] 记录了 …

计算机网络 (1)互联网的组成

一、互联网的边缘部分 互联网的边缘部分由所有连接在互联网上的主机组成&#xff0c;这些主机又称为端系统&#xff08;end system&#xff09;。端系统可以是各种类型的计算机设备&#xff0c;如个人电脑、智能手机、网络摄像头等&#xff0c;也可以是大型计算机或服务器。端系…

智慧军营安防方案

1. 引言 智慧安防方案集成高清视频监控、智能分析与大数据管理&#xff0c;打造全方位安全防护体系。通过先进技术&#xff0c;提升预警与应急响应能力&#xff0c;确保安全无死角。 2. 视频监控技术 采用高清摄像设备与智能识别算法&#xff0c;实现全景监控与细节跟踪&#…

ABAP开发学习——ST05 ABAP SQL跟踪工具

操作步骤 第一步使用ST05之前&#xff0c;将要查的程序停留想要看的操作的前一步&#xff0c;这里想看到取数操作&#xff0c;所以停留在选择界面 第二步进入ST05 选择SQL Trace 然后激活 第三步去执行程序 第四步ST05取消激活 第五步查看操作 选完时间直接执行

AtCoder ABC378 A-D题解

比赛链接:ABC378 比较简单的一次 ABC。 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){cin>>A[1]>>A[2]>>A[3]>>A[4];sort(A1,A5);if(A[1]A[2] && A[3]A[4])cout<<2<<endl;else{if(A[1]A[2]…

Windows上安装专业版IDEA2024并激活

1、IDEA官方下载 搜索IDEA官网点击进入&#xff0c;点击Download&#xff08;目前这个激活脚本只能激活2024.1.7&#xff0c;2024.2.x的版本都不能激活&#xff0c;2024.1.7版本已上传资源&#xff09;&#xff0c;如图&#xff1a; 2、开始安装 1&#xff09;、双击下载的.…

表达式求值问题(中缀转后缀,对后缀求值)详解

目录 实验题目 理解中缀和后缀表达式 问题分析 1转化为中缀表达式 2计算后缀表达式 完整代码 运行结果 实验题目 实验题目&#xff1a;表达式求值问题。这里限定的表达式求值问题是&#xff1a; 用户输入一个包含“”、“-”、“*”、“/”、正整数和圆括号的合法数学表…

AD22怎么按照板子形状铺铜

如何按照板子形状来铺铜&#xff1f; 选择铺铜管理器 选择板外形 我这里图里VCC没画就选择VCC&#xff0c; 你选什么层&#xff0c;就勾什么层 死铜移除勾选 效果如下&#xff1a;

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

研发费用资本化的意义

1.更真实地反映企业价值&#xff1a;研发费用是企业为创造未来经济利益而进行的投资&#xff0c;通过将其资本化并作为无形资产计入资产负债表&#xff0c;可以更真实地反映企业的资产总额和长期投资价值。这有助于投资者、债权人和其他利益相关者更准确地评估企业的财务状况、…

Ubuntu24.04安装Anaconda3+Pycharm

一、引言 重装系统已经过去一段时间了&#xff0c;现在安装一下 Anaconda 和 Pycharm。 参考连接&#xff1a; Ubuntu中安装Anaconda3和Pycharm 及其环境搭建Ubuntu18.04安装Pycharm教程ubuntu系统安装Anaconda及Pycharm在移动硬盘上搭建Ubuntu24.04深度学习环境&#xff08;…

稀疏矩阵(Sparse Matrix)及其存储格式详解

稀疏矩阵&#xff08;Sparse Matrix&#xff09;是线性代数和计算机科学中的一个重要概念&#xff0c;广泛应用于科学计算、工程模拟、图像处理、机器学习等多个领域。与稠密矩阵&#xff08;Dense Matrix&#xff09;相比&#xff0c;稀疏矩阵大部分元素为零&#xff0c;仅有少…

操作系统:页表中的页表项

操作系统&#xff1a;页表中的页表项 页表是操作系统用于跟踪进程使用的虚拟地址与系统内存中相应物理地址之间映射的数据结构。 页表项&#xff08;Page Table Entry&#xff0c;PTE&#xff09;是页表中的一个条目&#xff0c;用于存储有关特定内存页的信息。每个页表项包含…

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1&#xff0c;创建证书和密钥 需要openssl环境&#xff0c;如果是Window下&#xff0c;下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境&#xff0c;此环境是在jdk环境下 本案例所使用的账号密码均为&#xff1a; ka…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于改进容积卡尔曼滤波的含光伏配电网动态状态估计》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

jenkins使用cli发行uni-app到h5

官网文档HBuilderX 文档 首先确定是否存在环境变量 正常情况cmd中执行cli 如果提示 cli 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。请先配置环境变量 Freestyle Project项目在Build Steps中增加Execute Windows batch command命令如下 d: cd D:\devsof…

FMEA 在新兴技术领域(如量子计算、人工智能芯片等)的应用挑战与机遇

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。】 摘要&#xff1a; 本文深入探讨了 FMEA&#xff08;失效模式及后果分析&#xff09;在如量子计算、人工智能芯片等新兴技术领域的应用所面临的挑战与机遇。随着科技的飞速进步&#xff0c;新兴技…

websocket身份验证

websocket身份验证 前言 上一集我们就完成了websocket初始化的任务&#xff0c;那么我们完成这个内容之后就应该完成一个任务&#xff0c;当客户端与服务端连接成功之后&#xff0c;客户端应该主动发起一个身份认证的消息。 身份认证proto 我们看一眼proto文件的内容。 我…

Spire.PDF for .NET【页面设置】演示:复制 PDF 文档中的页面

在某些情况下&#xff0c;我们需要创建 PDF 文档中现有页面的副本&#xff0c;而不是复制整个文件&#xff0c;特别是如果我们必须创建某个页面的数百份副本&#xff0c;那么逐个复制页面可能会很繁琐。本文演示了如何使用 Spire.PDF 复制 PDF 文档中的页面并一次创建多个副本的…

Vue-组件三大组成组件通信

一、学习目标 1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法 父传子 子传父 非父子通信&#xff08;扩展&#xff09; 3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09; 拆…