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


相关文章
uniapp组件库uview1的u-button的问题,u-button多次点击只触发事件一次
uniapp组件库uview1的u-button的问题,u-button多次点击只触发事件一次
345 0
|
3月前
|
JavaScript
Vue2按钮组件(Button)
这篇文章介绍了如何在Vue框架中创建一个可自定义样式和行为的按钮组件,包括按钮的文本、类型、尺寸、宽度、高度、圆角、跳转目标、禁用状态和是否居中显示等属性。
121 1
Vue2按钮组件(Button)
|
3月前
|
JavaScript
Vue3按钮(Button)
这是一个高度可定制的按钮组件,支持多种属性设置,包括按钮类型、形状、图标、尺寸、背景透明度、波纹颜色、跳转地址、打开方式、禁用状态、加载状态及指示符样式等。预览图展示了不同配置下的按钮样式变化。组件通过Vue实现,并提供了丰富的自定义选项以适应各种场景需求。
116 1
Vue3按钮(Button)
|
2月前
|
JavaScript
ElementUI的el-dialog弹窗修改设置可拖拽可最大化
该方案通过自定义Vue指令实现ElementUI的`el-dialog`弹窗的拖拽和最大化功能。只需在`main.js`中引入并注册指令,然后在Vue组件中绑定指令即可。支持自定义参数控制是否允许最大化和拖拽,并提供最大化后的回调函数。具体使用方法详见示例代码。
230 0
ElementUI的el-dialog弹窗修改设置可拖拽可最大化
【1】ElementUI 组件实际应用===》按钮的使用
这篇文章详细介绍了Element UI库中的按钮组件的使用方法,包括基础用法、禁用状态、文字按钮、图标按钮、按钮组、加载中状态、不同尺寸的按钮以及按钮的属性说明。文章通过实例代码展示了如何定义按钮样式、添加图标、设置按钮尺寸和类型,并解释了如何绑定方法到按钮以执行操作。
|
4月前
|
JavaScript
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
297 0
|
6月前
|
移动开发 小程序 JavaScript
uView Button 按钮
uView Button 按钮
113 2
|
6月前
|
JavaScript 前端开发
< elementUi组件封装: 通过 el-tag、el-popover、vue动画等实现公告轮播 >
在 Vue + elementUi 开发中,遇到这么一个需求,要实现公告轮播的效果。说实话,一开始是打算通过Javascript去获取并修改对应元素来控制轮播的,但是发现这样子代码比较多,而且性能不是很好。然后…聪明的小温想到了,能不能通过vue的动画过渡,实现公告的滚动效果呢!一不做二不休,直接上手,果然是可以实现的!接下来,简单阐述下,开发中使用方法!
182 0
|
6月前
elementUI el-tabs 实现动态选项卡页面效果
elementUI el-tabs 实现动态选项卡页面效果
|
JavaScript
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)