十四天学会Vue——Vue 组件化编程(理论+实战)(第四天)

二、 Vue组件化编程

2.1 组件化模式与传统方式编写应用做对比:

传统方式编写应用

依赖关系混乱,不好维护:例如:比如需要引入js1,js2,js3,但是js3需要用到js1、2的方法,所以js1、2要先引入,而js2的使用需要用到js1中的方法,也就是js1需要在js2前面引用,三个我们还能分清先后顺序,可是多了就会混乱。
2.代码复用率不高
两个html,相同的底部和顶部结构,先创建html1,在创建html2时,是复制了html1的,不属于代码复用;此时,如果将相同结构包装在同一段html结构中,用innerHTML来实现代码复用,这一块我也不太明白,死记硬背吧,就是封装相同的也不好用!
请添加图片描述

使用组件化方式优势:

在这里插入图片描述
在这里插入图片描述
模块 庞大js 模块指js模块
模块化 a.js b,js 庞大js给拆了 按照模块化的标准拆开
组件 :不同的功能点不同的组件

2.2 非单文件组件

小tips 使用函数式和对象式改变数据的方法 :
作用:通过分析函数式和对象式的区别,才能知道组件中创建组件时里面的data数据使用函数式的原因了。同一个data数据,但是调用时有不同的实例 互相不会干扰

 // 使用对象式和函数式的区别// let data = {//     a: 1,//     b: 2// }function data () {return {a: 1,b: 2}}// 使用对象式一变都变 根据栈堆存放// const x1 = data// const x2 = data// 当你使用函数来返回对象时,每次调用该函数都会创建一个新的对象实例。即使这些对象具有相同的结构和初始值,//它们也是不同的对象,存储在内存的不同位置。因此,修改一个对象不会影响其他通过该函数创建的对象。const x1 = data()const x2 = data()

> > 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>

下面这段代码主要是讲述组件标签三步骤,以及创建局部组件和全局组件。主要式在注册那一块的差别!

 <!--准备好一个容器 --><div id="root"><h1>{{msg}}</h1><hr><!-- 第三步:编写组件标签 --><school></school><hr><!-- 第三步:编写组件标签 --><student></student><!-- 实现复用 并且因为data函数实现改变数据互不干扰--><school></school><student></student></div><!-- 第二个容器使用第一个容器的组件 --><div id="root2"><school></school>组件标签<hello></hello></div><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。// 第一步:创建school组件const school = Vue.extend({// el: '#root',//组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器template: `<div><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2><button @click='showName'>点我提示学校名</button></div>`,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)//第二步:注册组件(局部注册)new Vue({el: '#root',data: {msg: '你好啊'},components: {school,student}})new Vue({el: '#root2',components: {school}})// // 使用对象式和函数式的区别// // let data = {// //     a: 1,// //     b: 2// // }// function data () {//     return {//         a: 1,//         b: 2//     }// }// // 使用对象式一变都变  根据栈堆存放// // const x1 = data// // const x2 = data// // 当你使用函数来返回对象时,每次调用该函数都会创建一个新的对象实例。即使这些对象具有相同的结构和初始值,//它们也是不同的对象,存储在内存的不同位置。因此,修改一个对象不会影响其他通过该函数创建的对象。// const x1 = data()// const x2 = data()</script>

几个注意点

 <!--准备好一个容器 --><div id="root"><h2>{{msg}}</h2><!-- 双标签 --><!-- <school></school> --><!-- <School></School>  --><!-- <my-school></my-school> --><!-- <MySchool></MySchool> --><!-- 单标签 自闭合 但是写多个只展示一个 所以建议在脚手架中适合用--><school /><school /><school /></div><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。//定义组件const s = Vue.extend({// 也可以组件注册为一个名字 Vue开发工具展示的一个名字  也就是给Vue开发工具那一块特意起了一个名字name: 'atguigu',template: `<div><h2>学校名称:{{name}}</h2>	<h2>学校地址:{{address}}</h2>	</div>`,data () {return {name: '尚硅谷',address: '北京'}}})// // 使用extend定义组件简写// const s = {//     // 也可以组件注册为一个名字 Vue开发工具展示的一个名字  也就是给Vue开发工具那一块特意起了一个名字//     name: 'atguigu',//     template: `// 		<div>// 			<h2>学校名称:{{name}}</h2>	// 			<h2>学校地址:{{address}}</h2>	// 		</div>// 	`,//     data () {//         return {//             name: '尚硅谷',//             address: '北京'//         }//     }// }new Vue({el: '#root',data: {msg: '欢迎学习Vue!'},components: {// 第一种写法(首字母小写):school  但是Vue开发工具会默认转化为首字母大写school: s// 组件名字跟组件标签要相同// School: s// 'my-school': s// 在脚手架中才可以接收大驼峰命名// MySchool: s}})</script>

