好家伙,

0.完整代码已开源

https://github.com/Fattiger4399/analytic-vue.git

1.思路

1.1.什么是组件化?

Vue 组件化是指将复杂的应用程序拆分成多个独立的、可复用的组件,这些组件可以实现特定的功能或局部功能。
组件化有助于提高开发效率、方便重复使用、简化调试步骤、提升项目可维护性,并便于多人协同开发。

以下是 Vue 组件化的好处:

代码复用,模块化,提高可维护性,便于 debug,适应性,提升性能(局部更新),有利于团队协

总之,Vue 组件化有助于提高开发效率、降低维护成本、提高应用程序性能,并便于团队协作。它是 Vue 框架的核心概念,也是 Vue 应用开发的关键优势之一。

1.2.在项目中组件化的使用

vue中使用组件的方式无非两种,全局组件与局部组件

let vm = new Vue({
el: "#app",
data: {
firstName: 'pang',
lastName: 'hu'
},
component: {
'my-button': {
template: `<button>局部按钮</button>`
}
}
})
Vue.component('my-button', {
template: `<button>全局按钮</button>`
})

本篇涉及Vue.component()和Vue.extend()

1. Vue.component:
- 用于创建可复用的、独立的、一次性(单例)的组件。
- 创建的组件实例之间互不干扰,各自拥有独立的实例状态。
- 无法继承父组件的属性和方法。 2. Vue.extend():
- 用于创建可复用的、独立的、多次使用的(原型链继承)组件。
- 创建的组件实例之间可以通过原型链继承父组件的属性和方法。
- 相当于创建了一个新的组件类,可以理解为对父组件的扩展。

来vue的官网看一看

 

2.代码实现

global-api/index.js

Vue.component = function (id, componentDef) {
componentDef.name = componentDef.name || id
console.log(componentDef) console.log(this)
componentDef = this.extend(componentDef) //返回一个实例
console.log(componentDef) this.options.components[id] = componentDef
console.log(this.options)
}
Vue.extend = function (options) {
let spuer = this
const Sub = function vuecomponet(opts) { //opts 子组件的实例
//
//初始化
this._init(opts)
}
//属性如何处理??
//子组件继承父组件中的属性Vue 类的继承
Sub.prototype = Object.create(spuer.prototype)
//问题 子组件中this的执行
Sub.prototype.constructor = Sub
//重点,将父组件的属性与子组件的属性合并到一起
Sub.options = mergeOptions(this.options, options)
console.log(Sub.options)
return Sub
}

问题一:

此处为什么要执行

Sub.prototype.constructor = Sub

答:

在 JavaScript 中,每个对象都有一个内部属性 constructor,该属性指向创建该对象的构造函数。

通常情况下,每个对象的 constructor 属性都指向它自身对应的构造函数。

在 Vue 中,通过 Vue.extend 方法创建的子组件构造函数,它们的原型对象(Sub.prototype)默认情况下并没有正确的 constructor 属性,即 constructor 指向的是 Vue 而不是子组件自身。

这样的话,在使用 new 运算符来创建子组件实例时,实际上会调用父组件的构造函数,导致创建子组件实例失败。

因此,在这段代码中,使用 Sub.prototype.constructor = Sub 将子组件的 constructor 属性设置为子组件自身,用于正确地设置子组件的构造函数。

这样,在使用 new 运算符来创建子组件实例时,就可以正确地使用子组件的构造函数来创建实例了。

3.实现效果

 

