【Vue 快速入门系列】组件的基本使用

news2024/11/19 21:30:21

文章目录

    • 一、组件的概念
    • 二、非单文件组件
    • 三、单文件组件
      • 1.main.js
      • 2.App.vue
      • 3.school.vue
      • 4.student.vue
      • 5.index.html
    • 四、内容补充及原理剖析
      • 1.组件命名注意点
      • 2.组件嵌套内置关系
      • 3.重要的内置关系

一、组件的概念

组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树
在这里插入图片描述
将一个页面拆分成一个个小组件更有利于我们对页面进行维护。熟悉组件之后我们可以使用vue做出更加科学更加完美的页面。在vue中可以按照一个文件中组件的个数划分为单文件组件与非单文件组件(一个文件有多个组件),我们在日常工作中最常用的还是单文件组件,将具有某功能的组件放进一个文件,可以使我们的程序更好的实现“高内聚,低耦合”


在使用组件的时候我们一般按照以下步骤:

  • 1.定义组件(创建组件实例)
  • 2.注册组件
    • 全局组件(component(‘组件名’,组件实例))
    • 局部组件(components:{组件实例…})
  • 3.使用组件(使用组件标签)
    • <组件名></组件名> 双标签写法
    • <组件名/> 单标签写法

具体应如何使用呢请往下看!

二、非单文件组件

将会结合代码示例进行讲解:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>组件的基本使用</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <div id="demo">
        <!-- 组件的写法有两种
             双标签法
             单标签法()
        -->
        
        <!-- 
        第三步:使用组件,这两个组件均是我们创建好的组件,使用方法如下
        -->
        <school></school>
        <student></student>
    </div>
    <div id="demo1">
        <school></school>
        <student></student>
    </div>
  </body>
  <script>
  	  //屏蔽掉vue生产提示
      Vue.config.productionTip = false;
      //-----------------第一步:定义组件------------------------//
      //创建一个组件实例school,并且命名为school
        const school = Vue.extend({
            name:"school",
            //指定一个模板,将来会使用这个模板挂载到父节点
            template: `
            <div>
                <h2>学校名称:{{name}}</h2>
                <h2>学校地址:{{address}}</h2>
                <button @click="showINfo">点击我提示信息</button>
            </div>
            `,
            //组件实例对象的属性
            data(){
                return {
                    name:"南阳理工学院",
                    address:"南阳市宛城区长江路80号"
                }
            },
            //组件实例的方法
            methods: {
                showINfo() {
                    alert('欢迎来到'+this.name+"这里的位置是"+this.address)
                }
            },
        })
        //定义的第二个组件student
        const student = Vue.extend({
        	//组件的模板
            template:`
            <div>
                <h2>学生名称:{{name}}</h2>
                <h2>学生年零:{{age}}</h2>
                <button @click="showINfo">点击我提示信息</button>
            </div>
            `,
            //组件的属性
            data(){
                return {
                    name:"张三",
                    age:18
                }
            },
            //组件的方法
            methods:{
                showINfo(){
                    alert('我叫'+this.name+"我今年"+this.age+"岁了")
                }
            }
            
        });
        //-----------------第二步:注册组件------------------------//
        // 标签的全局注册
        Vue.component("school",school)
        Vue.component("student",student)
        // 局部注册法(局部注册的标签在其他vue对象绑定的模板中不能使用)
        new Vue({
            el:"#demo",
            components:{
                school,
                student
            }
        })
        new Vue({
            el:"#demo1",
            components:{
            }
        })
 </script>
</html>

注意:

  • 该不该有el属性:
    通过观察我们发现局部注册组件时有el属性,而定义变量接收的方式没有el属性,这是因为定义为变量的组件有复用性,不可以确定以后为谁服务。而局部注册的组件以后肯定为本组件服务,所以一个有el属性,一个没有,el属性的作用就是将该组件挂载到包含指定选择器的dom下。

  • 从前vue对象的属性data为对象现在为什么成了函数?
    data属性为对象时相当于好几个组件共享了一个对象,组件内使用data属性的时候要写成函数的形式(如果一个组件被使用n次需创建n个对象,写对象的话没有复用性,会出现多次使用该组件该组件属性一样的情况)

  • 这里的复用性是指什么?
    复用性不是代码复用性,是功能复用性(不是cv而是让组件像类一样,可以以他为模板创建很多对象)

  • 其余注意项:
    Vue.extend()可以省略
    可以在组件中导入模板模板可以使用组件data中的属性
    组件中还可以指定name,指定后在Vue调试工具中将会有所体现