总结:

几个注意点: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

一人之下 万人之上组件app

补充知识:在模板容器中没有写代码的原理 根据生命周期原理图,给换成内部模板了
在这里插入图片描述

 <!--准备好一个容器 --><div id="root"></div><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。// 定义school的子组件studentconst 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组件  相当于所有组建的管理者 也就是vm委派给app  让app管理所有组件const app = Vue.extend({template: `<div>	<hello></hello><school></school></div>`,components: {school,hello}})//创建vmnew Vue({template: `<app></app>`,el: '#root',//注册组件(局部)components: {app}})</script>

VueComponent

总结来说:就是VueComponent就是类比于Vue,所以有实例对象vc 在组件中this指向VueComponent实例对象,也就是组件
下面案例中涉及到组件嵌套

总结

关于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。
  <!--准备好一个容器 --><div id="root"><school></school><hello></hello></div><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。//定义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 () {// 组件中的this指向VueComponent,并且里面有Vue中的很多相似数据,进行了数据代理console.log('showName', this)}}})const test = Vue.extend({template: `<span>哈哈哈</span>`})// 定义hello组件const hello = Vue.extend({template: `<div><h2>{{msg}}</h2><test></test></div>`,data () {return {msg: '你好啊'}}, components: { test }})// 对应的VueComponent不是同一个// school.a = 100// console.log('@', school.a)// console.log('#', hello.a)// console.log('@', school)// console.log('#', hello)const vm = new Vue({el: '#root',components: {school, hello}});</script>

补充知识:上文提到望函数中添加属性,直接函数点属性名即可,因为函数在某种意义上也是对象。

 <SCRIPT>function aa () {console.log('哈哈哈')}aa.b = 100// 函数本身也是一个对象console.log(aa.b);</SCRIPT>

一个重要的内置关系

1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
<div id="root"><!-- 相当于new Component() --><school></school></div><script>Vue.prototype.x = 99//定义school组件const school = Vue.extend({template: `<div><h2>学校名称:{{name}}</h2>	<h2>学校地址:{{address}}</h2>	<button @click='showX'>点我发现我能get到Vue原型对象中的x</button></div>`,data () {return {name: '尚硅谷',address: '北京'}}, methods: {showX () {console.log(this.x)}}})//创建一个vmconst vm = new Vue({el: '#root',data: {msg: '你好'}, components: {school}})// 不要写VueComponent  死记硬背:我们通过调用extend函数返回值VueComponent并且赋值给school  //这里按理说应该是true  但是不知道怎么回事是falseconsole.log(school.prototype._proto_ === Vue.prototype)/*  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 = 99// console.log('@', d._proto_.x)// 缩写console.log, ('@', d.x)// 表示关于demo函数的实例对象console.log(d); */</script>

组件实例对象小型vm 他的data必须写成函数式,也不能配置el

2.3 单文件组件

首先是xxx.vue,不能直接展示在浏览器,需要编译成js文件
方法1:使用webpack
方法2:使用脚手架
命名类似于组件名称 推荐首字母大写或者大驼峰命名
安装插件 识别vue文件
在这里插入图片描述

vue文件的编写依据组件的定义:实现应用中局部功能的代码和资源的集合,包括html结构、css样式、js交互

书写顺序
在这里插入图片描述
在②中通过如下将组件引入:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
现成代码见资源

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

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

相关文章

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求&#xff0c;Epson使用独家QMEMS*2技术所生产的石英振荡器&#xff0c;与其精巧的半导体技术所制造的射频传输器电路&#xff0c;开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm&#xff0c;更使其封装尺寸达仅3.2 mm x 2.5 mm&#xff0c;为客户大…

C#中接口的显式实现与隐式实现及其相关应用案例

C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候&#xff0c;框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”&#xff0c;增加实现接口的类访问方法的“成本”。 接口的显式实现和隐式实现&#xff1a; 先定义一个接口&#xff0c;接口…

dolphinscheduler docker部署海豚mysql版本,docker重新封装正在运行服务为镜像

1.官方文档&#xff1a; https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/guide/installation/standalone#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93 2.github: dolphinscheduler/docs/docs/zh/guide/howto/datasource-setting.md at 3.2.1-release apache/do…

对于vsc中的vue命令 vue.json

打开vsc 然后在左下角有一个设置 2.点击用户代码片段 3.输入 vue.json回车 将此代码粘贴 &#xff08;我的不一定都适合&#xff09; { "vue2 template": { "prefix": "v2", "body": [ "<template>", " <…

