Element组件库源码探索

104 阅读2分钟

【Vue进阶】Element组件库源码探索

标签:

JavaScriptVue.jsReact

收藏

https://img1.sycdn.imooc.com//5c45c0f80001581519140974.jpg

从element-ui的源码中,可以学到组件库的设计,Vue的高级使用方式,组件的思想等等,对vue的进阶大有裨益,以下探索一下对我们比较重要的地方。

element源码目录结构

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b064eb87164241999c110acd7352d069~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=436&h=364&s=23818&e=png&b=f3f3f3

  • packages 里就是存放每个组件的源代码,如Select,input等等,便于维护和管理

  • index.js 根文件,将组件对外暴露

  • transition 动画类

  • directives 全局指令

  • locale 国际化

  • utils 工具方法集

  • mixins 库用到的混合

组件的install

在main.js中,以Form组件为例:

import { Form } from 'element-ui';
import Vue from 'vue';
Vue.use(Form);

先看看以上代码中发生了什么:

注意看下面这张图,在Form组件的index.js的文件中,

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4599f62566b34e17be709a3f6b582178~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=392&h=182&s=9953&e=png&b=ffffff

我们可以看到,它有个install的方法,这是vue封装第三方插件的标准写法。

总结:当调用Vue.use方法的时候就会调用组件的install方法,将Vue注入到组件中去来实现组件的全局注册

provide / inject 依赖注入

父组件向它的后代组件注入数据**
**

  • 祖先组件不需要知道哪些后代组件使用它提供的属性
  • 后代组件不需要知道被注入的属性来自哪里

直接看源码,以Form组件和它的子组件Input为例:

Form组件中:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6ce448c7d29c4659b75412d611f72afb~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=486&h=277&s=12689&e=png&b=fffdfd

Form组件中provide将其自身注入到后代组件中,然后

input组件中:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/06fe9393fe4645be9a5a5208e842f45a~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=442&h=329&s=14648&e=png&b=fffefe

通过inject的方式来拿到Form组件的内容,然后做一些表单验证的操作。

总结:使用依赖注入的方式,可以避免组件之间的逐级传递。缺点是耦合度上升,日常开发中避免少使用,可以用vuex等方案来代替,尽量做到组件之间解耦。

mixins 混入

向vue组件中混入配置,注意:生命周期函数混入的话,是先执行混入的方法,再执行原来的方法,看一下官方例子:**
**

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0d8d144d1c454db094a0dde0fe896843~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=484&h=212&s=13777&e=png&b=f8f8f8

这里是先执行混入的created,再执行原组件的created。再来看element中的一个简单应用:

focus.js:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cc56f2f5d570434c8408a9d0e6c921ba~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=436&h=178&s=6965&e=png&b=ffffff

定义了一个聚焦的混入函数,返回值是mixin,然后在Select组件中引用:

https://img1.sycdn.imooc.com//5c468972000108ee06070138.jpg

https://img1.sycdn.imooc.com//5c4689c9000101ee05320211.jpg

此时ref为reference的组件就混入了focus。

总结:当有多个组件有用到相同的data,methods,life hooks等等,都可以用mixins抽象出来复用。