Vue(四) 组件、单文件组件、非单文件组件,重要的内置关系

news2024/11/15 11:32:22

文章目录

  • 1. 组件
  • 2. 非单文件组件
    • 2.1 定义组件
    • 2.2 注册组件
    • 2.3 使用组件
    • 2.4 组件命名、标签等注意点
    • 2.5 组件嵌套
    • 2.6 VueComponent构造(这部分看视频更易理解)
    • 2.7 内置关系
  • 3. 单文件组件

1. 组件

组件是实现局部功能代码和资源的集合

  • 传统方式:
    在这里插入图片描述
    复用的意思是只有一个文件,大家都可以用
    ​依赖关系混乱:a.js 中引入了b.js,c.js若引入想引入a,则必须也要引入b
  • 组件方式
    在这里插入图片描述
    所有组件都由vm掌管,且组件可以嵌套组件。一般vue实例对象vm直接掌管一个App的组件,App内管理着其他所有的组件。
    在这里插入图片描述

2. 非单文件组件

非单文件组件:一个文件中包含有n个组件
Vue使用组件的三大步骤:定义组件、注册组件、使用组件

2.1 定义组件

语法Vue.extend(options)
其中的options与创建vm时new Vue(options)的options几乎一样,区别有两点:

  • el不需要写,因为最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
  • data必须写成函数, 避免组件被复用时,数据存在引用关系。(如果把data定义为对象,若有两个school组件,则都指向都一个地址中的data,其中一个组件data中的属性值改了,另一个组件的data属性值也会变)

使用template选项可配置组件内容结构

<div id="root">
    <!-- 这里的标签名取决于注册组件时定义的名称 -->
    <school></school>
</div>
<script> 
    // 创建组件
 const school = Vue.extend({
     // 这里的name属性改变的仅是开发工具里显示的组件名
     name:'SCH',    
        template: `
            <div class="demo">
            <h2>学校名称:{{schoolName}}</h2>
            <h2>学校地址:{{address}}</h2>
                </div>
            `,
        data () {
            return {
                schoolName: '中学',
                address: '火星'
            }
        }
    }),
       // 创建第二个组件
       const student = Vue.extend({...})
    new Vue({
        el: '#root',
        ....
    })
</script> 

在这里插入图片描述

2.2 注册组件

  • 局部注册:new Vue的时候传入components配置项
new Vue({
    el: '#root',
...
    components: {
    // 2. 注册组件,这里写的什么名,模板里组件的标签就是什么名
    school
    //或 给组件定义新的名字
    // xuexiao: school
    }
})
  • 全局注册:

语法Vue.component('组件名',组件)
在上述局部注册中,root容器里可以使用school组件,若是再有一个vue实例对象,接管另一个容器,则另一个容器无法使用school组件。全局注册之后,则这个文件里的所有vm接管的容器都可以使用该组件

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

2.3 使用组件

写组件标签即可使用组件<school></school><school/>

2.4 组件命名、标签等注意点

组件命名:

  • 可以使用name配置项指定组件在开发者工具中呈现的名字。
  • 一个单词
    • 方式一:首字母小写school
    • 方式二:首字母大写School
  • 多个单词
    • 方式一:my-school
    • 方式二:MySchool(需要脚手架支持)

为了与开发者工具中的名字呼应,无论是一个单词还是两个单词,最好采用首字母大写的方式。
组件标签

  • 方式一:<school></school>
  • 方式二:<school/>,这种最好也是在使用脚手架的情况下使用,如果不使用脚手架,模板中有多个标签时,页面只渲染一个组件标签的内容

组件简写
const school = Vue.extend(options) 可简写为const school = options
这种简写方式其实底层也是给补上一个Vue.extend。也就是底层会做一个判断,要是写了Vue.extend,就不管了;要是没写,就补一个。

2.5 组件嵌套

用哪个组件就在components里注册哪个组件,
比如:app嵌套school,school嵌套student

