第 2 章:Vue 组件化编程

news/2025/2/7 16:41:18/

目录

模块与组件、模块化与组件化

模块

组件

模块化

组件化

非单文件组件

小结

组件的几个注意点

组件的嵌套

VueComponent构造函数

小结

一个重要的内置关系

小结

 单文件组件

一个.vue 文件的组成(3 个部分)

1. 模板页面

2. JS 模块对象

3. 样式

基本使用


模块与组件、模块化与组件化

模块

1. 理解: 向外提供特定功能的 js 程序, 一般就是一个 js 文件
2. 为什么: js 文件很多很复杂
3. 作用: 复用 js, 简化 js 的编写, 提高 js 运行效率

组件

1. 理解: 用来实现局部(特定)功能效果的代码集合(html/css/js/image…..)
2. 为什么: 一个界面的功能很复杂
3. 作用: 复用编码, 简化项目编码, 提高运行效率

模块化

当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用。

组件化

当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用,。

非单文件组件

1. 模板编写没有提示
2. 没有构建过程, 无法将 ES6 转换成 ES5
3. 不支持组件的 CSS
4. 真正开发中几乎不用
基本使用代码:
<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>基本使用</title><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备好一个容器--><div id="root"><hello></hello><hr><h1>{{msg}}</h1><hr><!-- 第三步:编写组件标签 --><school></school><hr><!-- 第三步:编写组件标签 --><student></student></div><div id="root2"><hello></hello></div></body><script type="text/javascript">Vue.config.productionTip = false//第一步:创建school组件const school = Vue.extend({template:`<div class="demo"><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2><button @click="showName">点我提示学校名</button>	</div>`,// el:'#root', //组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。data(){return {schoolName:'尚硅谷',address:'北京昌平'}},methods: {showName(){alert(this.schoolName)}},})//第一步:创建student组件const student = Vue.extend({template:`<div><h2>学生姓名:{{studentName}}</h2><h2>学生年龄:{{age}}</h2></div>`,data(){return {studentName:'张三',age:18}}})//第一步:创建hello组件const hello = Vue.extend({template:`<div>	<h2>你好啊!{{name}}</h2></div>`,data(){return {name:'Tom'}}})//第二步:全局注册组件Vue.component('hello',hello)//创建vmnew Vue({el:'#root',data:{msg:'你好啊!'},//第二步:注册组件(局部注册)components:{school,student}})new Vue({el:'#root2',})</script>
</html>

小结

Vue中使用组件的三大步骤:

 一、定义组件(创建组件)

 二、注册组件

 三、使用组件(写组件标签)

 一、如何定义一个组件?

 使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;

区别如下:

1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。

备注:使用template可以配置组件结构。

二、如何注册组件?

1.局部注册:靠new Vue的时候传入components选项

2.全局注册:靠Vue.component('组件名',组件)

三、编写组件标签:

 <school></school>

组件的几个注意点

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>几个注意点</title><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备好一个容器--><div id="root"><h1>{{msg}}</h1><school></school></div></body><script type="text/javascript">Vue.config.productionTip = false//定义组件const s = Vue.extend({name:'atguigu',template:`<div><h2>学校名称:{{name}}</h2>	<h2>学校地址:{{address}}</h2>	</div>`,data(){return {name:'尚硅谷',address:'北京'}}})new Vue({el:'#root',data:{msg:'欢迎学习Vue!'},components:{school:s}})</script>
</html>

 1.关于组件名:

一个单词组成:

第一种写法(首字母小写):school

 第二种写法(首字母大写):School

多个单词组成:

 第一种写法(kebab-case命名):my-school

 第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)

  备注:

