Vue.mixin Vue.extend(Vue.component)的原理与区别

1.本文将讲述 方法 Vue.extend Vue.mixin 与 new Vue({mixins:[], extend:{}})的区别与原理

先回顾一下 Vue.mixin 官网如下描述:

Vue.mixin( mixin )全局注册一个混入,影响注册之后所有创建的每个 Vue 实例。插件作者可以使用混入,向组件注入自定义的行为。

既然可以影响到注册后的所有实例,那么该方法注入的方法和属性都存放在哪里呢(构造函数的options属性上),我们一起来看看该方法的定义

     Vue.mixin = function (mixin) {
             //mergeOption,将Vue构造函数的Options属性与传入的mixin参数进行合并,
             //合并之后再复制给Vue构造函数的Options属性
            this.options = mergeOptions(this.options, mixin);
            return this
        };

为什么Vue.mixin方法将mixin合并至Vue.options就能影响注册之后的所有实例呢,让我们看看Vue实例化的过程(将构造函数的options属性与实例化参数合并后付给实例的$options属性

 

 1    function Vue(options) {
 2         //调用_init方法
 3         this._init(options);
 4     }
 5
 6
 7
 8     Vue.prototype._init = function (options) {
 9             var vm = this;
10             // a uid
11             vm._uid = uid$3++;
12
13             var startTag, endTag;
14
21             // a flag to avoid this being observed 标记该对象是一个Vue实例
22             vm._isVue = true;
23             // merge options
24             if (options && options._isComponent) { //组件实例化过程,即Vue.extend返回对象--稍后解释
25                 // optimize internal component instantiation
26                 // since dynamic options merging is pretty slow, and none of the
27                 // internal component options needs special treatment.
28                 initInternalComponent(vm, options);
29             } else {//将构造函数的options属性与实例化参数合并后付给实例的$options属性 ,该属性会在函数initState中进行初始化
30                 vm.$options = mergeOptions(
31                     resolveConstructorOptions(vm.constructor),
32                     options || {},
33                     vm
34                 );
35             }
36             /* istanbul ignore else */
37             {
38                 initProxy(vm);
39             }
40             // expose real self
41             vm._self = vm;
42             initLifecycle(vm);
43             initEvents(vm);
44             initRender(vm);
45             callHook(vm, ‘beforeCreate‘);
46             initInjections(vm); // resolve injections before data/props
47             initState(vm);
48             initProvide(vm); // resolve provide after data/props
49             callHook(vm, ‘created‘);
50
51             /* istanbul ignore if */
52             if ("development" !== ‘production‘ && config.performance && mark) {
53                 vm._name = formatComponentName(vm, false);
54                 mark(endTag);
55                 measure(("vue " + (vm._name) + " init"), startTag, endTag);
56             }
57
58             if (vm.$options.el) {
59                 vm.$mount(vm.$options.el);
60             }
61         };

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

该方法返回一个与Vue具有相同功能的构造函数(其实为创建了一个组件)-属性options是 合并  基础 Vue 构造器 与 extend的参数 的对象,

 Vue.extend = function (extendOptions) {
            extendOptions = extendOptions || {};
            //将调用函数付给Super
            var Super = this;
            var SuperId = Super.cid;
            //如果参数中参入与创建的构造函数则直接返回
            var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
            if (cachedCtors[SuperId]) {
                return cachedCtors[SuperId]
            }
            //获取组件的名称
            var name = extendOptions.name || Super.options.name;
            if ("development" !== ‘production‘ && name) {
                validateComponentName(name);
            }
            //创建组件Sub
            var Sub = function VueComponent(options) {
                this._init(options);
            };       //为组件添加对应的属性与方法
            Sub.prototype = Object.create(Super.prototype);
            Sub.prototype.constructor = Sub;
            Sub.cid = cid++;            //合并super的options与extend的入参并赋值给Sub的options属性
            Sub.options = mergeOptions(
                Super.options,
                extendOptions
            );            //在sub上保存Super的信息
            Sub[‘super‘] = Super;

            // For props and computed properties, we define the proxy getters on
            // the Vue instances at extension time, on the extended prototype. This
            // avoids Object.defineProperty calls for each instance created.
            if (Sub.options.props) {
                initProps$1(Sub);
            }
            if (Sub.options.computed) {
                initComputed$1(Sub);
            }

            // allow further extension/mixin/plugin usage
            Sub.extend = Super.extend;
            Sub.mixin = Super.mixin;
            Sub.use = Super.use;

            // create asset registers, so extended classes
            // can have their private assets too.
            ASSET_TYPES.forEach(function (type) {
                Sub[type] = Super[type];
            });
            // enable recursive self-lookup            //如果有组件名称,将该组件挂载到sub.options.components上。以便可在组件内使用
          if (name) { Sub.options.components[name] = Sub; } // keep a reference to the super options at extension time. // later at instantiation we can check if Super‘s options have // been updated.             //保存option信息。以便在render的时候生成最新的options选项
            Sub.superOptions = Super.options;
            Sub.extendOptions = extendOptions;
            Sub.sealedOptions = extend({}, Sub.options);

            // cache constructor
            cachedCtors[SuperId] = Sub;
            return Sub  //返回sub构造函数
        };

Vue.component

原文地址:https://www.cnblogs.com/riona/p/10030143.html

时间: 2024-08-04 07:27:59

Vue.mixin Vue.extend(Vue.component)的原理与区别的相关文章

Vue Mixin 与微信小程序 Mixins 应用

> #### # 什么是Mixin(混入) Mixin是一种思想,用来实现代码高度可复用性,可以针对属性复制实现代码复用的想法进行一个扩展,就是混入(mixin).混入并不是复制一个完整的对象,而是从多个对象中复制出任意的成员并将这些成员组合成一个新的对象. ``` const obj1 = {a:1,b:2,c:3,d:4,e:5}; const obj2 = {f:6,g:7,h:8,i:9,a:10}; let obj3 = {}; Object.assign(obj3,obj1,obj2

如何正确理解Vue.mixin并优化工作

关于Vue.mixin在vue官方文档中是这么解释的: 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被"混合"进入该组件本身的选项. 我们的理解:Vue.mixin给我们提供了一种混入Vue实例的方法,创建了混入对象之后,我们自定义的方法或者变量可以很轻松的挂载在Vue实例上,给我们的偷懒带来方便: Vue.mixin为我们提供了两种混入方式:局部混入和全局混入: 本文还

【Vue】详解Vue组件系统

Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用 通过Vue.component()去注册一个组件,你就可以全局地使用它了,具体体现在每个被new的 Vue 实例/注册组件, 的template选项属性或者对应的DOM模板中,去直接使用 注册组件 全局注册 例如,放在通过new创建的Vue实例当中: Vue.component('my-component', { template:

vue系列4:vue组件和模块

1.vue组件和模块的区别 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: 模块化: 是从代码逻辑的角度进行划分的:方便代码分层开发,保证每个功能模块的职能单一: 组件化: 是从UI界面的角度进行划分的:前端的组件化,方便UI组件的重用: 2.组件创建方式1 <body> <div id="app"> <!-- 如果要使

[Vue + TS] Create Type-Safe Vue Directives in TypeScript

Directives allow us to apply DOM manipulations as side effects. We’ll show you how you can create your own Vue directive to change a component’s colors and type-safe it with TypeScript. We’ll additionally show how you can pass objects to your directi

vue学习笔记初识vue——使用HTML模板

在创建Vue实例时,如果声明了el配置项,那么你也可以省略template 选项.这时候,Vue.js将提取锚点元素的HTML内容,做为模板. 我们可以使用单一的el配置项来创建Vue实例: var vm = new Vue({el:'#app'}); 在Vue.js中,这种模板被称为HTML模板,而使用template配置项 书写的模板,被称为字符串模板. 工作原理 当Vue.js发现你提供的选项中没有template属性时,将提取el属性所 指定的DOM节点的outerHTML内容作为模板内

VUE系列一:VUE入门:搭建脚手架CLI(新建自己的一个VUE项目)

一.VUE脚手架介绍 官方说明:Vue 提供了一个官方的 CLI,为单页面应用快速搭建 (SPA) 繁杂的脚手架.它为现代前端工作流提供了 batteries-included 的构建设置.只需要几分钟的时间就可以运行起来并带有热重载.保存时 lint 校验,以及生产环境可用的构建版本.更多详情可查阅 Vue CLI 的文档. 个人理解:在实际开发中都是通过脚手架快速搭建一个vue项目,当然也可以使用CDN的方式(具体请看官网) 使用脚手架的好处: 1. 脚手架是通过webpack搭建的开发环境

Vue 随笔1-加入vue router 后发现app被渲染了2次

原因:main中已经render了app,在route中不需要再加入app组件了,直接重定向到home即可 main.js import Vue from 'vue' import App from './App.vue' import VueRouter from 'vue-router' import routes from './router/router' Vue.config.productionTip = false Vue.use(VueRouter) const router =

vue自定义组件(通过Vue.use()来使用)即install的使用

在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个loading.vue文件 // Cmponent.vue <template> <div> ...loading </div> </template> <script> export default { } </script> <style scoped> div{ font-size:40px