Vue源码学习(十八):实现组件注册(一)Vue.component()和Vue.extend()的更多相关文章

  1. Vue源码学习1——Vue构造函数

    Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只 ...

  2. Vue源码学习三 ———— Vue构造函数包装

    Vue源码学习二 是对Vue的原型对象的包装,最后从Vue的出生文件导出了 Vue这个构造函数 来到 src/core/index.js 代码是: import Vue from './instanc ...

  3. Vue源码学习二 ———— Vue原型对象包装

    Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...

  4. 【Vue源码学习】依赖收集

    前面我们学习了vue的响应式原理,我们知道了vue2底层是通过Object.defineProperty来实现数据响应式的,但是单有这个还不够,我们在data中定义的数据可能没有用于模版渲染,修改这些 ...

  5. netty源码分析(十八)Netty底层架构系统总结与应用实践

    一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...

  6. 最新 Vue 源码学习笔记

    最新 Vue 源码学习笔记 v2.x.x & v3.x.x 框架架构 核心算法 设计模式 编码风格 项目结构 为什么出现 解决了什么问题 有哪些应用场景 v2.x.x & v3.x.x ...

  7. Vue 源码学习(1)

    概述 我在闲暇时间学习了一下 Vue 的源码,有一些心得,现在把它们分享给大家. 这个分享只是 Vue源码系列 的第一篇,主要讲述了如下内容: 寻找入口文件 在打包的过程中 Vue 发生了什么变化 在 ...

  8. VUE 源码学习01 源码入口

    VUE[version:2.4.1] Vue项目做了不少,最近在学习设计模式与Vue源码,记录一下自己的脚印!共勉!注:此处源码学习方式为先了解其大模块,从宏观再去到微观学习,以免一开始就研究细节然后 ...

  9. Vue源码学习(一):调试环境搭建

    最近开始学习Vue源码,第一步就是要把调试环境搭好,这个过程遇到小坑着实费了点功夫,在这里记下来 一.调试环境搭建过程 1.安装node.js,具体不展开 2.下载vue项目源码,git或svn等均可 ...

  10. Vue源码学习(二)——生命周期

    官网对生命周期给出了一个比较完成的流程图,如下所示: 从图中我们可以看到我们的Vue创建的过程要经过以下的钩子函数: beforeCreate => created => beforeMo ...

随机推荐

  1. MySQL系列3:缓冲池Buffer Pool的设计思想

    1. 回顾 上一篇我们主要讲了InnoDB的存储引擎,其中主要的一个组件就是缓存池Buffer Pool,缓存了磁盘的真实数据,然后基于缓存做增删改查操作,同时配合了后续的redo log.刷磁盘等机 ...

  2. 使用Triton部署chatglm2-6b模型

    一.技术介绍 NVIDIA Triton Inference Server是一个针对CPU和GPU进行优化的云端和推理的解决方案. 支持的模型类型包括TensorRT.TensorFlow.PyTor ...

  3. xgo多线程

    import threading import time #导入xgoedu from xgoedu import XGOEDU from xgolib import XGO #导入xgolib  # ...

  4. struct 结构体【GO 基础】

    〇.前言 虽然 Go 语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念,但是可以通过结构体的内嵌,再配合接口,来实现面向对象,甚至具有更高的扩展性和 ...

  5. 01--OpenStack 手动安装手册(Icehouse)

    #OpenStack 手动安装手册(Icehouse) 声明:本博客欢迎转发,但请保留原作者信息!作者:[罗勇] 云计算工程师.敏捷开发实践者博客:http://yongluo2013.github. ...

  6. Kubernetes:kube-apiserver 之 scheme(二)

    接 Kubernetes:kube-apiserver 之 scheme(一). 2.2 资源 convert 上篇说到资源版本之间通过内部版本 __internal 进行资源转换.这里进一步扩展介绍 ...

  7. OpenResty入门之压测篇:压测工具界的 “悍马” wrk 审核中

    在上篇文章 每个后端都应该了解的 OpenResty 入门以及网关安全实战 中,我向大家介绍了 OpenResty 的入门使用是 WAF 防御实战,这篇文章将给大家继续介绍 OpenResty 入门之 ...

  8. 使用VSCode新建解决方案,添加ClassLib类库工程

    最近准备全面转向VSCode开发C#代码,所以第一件事就是使用VSCode新建解决方案,添加工程. 通过ChatGPT找到的大致的实现方案: 首先,打开VS Code的终端,然后导航到您想要创建解决方 ...

  9. 关于Windows打印机驱动相关问题-如何利用Java(或其他)调用打印机驱动程序完成原始文件翻译为PCL语言的步骤

    前面这些都是问题描述,问题在偏下面 场景:用户电脑上安装了PCL驱动,可通过驱动完成打印. 需求:现在需要提供一种脱离PC端完成文件上传并打印的功能.让用户使用手机或pc未安装驱动时都能打印文件. 目 ...

  10. Flask后端开发(一)-基础知识和前期准备

    目录 1.背景介绍 1.1. 项目背景 1.2. 项目难点 1.3. 项目环境 2. flask后端开发实现的功能 3. flask部署和前后端对接 3.1. flask运行配置和服务器部署 3.2. ...