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.rhkb.cn/news/471233.html

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

相关文章

408模拟卷较难题(无分类)

模拟卷特别是大题还是很有难度的&#xff0c;而且有些题有错&#xff0c;还是先把真题吃透&#xff0c;后面没时间的话就不整理了。 一棵树转化为二叉树&#xff0c;那么这棵二叉树一定为右子树为空的树 计算不同种形态&#xff0c;即计算6个结点的二叉树有几种形态&#xff0c…

(六)Spark大数据开发实战:豆瓣电影数据处理与分析(scala版)

目录 一、Spark 二、数据介绍 三、Spark大数据开发实战(Scala) 1、数据文件上传HDFS 2、导入模块及数据 3、数据统计与分析 ①、计算演员参演电影数 ②、依次罗列电影番位前十的演员 ③、按照番位计算演员参演电影数 ④、求每位演员所有参演电影中的最早、最晚上映…

SpringMVC学习笔记(二)

五、Rest风格编程 &#xff08;一&#xff09;Rest风格URL规范介绍 1、什么是restful RESTful架构&#xff0c;就是目前最流行的一种互联网软件架构风格。它结构清晰、符合标准、易于理解、扩展方便&#xff0c;所以正得到越来越多网站的采用。REST这个词&#xff0c;是Roy T…

PyTorch深度学习与企业级项目实战-预训练语言模型GPT

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 13个PyTorch深度学习案例简介-CSDN博客 《PyTorch深度学习与企业级项目实战&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;宋立林)【摘要 书评 试读】- 京东图书 (jd.com) PyTorch深度学习算法与…

CTF攻防世界小白刷题自学笔记13

1.fileinclude,难度&#xff1a;1,方向&#xff1a;Web 题目来源:宜兴网信办 题目描述:无 给一下题目链接&#xff1a;攻防世界Web方向新手模式第16题。 打开一看给了很多提示&#xff0c;什么language在index.php的第九行&#xff0c;flag在flag.php中&#xff0c;但事情显…

【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题

前言 qt、qml项目经常会涉及访问MySQL数据库、网络服务器&#xff0c;并且界面打开时的初始化过程就会涉及到链接Mysql、网络服务器获取数据&#xff0c;如果网络不通&#xff0c;卡个几十秒&#xff0c;会让用户觉得非常的不爽&#xff0c;本文从技术调研的角度讲解解决此类问…

基于OpenCV的自制Python访客识别程序

这是我用Pyqt5&#xff0c;基于OpenCV做的一个Python访客识别程序&#xff0c;它具体包括如下5个功能&#xff1a; 1、选择媒体菜单&#xff0c;可以打开本地摄像头&#xff1b;如果知道rtsp地址&#xff0c;则可以直接访问局域网内的网络串流。 2、选择播放菜单&#xff0c;…

SQL集合运算

集合论是SQL语言的根基。 1 集合运算 注意事项&#xff1a; 1&#xff09;SQL能操作具有重复行的集合&#xff0c;可以通过可选项ALL来支持。 如果直接使用UNION或INTERSECT&#xff0c;结果里不会出现重复的行。如果想在结果里留下重复行&#xff0c;可以加上可选项ALL。写…

Gartner发布安全平台创新洞察:安全平台需具备的11项常见服务

安全和风险管理领导者的任务是管理多个安全供应商和复杂的基础设施堆栈。本研究提供了有关安全平台优势和风险的见解&#xff0c;并提供了为组织选择合适平台的建议。 主要发现 自适应和行为安全防御需要跨安全基础设施组件进行更多的协调&#xff0c;而目前孤立的异构供应商架…

基于海思soc的智能产品开发(两个图像处理来源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于图像&#xff0c;大家能够想到的一般就是sensor&#xff0c;也就是摄像头。其实对于图像来说&#xff0c;还有另外一个来源&#xff0c;那就是…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…

微信小程序中使用离线版阿里云矢量图标

前言 阿里矢量图库提供的在线链接服务仅供平台体验和调试使用&#xff0c;平台不承诺服务的稳定性&#xff0c;企业客户需下载字体包自行发布使用并做好备份。 1.下载图标 将阿里矢量图库的图标先下载下来 解压如下 2.转换格式 贴一个地址用于转换格式&#xff1a;Onlin…

Ubuntu 的 ROS 操作系统安装与测试

引言 机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;是一个用于开发机器人应用的开源框架&#xff0c;它提供了一系列功能丰富的库和工具&#xff0c;能够帮助开发者构建和控制机器人。 当前&#xff0c;ROS1的最新版本为Noetic Ninjemys&#xff0c;专为…

封装一个省市区的筛选组件

筛选功能&#xff1a;只能单选&#xff08;如需多选需要添加show-checkbox多选框属性&#xff09;&#xff0c;选中省传递省的ID&#xff0c;选中市传递省、市的ID&#xff0c; 选中区传递省市区的ID 父组件&#xff1a; <el-form-item><div style"width: 240px;…

python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态

import argparse # 用于解析命令行参数 from socket import * # 导入 socket 库的所有内容&#xff0c;用于网络通信 from threading import * # 导入 threading 库的所有内容&#xff0c;用于多线程操作 # 创建一个信号量&#xff0c;初始值为 1&#xff0c;用于线程同步&…

OceanStor Pacific系列 8.1.0 功能架构

功能架构 华为OceanStor Pacific系列提供基于三层的分布式存储架构&#xff0c;融合分布式文件、对象、大数据和块多个服务形态&#xff0c;支持文件、对象、大数据服务部署在一个集群&#xff0c;并统一管理。 华为OceanStor Pacific系列整体功能架构由存储接口层、存储服务…

Flink1.19编译并Standalone模式本地运行

1.首先下载源码 2.本地运行 新建local_conf和local_lib文件夹&#xff0c;并且将编译后的文件放入对应的目录 2.1 启动前参数配置 2.1.2 StandaloneSessionClusterEntrypoint启动参数修改 2.1.3 TaskManagerRunner启动参数修改 和StandaloneSessionClusterEntrypoint一样修改…

高效稳定!新加坡服务器托管方案助力企业全球化布局

在全球化的商业环境中&#xff0c;企业对于高效、稳定的服务器托管方案的需求日益迫切。作为亚洲的服务器托管中心&#xff0c;新加坡凭借其独特的地理位置、稳定的政治环境、先进的科技设施以及开放的市场政策&#xff0c;为企业提供了理想的服务器托管解决方案&#xff0c;助…

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象&#xff0c;是用于传输数据的对象&#xff0c;通常在服务层与表现层之间传递数据&#xff0c;DTO 通常用于…

StructuredStreaming (一)

一、sparkStreaming的不足 1.基于微批,延迟高不能做到真正的实时 2.DStream基于RDD,不直接支持SQL 3.流批处理的API应用层不统一,(流用的DStream-底层是RDD,批用的DF/DS/RDD) 4.不支持EventTime事件时间&#xff08;一般流处理都会有两个时间&#xff1a;事件发生的事件&am…