// school组件(简写)
const school = ({
    template: `
        <div>
	        <student></student>
        </div> `,
    ...
    // 注册组件
    components: {
        student
    }
})

app只嵌套类school,因此不用注册student

// app组件
const app = Vue.extend({
    template: `
        <div>
        <school></school>
        </div>
        `,
    components: {
        school
    }
})

2.6 VueComponent构造(这部分看视频更易理解)

1.组件的本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的(调用vue.extend则会生成student, student是VueComponent构造函数)

问题:组件的本质是什么?
答:VueComponent构造函数

// 创建组件
const student = Vue.extend({
    template: `
        <h2>学生姓名:{{stuName}}</h2>
        `,
    data () {
        return {
            stuName: 'tom'
        }
    }
})
console.log(student); 
// vue源码
var Sub = function VueComponent (options) {
    console.log('VueComponent构造函数');
    this._init(options);
};

在这里插入图片描述
结果证明这个函数被调用了。

  1. 我们只需写<student/><student></student>,Vue解析时会帮我们创建student组件的实例对象
<!--写两个组件标签,构造函数被调用两次-->
<student></student>
<student></student>

在这里插入图片描述
3. 特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent

// vue源码
// Vue.extend是个函数,所以他能被调用
 Vue.extend = function (extendOptions) {
    ...
      var Sub = function VueComponent (options) {
        console.log('VueComponent构造函数');
        this._init(options);
      };
    ...
      return Sub
    };
  }

所以每调用一次Vue.extend,都会生成一个Sub(Sub是VueComponent函数)。所以每次调用Vue.extend返回的VueComponent都是现定义的,所以返回的是一个全新的VueComponent。

//创建两个组件
const student = Vue.extend({..})
const school = Vue.extend({..})
console.log(school === student);// false
  1. 关于this指向:
  • 组件配置中:
    • data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是【VueComponent实例对象】(简称vc,也可称之为组件实例对象)
  • new Vue()配置中:
    • data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是【Vue实例对象】(简称vm)
      打印vm可以看出,vm管理着一个一个的vc
      在这里插入图片描述

2.7 内置关系

  • 一个重要的内置关系:VueComponent.prototype._proto === Vue.prototype
  • 为什么要有这个关系:让组件实例对象vc可以访问到Vue原型上的属性、方法。如果没有这个关系,Vue原型上的东西只能vm可以用。

回顾原型链的内容:

// 定义一个构造函数
function Demo () {
    this.a = 1
    this.b = 2
}
// 创建一个Demo对象
const d = new Demo()
console.log(Demo.prototype); // 显式原型属性
console.log(d.__proto__); // 隐式原型属性
console.log(Demo.prototype === d.__proto__); // true

// 程序员通过显式原型属性放东西
Demo.prototype.x = 99
// 通过隐式原型属性取东西
console.log(d.x); // 99

只有函数才有显式原型属性prototype
只要是对象,就有隐式原型属性__proto__
实例的隐式原型属性永远指向自己缔造者的原型对象

Vue的实例对象的__proto__永远指向自己缔造者(Vue)的原型对象,也就是蓝色框的蓝色虚线
在这里插入图片描述
Vue是个构造函数:
在这里插入图片描述

<div id="root">
    <!--写了这个标签才算是构建了VueComponentde的实例对象-->
    <student></student> 
</div>
<script>
    Vue.prototype.x = 99
    // student获得的是VueComponentde构造函数
    const student = Vue.extend({
       template: `
        <div>
        	<h2>学生姓名:{{stuName}}</h2>
        	<button @click="showX">点击显示x</button>
        </div>
        `,
        data () {
            return {
                stuName: 'tom'
            }
        },
        methods: {
            showX () {
                console.log(this.x); // 99
            }
        }
    })
    console.log(student.prototype.__proto__ === Vue.prototype);
</script>

3. 单文件组件