(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。

(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

2.关于组件标签:

第一种写法:<school></school>

 第二种写法:<school/>

 备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。

3.一个简写方式:

 const school = Vue.extend(options) 可简写为:const school = options

组件的嵌套

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>组件的嵌套</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备好一个容器--><div id="root"><app></app></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组件const app = Vue.extend({template:`<div>	<hello></hello><school></school></div>`,components:{school,hello}})//创建vmnew Vue({el:'#root',//注册组件(局部)components:{app}})</script>
</html>

VueComponent构造函数

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>VueComponent</title><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备好一个容器--><div id="root"><school></school><hello></hello></div></body><script type="text/javascript">Vue.config.productionTip = false//定义school组件const school = Vue.extend({name:'school',template:`<div><h2>学校名称:{{name}}</h2>	<h2>学校地址:{{address}}</h2>	<button @click="showName">点我提示学校名</button></div>`,data(){return {name:'尚硅谷',address:'北京'}},methods: {showName(){console.log('showName',this)}},})const test = Vue.extend({template:`<span>atguigu</span>`})//定义hello组件const hello = Vue.extend({template:`<div><h2>{{msg}}</h2><test></test>	</div>`,data(){return {msg:'你好啊!'}},components:{test}})// console.log('@',school)// console.log('#',hello)//创建vmconst vm = new Vue({el:'#root',components:{school,hello}})</script>
</html>

小结

关于VueComponent:

1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。

3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

 4.关于this指向:

 (1).组件配置中:

data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。

 (2).new Vue(options)配置中:

data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

 5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。

 Vue的实例对象,以后简称vm。

一个重要的内置关系

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>一个重要的内置关系</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。--><!-- 准备好一个容器--><div id="root"><school></school></div></body><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。Vue.prototype.x = 99//定义school组件const school = Vue.extend({name:'school',template:`<div><h2>学校名称:{{name}}</h2>	<h2>学校地址:{{address}}</h2>	<button @click="showX">点我输出x</button></div>`,data(){return {name:'尚硅谷',address:'北京'}},methods: {showX(){console.log(this.x)}},})//创建一个vmconst vm = new Vue({el:'#root',data:{msg:'你好'},components:{school}})//定义一个构造函数/* function Demo(){this.a = 1this.b = 2}//创建一个Demo的实例对象const d = new Demo()console.log(Demo.prototype) //显示原型属性console.log(d.__proto__) //隐式原型属性console.log(Demo.prototype === d.__proto__)//程序员通过显示原型属性操作原型对象,追加一个x属性,值为99Demo.prototype.x = 99console.log('@',d) */</script>
</html>

小结

1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype

2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。

 单文件组件

一个.vue 文件的组成(3 个部分)

1. 模板页面

<template>
页面模板
</template>

2. JS 模块对象

<script>
export default {
data() {return {}},
methods: {},
computed: {},
components: {}
}
</script>

3. 样式

<style>
样式定义
</style>

基本使用

1. 引入组件
2. 映射成标签
3. 使用组件标签

看“19_单文件组件”代码


http://www.ppmy.cn/news/100393.html

相关文章

msvcp140.dll丢失怎么办?msvcp140.dll重新安装的解决方法

msvcp140.dll是微软编译器系统中的一个动态链接库文件&#xff0c;它存储了许多的代码和数据&#xff0c;能帮助计算机程序正常运行。当系统中出现了msvcp140.dll丢失的情况时&#xff0c;则会出现程序无法正常运行的错误。这篇文章将为大家介绍如何解决msvcp140.dll丢失的问题…

任务系统(一)

游戏转播&#xff0c;视频压胜&#xff0c;视频为其他世界&#xff08;有版号的游戏、无版号的游戏&#xff09;玩家参与的PVE玩法&#xff0c;变为己方游戏PVE玩法&#xff0c;获得技能奖励。 解释&#xff1a; 这是一个游戏内的任务系统&#xff0c;由以下几部分组成&#…

Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon进行读码识别(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon进行读码识别&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像数据联合Halcon进行读码的技术背景Baumer工业相机使用BGAPISDK将图像数据转换为ImageSource方式1.引用合适的类文件2.使用BGAPISDK联合Halcon进…

Nginx常用操作说明

Nginx常用操作说明 介绍Nginx概念深入浅出Nginx环境搭建Nginx反向代理-负载均衡Nginx动静分离Nginx动静分离先在部署Nginx的机器&#xff0c;Nginx目录下创建一个目录static_resources将项目中所有的静态资源全部拷贝到该目录下&#xff0c;而后将项目中的静态资源移除重新打包…

雅思|对话准备笔记(长期主义)

首先有3个Part ① Talk about yourself and the monitor himself/herself ② Monologue ③ Discussion about a topic 1.很多人说话喜欢习惯性加个AND。。。。然后就发现根本没啥好说的 就尬在那里或者开始兜圈子了。 这里教大家几句话能自然结束自己想说的话。不止雅思考试…

升级Springboot2.7.11之后内嵌tomcat启动成功, 但访问任何接口都是404

背景 最近项目在升级JDK17, 但原先低版本Springboot不能识别jdk17编译的字节码, 为了能够使用JDK17的语法, 因此对SpringBoot也做了升级, 直接升级到了SpringBoot 2.7.11版本. 对一些变更修改升级完成后, 本地启动服务运行, 一切正常!!! 于是发布到公司的容器环境运行, 发布平…

c++—函数式编程(lambda、函数对象、函数包装器、函数适配器)

1. lambda表达式 &#xff08;1&#xff09;本质&#xff1a;实际是匿名函数&#xff0c;能够捕获一定范围的变量&#xff0c;与普通函数不同&#xff0c;可以在函数内部定义&#xff1b; &#xff08;2&#xff09;作用&#xff1a;①简化程序结构&#xff0c;因为优化了函数命…

LBM-BGK计算泊肃叶流动

LBM在计算泊肃叶流动时&#xff0c;需要添加外力项&#xff0c;这部分网上没什么资料&#xff0c;仅有的资料也写的模糊不清&#xff0c;这里点名批评这个知乎博文。 有些地方字母都对不上。。。 本站上也有一篇博文&#xff0c;写的也比较一般&#xff0c;但是代码是多松弛MR…