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

简介: 山寨ElementUI之el-button,手写按钮组件

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


2158ca2032f6479dbede72d943c33ea4.png


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

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


1.引入vue核心js


<script src="vue.js"></script>


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


Vue.component('elButton', {
    name: 'elButton',
    props: {
        type: {
            type: String,
            default: "default"
        }
    },
    data() {
        return {}
    },
    template: `
< button :class="'el-button el-button--' + type" @click="triggerClick">
  <slot></slot>
< /button>
  `,
    mounted() {
    },
    methods: {
        triggerClick(){
            this.$emit('click', "模拟参数");
        }
    },
});


3.调用过程


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


bdf02eda5f4b4d8f9ea0462845f28dc1.png


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


核心就在于这一段代码:


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


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


/*el-button组件样式*/
.el-button {
    display: inline-block;
    line-height: 1;
    white-space: nowrap;
    cursor: pointer;
    background: #fff;
    border: 1px solid #dcdfe6;
    border-color: #dcdfe6;
    color: #606266;
    -webkit-appearance: none;
    text-align: center;
    box-sizing: border-box;
    outline: none;
    margin: 0;
    transition: .1s;
    font-weight: 500;
    -moz-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
    padding: 12px 20px;
    font-size: 14px;
    border-radius: 4px;
}
.el-button--default {
}
.el-button--primary {
    color: #fff;
    background-color: #409eff;
    border-color: #409eff;
}
.el-button--success {
    color: #fff;
    background-color: #67c23a;
    border-color: #67c23a;
}
.el-button--warning {
    color: #fff;
    background-color: #e6a23c;
    border-color: #e6a23c;
}
.el-button--danger {
    color: #fff;
    background-color: #f56c6c;
    border-color: #f56c6c;
}


如果不传type,就是default。


5.如何实现点击事件?


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


7fb60cda60364abebb47ec7b45833066.png


6.$emit的原理是啥?


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


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

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


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


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


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


相关文章
|
9月前
uniapp组件库uview1的u-button的问题,u-button多次点击只触发事件一次
uniapp组件库uview1的u-button的问题,u-button多次点击只触发事件一次
212 0
|
9月前
|
前端开发
饿了么el-dialog自定义内容以及el-dialog自定义样式
饿了么el-dialog自定义内容以及el-dialog自定义样式
208 0
|
7天前
|
JavaScript 前端开发
< elementUi组件封装: 通过 el-tag、el-popover、vue动画等实现公告轮播 >
在 Vue + elementUi 开发中,遇到这么一个需求,要实现公告轮播的效果。说实话,一开始是打算通过Javascript去获取并修改对应元素来控制轮播的,但是发现这样子代码比较多,而且性能不是很好。然后…聪明的小温想到了,能不能通过vue的动画过渡,实现公告的滚动效果呢!一不做二不休,直接上手,果然是可以实现的!接下来,简单阐述下,开发中使用方法!
|
4月前
|
前端开发
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
57 0
|
10月前
|
JavaScript
vue中关于element的el-image 图片预览功能增加一个下载按钮
vue中关于element的el-image 图片预览功能增加一个下载按钮
470 0
|
5月前
elementUI el-tabs 实现动态选项卡页面效果
elementUI el-tabs 实现动态选项卡页面效果
|
8月前
|
JavaScript
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)
|
9月前
|
JavaScript
Vue antdv dropdown 自定义下拉内容 overlay 禁止点击事件下传导致收起
Vue antdv dropdown 自定义下拉内容 overlay 禁止点击事件下传导致收起
181 0
|
9月前
|
JavaScript
Vue 自定义组件添加点击(@click)事件
Vue 自定义组件添加点击(@click)事件
398 0
|
JavaScript 容器
ElementUI Dialog 结合Vue实现对话框body“二分”布局
ElementUI Dialog 结合Vue实现对话框body“二分”布局
259 0