山寨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要这么设计。


相关文章
|
前端开发
饿了么el-dialog自定义内容以及el-dialog自定义样式
饿了么el-dialog自定义内容以及el-dialog自定义样式
520 0
|
小程序
微信小程序在使用vant组件van-nav-bar出现的边框bug问题解决
微信小程序在使用vant组件van-nav-bar出现的边框bug问题解决
233 0
|
3月前
|
JavaScript
ElementUI的el-dialog弹窗修改设置可拖拽可最大化
该方案通过自定义Vue指令实现ElementUI的`el-dialog`弹窗的拖拽和最大化功能。只需在`main.js`中引入并注册指令,然后在Vue组件中绑定指令即可。支持自定义参数控制是否允许最大化和拖拽,并提供最大化后的回调函数。具体使用方法详见示例代码。
484 0
|
5月前
|
开发框架 JavaScript 前端开发
循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示
循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示
|
6月前
|
JavaScript
如何实现vue点击按钮进行图片浏览 ?
如何实现vue点击按钮进行图片浏览 ?
|
5月前
|
JavaScript
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
369 0
|
7月前
|
JavaScript 前端开发
< elementUi组件封装: 通过 el-tag、el-popover、vue动画等实现公告轮播 >
在 Vue + elementUi 开发中,遇到这么一个需求,要实现公告轮播的效果。说实话,一开始是打算通过Javascript去获取并修改对应元素来控制轮播的,但是发现这样子代码比较多,而且性能不是很好。然后…聪明的小温想到了,能不能通过vue的动画过渡,实现公告的滚动效果呢!一不做二不休,直接上手,果然是可以实现的!接下来,简单阐述下,开发中使用方法!
212 0
|
JavaScript
elementUI封装 el-dialog
elementUI封装 el-dialog
|
JavaScript
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)
|
JavaScript
Vue antdv dropdown 自定义下拉内容 overlay 禁止点击事件下传导致收起
Vue antdv dropdown 自定义下拉内容 overlay 禁止点击事件下传导致收起
363 0

热门文章

最新文章