mini-vue之组件的实现和渲染流程 以及局部和全局组件建立的联系

Vue组件系统实现原理

实现组件

vue的diff算法
Vue中,一般一个项目只有一个根组件,也就是 new Vue产生的app。

但是一个页面不可能只由一个组件构成,很明显我们需要实现自定义组件。

vue中提供了两种自定义组件的方式:

  1. 全局组件
  2. 局部组件

组件的使用流程:

在任意一个组件中,都可以使用其他组件。当我们在一个组件中使用其他组件的时候,会先去组件内部的局部组件中找是否定义过该组件,如果定义了,则直接使用该局部组件;如果没有定义局部组件,则去全局组件中寻找(和js中的原型,原型链很像了)。所以vue内部很可能也是利用类似于继承的这种模型实现组件的定义的。

其实vue内部在定义组件的时候,表面上我们是传递了一个对象:

Vue.component("cmp",{
   
   
    //...
})

实际上这个对象内部也会被Vue.extend给包裹,变成子类.

Vue.component("cmp",Vue.extend({
   
   
    //...
}))

组件的三大特性

  1. 自定义标签
  2. 组件有自己的属性和事件
  3. 组件的插槽

Vue.extend的实现

既然组件的实现内部还是需要调用extend方法,那么就先把extend实现出来。

**用法:**使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

实现:

这个实现就不难了:不过就是实现一个构造函数,让该函数继承Vue而已。就是组合式继承。

/**
   * 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。
   * 返回值是一个构造函数 通过new可以创建一个vue组件实例
   * @param {
   
   {data:Function,el:string}} options
   * @returns
   */
Vue.extend = function (options) {
   
   
    // 组合式继承 Vue
    function Sub(options = {
    
    }) {
   
   
        // 最终使用的组件 就是 new 一个实例
        this._init(options);
    }
    Sub.prototype = Object.create(Vue.prototype);
    Object.defineProperty(Sub.prototype, "constructor", {
   
   
        value: Sub,
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尤雨东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值