三、单文件组件

在上面也说过单文件组件的概念,就是一个文件内只有一个组件,并且文件名通常与组件名相照应。
单文件组件应包含以下几项:

  • 文件包含三部分(代码模板,js代码,style代码)
  • 一个Vue文件仅仅有一个组件
  • 应包含一个App.vue组件,汇总并管理其他的所有组件
  • main.js文件为其入口
  • index为其主页面

可以通过以下一个实例来了解单文件组件:
工作流程是通过main.js管理App组件,App组件去管理Student与School组件干活。然后将渲染出的页面挂载到index.html页面上,具体的功能都在代码注释上。

1.main.js

import App from "./App.vue"
// 直接在这个文件创建实例对象并将组件注册到对象内
new Vue({
	//未来渲染出的页面放在id为root的标签上
    el:"#root",
    data(){
        return{
            tag:0
        }
    },
    //注册app组件
    components:{App}
})

2.App.vue

//模板,相当于vue Component中的template属性中的东西
<template>
    <div class="demo">
    <School></School>
    <Student></Student>
    </div>
</template>

<script>
import School from "./School.vue" 
import Student from "./Student.vue" 
export default {
    name:"App",
    data(){
        return{
            name:"张三",
            age:18
        }
    },
    components:{
        School,
        Student
    }
}
</script>

<style>
    .data{
        background-color: yellow;
    }
</style>

3.school.vue

//被管理的组件
<template>
  <div class="demo">
      <div>学校名称:{{name}}</div>
      <div>学校地址:{{address}}</div>
  </div>
</template>

<script>
export default {
    name:"School",
    data(){
        return {
            name:"南阳理学院",
            address:"南阳市宛城区长江路80号"
        }
    }
}
</script>

<style>
 .demo{
     background-color:blue;
 }
</style>

4.student.vue

//被管理的组件
<template>
    <div class="demo">
      <div>学生名称:{{name}}</div>
      <div>学校年龄:{{age}}</div>
  </div>
</template>

<script>
export default {
    name:"Student",
    data(){
        return {
            name:"张三",
            age:18
        }
    }
}
</script>

<style>
    .demo{
        background-color: grey;
    }
</style>

5.index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="root">
        <App></App>
    </div>
    //这里将两个js放下面是因为vue渲染出的页面进行挂载时需要获取到相应的dom元素
<script   src="./vue.js"></script>
<script  src="./vue/main.js"></script>
</body>
</html>

直接打开index.html页面展示出的效果会抛出以下错误。不过很正常
Uncaught SyntaxError: Cannot use import statement outside a module:原因是main.js中的import App from "./App"浏览器不支持,解决方法就是使用vue脚手架运行代码或者使用webpack。常规的vue代码就是这样写的。

四、内容补充及原理剖析

