2.用Vue.component语法设置全局插件Vue.component('elButton', { name: 'elButton', pro.._elbutton">
当前位置:   article > 正文

山寨ElementUI之el-button,手写按钮组件_elbutton

elbutton

ElementUI是一款非常流行的vue插件库,整合了开发中大多数的组件。

最近正好在学习vue,就尝试简单模拟一下el-button的实现。

最近正好在学习vue,就尝试简单模拟一下el-button的实现。

  1. 引入vue核心js
  <script src="vue.js"></script>

2.用Vue.component语法设置全局插件

  1. Vue.component('elButton', {
  2. name: 'elButton',
  3. props: {
  4. type: {
  5. type: String,
  6. default: "default"
  7. }
  8. },
  9. data() {
  10. return {}
  11. },
  12. template: `
  13. < button :class="'el-button el-button--' + type" @click="triggerClick">
  14.   
  15.   <slot></slot>
  16. < /button>
  17.   `,
  18. mounted() {
  19. },
  20. methods: {
  21. triggerClick(){
  22. this.$emit('click', "模拟参数");
  23. }
  24. },
  25. });

3.调用过程

  1. <el-button type="primary" @click="add">新增</el-button>
  2. <el-button type="warning">修改</el-button>
  3. <el-button type="danger">删除</el-button>

4.如何控制按钮颜色的?

核心就在于这一段代码:

 <button :class="'el-button el-button--' + type" @click="triggerClick">

type是外部组件传进来的参数,这边就直接字符串拼接了。然后会对应到具体的class

 

  1. /*el-button组件样式*/
  2. .el-button {
  3. display: inline-block;
  4. line-height: 1;
  5. white-space: nowrap;
  6. cursor: pointer;
  7. background: #fff;
  8. border: 1px solid #dcdfe6;
  9. border-color: #dcdfe6;
  10. color: #606266;
  11. -webkit-appearance: none;
  12. text-align: center;
  13. box-sizing: border-box;
  14. outline: none;
  15. margin: 0;
  16. transition: .1s;
  17. font-weight: 500;
  18. -moz-user-select: none;
  19. -webkit-user-select: none;
  20. -ms-user-select: none;
  21. padding: 12px 20px;
  22. font-size: 14px;
  23. border-radius: 4px;
  24. }
  25. .el-button--default {
  26. }
  27. .el-button--primary {
  28. color: #fff;
  29. background-color: #409eff;
  30. border-color: #409eff;
  31. }
  32. .el-button--success {
  33. color: #fff;
  34. background-color: #67c23a;
  35. border-color: #67c23a;
  36. }
  37. .el-button--warning {
  38. color: #fff;
  39. background-color: #e6a23c;
  40. border-color: #e6a23c;
  41. }
  42. .el-button--danger {
  43. color: #fff;
  44. background-color: #f56c6c;
  45. border-color: #f56c6c;
  46. }

如果不传type,就是default。

5.如何实现点击事件?

外部组件直接放心地添加@click事件,然后el-button组件内部用$emit去触发即可。

6.$emit的原理是啥?

这是vue内部去做的,不过也可以手动替换Vue原型链的$emit方法:

  1. Vue.prototype.$emit = function (event) {
  2. let _events = this._events;
  3. let cbs = _events[event];
  4. if (cbs) {
  5. cbs[0].apply(app, [arguments].splice(1));
  6. }
  7. }

这是一个简单的实现,实际实现会更加复杂。

this就指向当前的Vue实例,也是页面中唯一的那个vue实例,_events是所有设置的方法和事件,比如你写在methods里面的add方法。

思路还是很直白的,就是遍历所有事件,看看当前触发的是哪一个事件,找到了就直接用apply去调用。为啥用apply而不用call?源码就这么写的,用call其实也一样,只不过后面的参数不能用数组了,要用变长参数。好像是这样的,具体不记得了。

得到的event竟然是一个数组,搞不懂为啥vue要这么设计。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/106158
推荐阅读
相关标签
  

闽ICP备14008679号