Ubuntu中PDF阅读器和编辑器

1. 福昕PDF编辑器 1.1. 下载地址 PDF阅读器下载_PDF编辑器下载_PDF软件官方下载_福昕软件官网 1.2. 安装 sudo dpkg -i signed_com.foxit.foxitpdfeditor_xxx_amd64_UOS.deb 2. WPS DPF 2.1. 下载地址 WPS Office 2019 for Linux-支持多版本下载_WPS官方网站 2.2. 使用 …

基于ES安装IK分词插件

前言 IK分词器插件是为Elasticsearch设计的中文分词插件&#xff0c;由Elasticsearch的官方团队之外的开发者medcl开发。它主要针对中文文本的分词需求&#xff0c;提供了较为准确的中文分词能力。以下是IK分词器插件的一些特点&#xff1a; 智能分词&#xff1a;IK分词器采用基…

每天学点小知识:WSL安装Ubuntu 22.04 LTS

前言 本章教会你在不使用虚拟机下使用linux&#xff0c;但是这里建议还是使用虚拟机&#xff0c;或者装一双系统&#xff0c;wsl使用linux还是有很多问题的。 1. 简介WSL WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软为Windows 10及以上版本开发的一项功能…

[AIGC] Java常用的JSON库及简单示例

Java常用的JSON库及简单示例 在Java的世界里&#xff0c;JSON库广泛用于日常开发工作&#xff0c;本文将介绍几个常用的JSON库并配以简单的示例代码。 1. Gson Gson是Google提供的一个用来在Java对象和JSON数据之间进行转换的Java库。 它有一定的学习曲线&#xff0c;但一旦熟…

Redis用GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

淘宝镜像的https证书过期

错误原因&#xff1a; 淘宝镜像过期 早在 2021 年&#xff0c;淘宝就发文称&#xff0c;npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务&#xff08;直到 HTTPS 证书到期才真正不能用了…

基于stm32的智能家居系统

目录 1.课题研究目的和内容 1.1 课题研究目的 1.2 课题研究内容 2.系统总体方案设计及功能模块介绍 2.1 总体方案设计 2.2 DHT11模块介绍 2.3 TFTLCD显示功能模块介绍 2.4 ESP8266WIFI模块介绍 2.5 MQ-135 空气质量模块介绍 2.6 步进电机模块介绍 2.…

solr-8.11.3

https://solr.apache.org/downloads.html https://archive.apache.org/dist/solr/solr/ F:\Document_Solr.apache.org\solr-8.11.3\bin Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。 C:\Users\Administrator>F: F:\> F:\>…

2023年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;共50分&#xff09; 第1题 有如下程序段&#xff1a; with open(mistakes.txt, w) as f:words [believe,memorize]f.write(\n.join(words))执行该代码后&#xff0c;…

springboot基础及上传组件封装

简介 本文主要以文件上传为demo&#xff0c;介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…

Ceph集群存储案例

Ceph是一种可靠的、可扩展的、统一的、分布式的存储系统。Ceph高度可靠、易于管理且免费。Ceph提供了非凡的可扩展性——数以千计的客户端访问PB到EB的数据。Ceph存储集群相互通信以动态复制和重新分配数据。目前众多云厂商都在使用Ceph&#xff0c;应用广泛。如&#xff1a;华…

【C++ ——— 哈希】位图 | 布隆过滤器

文章目录 1、位图1.1位图概念 2.位图实现位图的应用1.一百亿个整数&#xff0c;设计算法找到只出现一次的整数?2.给两个文件&#xff0c;分别有一百亿个整数&#xff0c;我们只有1G内存该如何找到两个文件的交集&#xff1f;3.位图应用变形&#xff1a;一个文件有100亿个int&a…

【介绍下运维,什么是运维?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Linux 编译安装python

以deepin操作系统安装Python3.8.10为例。 下载 python3.8.10 官网下载 Linux要下载源码&#xff0c;进行编译。 下图tarball即tar包&#xff0c;是压缩包的意思。python官网给出两种压缩格式的tarball&#xff0c;下载哪个都可以。 方式一&#xff1a;直接点击链接下载 方式…

python-模块-网络编程-多任务

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典&#xff0c;使用字典的方法操作数据 。 或者将…

Debian和ubuntu 嵌入式的系统的 区别

随着开源操作系统的日益流行&#xff0c;Debian和Ubuntu这两个基于Linux的发行版本成为了众多开发者和系统管理员的首选。它们各自拥有独特的优势和特点&#xff0c;那么&#xff0c;在选择时&#xff0c;哪一个更适合你呢&#xff1f;接下来&#xff0c;我们将深入探讨两者的关…