单文件组件的后缀名都是.vue。可借助插件运行.vue文件

在这里插入图片描述
.vue文件的内容包括:

<template>
	<!-- 组件结构 -->
</template>

<script>
	// 组件交互相关的代码(数据、方法)
</script>

<style>
	/* 组件的样式 */
</style>

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

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

相关文章

unreal engine5.4.3动画重定向

UE5系列文章目录 文章目录 UE5系列文章目录前言 前言 ue5.4和ue3动画重定向之间存在差异&#xff0c;跟ue5.2差别更大一点&#xff0c;总之ue5.4越来越简化动画重定向&#xff0c;不想之前还需要制作RTG文件 这是ue5.3.2的制作动画重定向的界面 这是ue5.4.2的制作动画重定向…

华芯邦获AEC-Q车规级系列认证与AQG324认证的双重背书,碳化硅SiC-MOSFET半导体功率器件器件已在重点头部新能源汽车厂商模块验证中。

在获得AEC-Q车规级系列认证与AQG324认证的双重背书后&#xff0c;华芯邦的碳化硅SiC-MOSFET器件不仅巩固了其在新能源汽车领域的领先地位&#xff0c;更进一步加速了其在全球汽车供应链中的深度布局。这款车规级产品凭借其卓越的耐高温、低导通电阻及高开关频率等特性&#xff…

kubernetes里面那些事——————OpenEBS

OpenEBS存储 一&#xff0c;OpenEBS简介二&#xff0c;卷类型三&#xff0c;本地卷存储引擎类型四&#xff0c;复制卷存储引擎类型&#xff08;副本卷&#xff09;4.1 复制卷实现原理4.2 复制卷的优势 五&#xff0c;openebs存储引擎技术选型六&#xff0c;k8s中部署openebs服务…

项目延期,怎么有效调整计划,追赶进度

在项目管理过程中&#xff0c;项目延期是一个令人头疼但又无法完全避免的问题。无论是由内部因素还是外部因素导致&#xff0c;都会对项目的整体进度、成本和质量产生影响。 面对延期&#xff0c;关键在于如何迅速而有效地调整项目计划&#xff0c;以确保项目能够尽快回到正轨…

新版IDEA配置前进和后退、打开资源管理器等快捷按钮

新版IDEA&#xff0c;好像是IDEA2024版本开始就默认隐藏了工具条&#xff0c;这时一些很常用的快捷按钮&#xff0c;如前进、后退、打开资源管理器就无法使用。这里图文介绍&#xff0c;如何把这些配置出来。 具体操作如下&#xff1a; 1、选择 File / Settings(windows版)&am…

关于contextmenu-ui组件库

关于这个组件库把&#xff0c;主要用在个人博客制作中&#xff0c;而且由于作者很懒&#xff0c;已经一个多月没有更新了&#xff0c;甚至第二次更新都忘了修改md文件了。 这个组件库是使用vue3和TS来写的&#xff0c;关于引用&#xff0c;看这里 都有介绍的&#xff0c;直接…

计算机网络(八股文)

这里写目录标题 计算机网络一、网络分层模型1. TCP/IP四层架构和OSI七层架构⭐️⭐️⭐️⭐️⭐️2. 为什么网络要分层&#xff1f;⭐️⭐️⭐️3. 各层都有那些协议&#xff1f;⭐️⭐️⭐️⭐️ 二、HTTP【重要】1. http状态码&#xff1f;⭐️⭐️⭐️2. 从输入URL到页面展示…

边缘计算工业网关可以为工业企业生产提供哪些价值应用?天拓四方

在数字化、网络化、智能化高度融合的今天&#xff0c;工业领域正迎来一场深刻的变革。边缘计算工业网关&#xff0c;作为这场变革中的关键角色&#xff0c;以其强大的数据处理能力、高效的通信效率和灵活的部署方式&#xff0c;为智能制造注入了新的活力。本文将结合一个实际应…