1.组件命名注意点

  • 1.关于组件名:

    • 一个单词组成:
      第一种写法(首字母小写):school
      第二种写法(首字母大写):School
    • 多个单词组成:
      第一种写法(kebab-case命名):my-school
      第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
    • 备注:
      (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
      (2).可以使用name配置项指定组件在开发者工具中呈现的名字。
  • 2.关于组件标签:
    第一种写法:<school></school>
    第二种写法:<school/>
    备注:不用使用脚手架时,会导致后续组件不能渲染。

  • 3.一个简写方式:
    const school = Vue.extend(options) 可简写为:const school = options

2.组件嵌套内置关系

通过嵌套实现main.js管理app组件,app组件管理其余功能性组件,组件可以嵌套在另一个组件之中,并让其管理。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>组件的嵌套</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
        <!-- 在使用组件嵌套的时候一定要注意,使用到的子组件要放在前面 -->
        <!-- 最终形成各个层级,每一级都有归属直至app组件 -->
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		//定义student组件
		const student = Vue.extend({
			name:'student',
			template:`
				<div>
					<h2>学生姓名:{{name}}</h2>	
					<h2>学生年龄:{{age}}</h2>	
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					age:18
				}
			}
		})
		
		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<student></student>
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					address:'北京'
				}
			},
			//注册组件(局部)
			components:{
				student
			}
		})

		//定义hello组件
		const hello = Vue.extend({
			template:`<h1>{{msg}}</h1>`,
			data(){
				return {
					msg:'欢迎来到尚硅谷学习!'
				}
			}
		})
		
		//定义app组件(管理school与student组件)
		const app = Vue.extend({
			template:`
				<div>	
					<hello></hello>
					<school></school>
				</div>
			`,
			components:{
				school,
				hello
			}
		})

		//创建vm
		new Vue({
			template:'<app></app>',
			el:'#root',
			//注册组件(局部)
			components:{app}
		})
	</script>
</html>

3.重要的内置关系

使用Vue的时候,可以注册很多个Component。
1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
2.为什么要有这个关系?
可以让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
关系图如下:
在这里插入图片描述
那么为什么要有这层内置关系?这种关系可以干什么?
如下图,是main.js中的一部分代码,这部分代码将插件绑定到Vue对象上,以便于在组件内部使用this调用。
组件跟插件有着不同的定义。插件一般是.js文件,而组件是vue文件。
在使用的时候也有明显的区别,一个使用use,一个使用components
在这里插入图片描述


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

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

相关文章

Java日期与时间

时间与日期DateSimpleDateFormatCalendarJDK8新增日期类概述LocalDate、LocalTime、LocalDateTimeInstant时间戳DateTimeFormatterDuration/PeriodChronoUnitDate Date类概述 Date类的对象在Java中代表的是当前所在系统的此刻日期时间。 Date的构造器 Date的常用方法 Date类…

2022最新 MySQL事务面试题合集

小熊学Java网站&#xff1a;https://javaxiaobear.gitee.io/&#xff0c;每周持续更新干货&#xff0c;建议收藏&#xff01; 61、什么是数据库事务&#xff1f;事务的特性是什么&#xff1f; 事务&#xff1a; 是数据库操作的最小工作单元&#xff0c;是作为单个逻辑工作单元执…

微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.2 条件过滤

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构25 黑马旅游案例25.2 条件过滤25.2.1 直接开干25 黑马旅游案例 25.2 条件…

怎么把磁盘合并成一个?两个硬盘分区合并,如何硬盘分区合并

怎么把磁盘合并成一个&#xff1f;有时候电脑分区有点多&#xff0c;想要给硬盘的分区合并不知道如何操作&#xff0c;如何在不影响系统正常使用的情况下合并分区呢&#xff1f;本篇文章将详细解答这个问题。 之前有个客户提出这样一个问题&#xff0c;那就是在安装完windows10…

【CSS3】text-shadow/text-overflow,边框图片,透明度,小米轮播图子菜单另一种实现

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录text-shadowtext-overflow边框图片border-image-sourceborder-image-sliceborder-image-widthbor…

数据智仓功能介绍(一)

数据智仓英文名称为Smart Data Warehouse&#xff0c;可简写为SDW。数据智仓是JVS整体企业数字化解决方案的核心能力&#xff0c;与JVS的低代码开发套件平级。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供基于数据的决策支持&#xff08;Decision Supp…

世界杯论文

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿…

cockpit管理控制台-尚文网络xUP楠哥

~~全文共1499字&#xff0c;阅读需约5分钟。 进Q群11372462&#xff0c;领取专属报名福利&#xff0c;包含云计算学习路线图代表性实战训练大厂云计算面试题资料! Cockpit 是红帽开发的web方式的服务管理工具&#xff0c;从Linux7版本开始就有了&#xff0c;其优点可以管理很多…

密码学-2-RSA签名验签方案

密码学-1-数字签名体制密码学-2-RSA签名验签方案 目录 1 签名验签 2 RSA签名算法 2.1 RSA生成签名 2.2 RSA验证签名 2.3 RSA参数的选定 2.3.1 公私钥 2.3.2 E&#xff0c;N&#xff0c;D 2.4 RSA签名应用场景 2.4.1 签名 2.4.2 验签 1 签名验签 重温上节所述的签名流…

给tabbar 中间位置添加一个自定义按钮 (Swift 代码)

1.创建一个继承自UITabbarViewController的控制器&#xff0c;在这个控制器中写如下代码 override func viewDidLoad() {super.viewDidLoad()//这个按钮就是中间添加的按钮let middleBtn UIButton(type: .custom)middleBtn.frame CGRect(x: kScreenWidth/5*2 , y: -10, widt…

如何提高外贸询单转化率

如何提高外贸询盘的转化率&#xff1f;米贸搜整理了以下方法&#xff0c;希望对你有所帮助: 一&#xff0c;如何有效地对网络客户进行分类 在网上交易的过程中&#xff0c;有各种各样的客户。所以要对所有客户进行分类管理&#xff0c;提高效率&#xff0c;增加交易量。 有外…

etcd实现大规模服务治理应用实战

导读&#xff1a;服务治理目前越来越被企业建设所重视&#xff0c;特别现在云原生&#xff0c;微服务等各种技术被更多的企业所应用&#xff0c;本文内容是百度小程序团队基于大模型服务治理实战经验的一些总结&#xff0c;同时结合当前较火的分布式开源kv产品etcd&#xff0c;…

神同步的智能运维体系和世界杯442阵型

世界杯如火如荼地踢&#xff0c;动如脱兔的运动员在屏幕前挥洒汗水、静如处子的程序员们稳坐屏幕前敲键盘。 可是谁说IT人除了盯着屏幕大呼小叫&#xff0c;就没法参与世界杯了呢&#xff1f;不管做的是什么产品什么领域&#xff0c;冥冥之中总有一根红线跟世界杯连接起来。 …

华为机试 - 新学校选址

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 为了解新学期学生暴涨的问题,小乐村要建立所新学校&#xff0c; 考虑到学生上学安全问题,需要所有学生家到学校的距离最短。 假设学校和所有学生家都走在一条直线之上,请问学校建立在什么位置&#xf…

一文详细理解Linux的一些环境基础开发工具使用(上)

前言&#xff1a; 本文章让大家理解Linux一些基础开发工具的使用&#xff0c;例如Linux如何下载一些软件&#xff0c;Linux如何进行编译代码&#xff0c;Linux怎么上传远程仓库等等&#xff0c;其实Linux工具本质也是命令&#xff01;&#xff01; &#x1f49e; &#x1f49e;…

L1-033 出生年(java)-天梯赛

文章目录&#x1f3c5;前言&#xff1a;L1-033 出生年&#xff08;java&#xff09;-天梯赛&#x1f3af;题解&#xff1a;&#x1f412;结果&#xff1a;&#x1f3c5;前言&#xff1a; 代码含详细注释及解题思路。若有不理解的地方&#xff0c;欢迎大家探讨交流&#xff0c;…

Java开发手册(黄山版)

这本书值得反复看、也可作为随手翻阅字典一、编程规约 (一) 命名风格 【强制】纯拼音命名方式也要避免采用。【强制】常量命名应该全部大写&#xff0c;单词间用下划线隔开&#xff0c;力求语义表达完整清楚&#xff0c;不要嫌名字长【强制】POJO 类中的任何布尔类型的变量&…

CMake中add_custom_command的使用

CMake中的add_custom_command命令用于将自定义构建规则添加到生成的构建系统(Add a custom build rule to the generated build system)&#xff0c;其格式如下&#xff1a; add_custom_command(OUTPUT output1 [output2 ...]COMMAND command1 [ARGS] [args1...][COMMAND comm…

【多线程(五)】volatile关键字、原子性问题、AtomicInteger内存分析与源码分析、悲观锁和乐观锁

文章目录5.原子性5.1 volatile-问题2.2 volatile解决5.3 synchronized 解决5.4 原子性5.5 volatile关键字不能保证原子性5.6 原子性 AtomicInteger5.7 AtomicInteger-内存解析5.8 AtomicInteger-源码解析5.9 悲观锁和乐观锁小结5.原子性 5.1 volatile-问题 代码分析 package…

五道LeetCode《中等难度》的单链表题

五道单链表中等难度题型1. 剑指 Offer II 021. 删除链表的倒数第 n 个结点第一种解法&#xff08;单指针&#xff09;&#xff1a;第二种解法(栈)&#xff1a;第三种解法&#xff08;双指针&#xff09;&#xff1a;2. 删除排序链表中的重复元素 II&#xff08;重点&#xff09…