【安卓13】解决HDMI OUT和耳机等设备接入时会解除静音问题

安卓原生定义了部分外部设备接入时是否静音&#xff0c;比如耳机、有线扬声器、HDMIOUT设备等&#xff0c;这些设备接入时&#xff0c;安卓会设置AudioSystem.STREAM_MUSIC为非静音状态 从代码里可以看出&#xff0c;当一个newDevice 接入时&#xff0c;会携带一个deviceID&am…

Java基于微信小程序的超市购物管理系统

1 简介 Java基于微信小程序的超市购物管理系统&#xff0c;此超市购物系统利用当下成熟完善的springboot框架&#xff0c;使用跨平台的可开发大型商业网站的Java语言&#xff0c;以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了收货地址管理、购物车管理、…

Win11 / Win10 系统极化工具,降低游戏延迟效果明显

Win11 / Win10 系统优化工具,降低游戏延迟效果明显 Windows 系统优化就是精简系统一些功能组件、对一些系统功能进行设置等&#xff0c;这样可以减少不必要的硬件资源占用。 全面的系统优化功能外&#xff0c;据不少网友表示通过优化后 CS GO 游戏降低输入延迟效果明显。 免费…

领夹麦克风哪个牌子音质好?西圣、博雅、枫笛领夹麦克风对比

当今的直播、短视频已经深深的融入到了我们的生活当中&#xff0c;很多小伙伴会通过拍摄短视频、Vlog来分享自己生活精彩的瞬间。不过录制视频时&#xff0c;如果单纯靠手机拾音会发现&#xff0c;音频效果是极差的&#xff0c;特别距离手机越远效果会越明显&#xff0c;会出现…

【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十二)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

一文直接搞懂SpringMVC完整版教程

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体…

《黑神话悟空》广智打法技巧图文攻略详解

​黑神话悟空广智会挥舞火刀砍我们&#xff0c;是前期一个较难的boss&#xff0c;那么广智怎么打&#xff1f;基本就是别贪刀&#xff0c;躲技能&#xff0c;然后砍就完事儿了。这个boss之所以是第一个boss&#xff0c;可能就是锻炼大家躲技能的能力的&#xff0c;下面就来看下…

大数据测试知识架构与技术框架分享|大数据测试工程师学习方向

本文一起看一下关于大数据技术的基本的技术体系和典型技术栈&#xff0c;帮助想要从事大数据方向软件测试的朋友快速了解需要掌握的知识架构。 大数据基本的思想、它的整体框架&#xff0c;与以往的数据相关体系实际上是相类似的。区别主要在于数据的收集、存储包括资源的调度…

怎么一键导出多条数据的二维码?一物一码的在线生成技巧

怎么将多条数据生成单独二维码呢&#xff1f;现在扫描物品包装的二维码经常会看到对应的产品编号&#xff0c;一般是数字和字母组合内容&#xff0c;每个物品的编码都是不同的&#xff0c;怎么把不同的信息批量生成二维码呢&#xff1f;下面来给大家分享一物一码的使用技巧&…

ios动态创建控件及添加事件

效果如下&#xff0c;就是在一个空白页面动态添加控件&#xff0c;给按钮添加事件&#xff0c;图片名字和标题放入plist文件,plist是个Array&#xff0c;每一项是Dictionary。Dictionary里面方icon和name两个String的key。图片都放入Assets.xcassets。如果需要使用imageWithCon…

再次拿下品牌全球代言人,王鹤棣商业价值再度证明!

9月2日&#xff0c;FENTY BEAUTY品牌正式官宣王鹤棣为全球代言人&#xff0c;这也是该品牌创立至今官宣的中国首位全球代言人。 FENTY BEAUTY是由美国歌手Rihanna创立于2017年的高端美妆品牌&#xff0c;也是LV母公司LVMH集团联手RIHANNA一同孵化的品牌&#xff0c;因其产品具有…