手动封装element-ui里面的button组件

首先我们知道vue里面包含有父子组件

但是你知道如果要进行一个element的手动组件封装

怎么封装吗

1首先第一步

首先我们建立一个组件

最好设置在一个文件目录下比如components

只是一个普通的组件

叫做OneButton.vue

    <template><button class="one-button">按钮组件</button></template><script>export default {name: 'oneButton'}
</script><style lang="scss">
</style>

要想使用该组件

就需要进行全局注册

就是在main.js里面注册了

 import Vue from 'vue'import App from './App.vue'// 第一步:导入button组件import OneButton from './components/button.vue'Vue.config.productionTip = false// 第二步:注册组件,设置(组件名,组件)Vue.component(OneButton.name, OneButton)new Vue({render: h => h(App)}).$mount('#app')

注册完成以后就可以进行使用了

<template><div id="app"><one-button>按钮</one-button></div>
</template><script>
export default {name: 'App',components: {}
}
</script><style lang="scss">
</style>

到这里

我们可以看到 就会显示一个普通按钮了

但是吧 这样的封装过于简单

能不能实现更加复杂的操作呢

于是

我们需要封装一个有element-ui风格的组件

好 那我们继续实现

我们先让文字可以自由的输入

那就要利用插槽了

 <template><button class="one-button"><span><slot></slot></span></button></template>

我们的文件需要做以上处理

 <template><div><one-button>歌谣</one-button><one-button>帅气</one-button><one-button>关注我</one-button></div></template>

加上基本样式

 <style lang="scss">.one-button{display: inline-block;line-height: 1;white-space: nowrap;cursor: pointer;background: #ffffff;border: 1px solid #dcdfe6;color: #606266;-webkit-appearance: none;text-align: center;box-sizing: border-box;outline: none;margin: 0;transition: 0.1s;font-weight: 500;//禁止元素的文字被选中-moz-user-select: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;padding: 12px 20px;font-size: 14px;border-radius: 4px;&:hover,&:hover{color: #409eff;border-color: #c6e2ff;background-color: #ecf5ff;}}</style>

这样文字的效果就实现了

到了这里 你又想element里面可以控制type属性控制按钮样式

怎么可以实现呢

父元素传递type值

    <template><div id="app"><div class="row"><one-button>按钮</one-button><one-button type="primary">primary按钮</one-button><one-button type="success">success按钮</one-button><one-button type="info">info按钮</one-button><one-button type="danger">danger按钮</one-button><one-button type="warning">warning按钮</one-button></div></div></template>

子元素接收当然props了

 export default {name: 'oneButton',// 此时对props进行校验,值接收string类型的type值props: {type:{type: String,// 设置默认值:如果不传值,那么使用defaultdefault: 'default'}},created () {console.log(this.type)//defalut primary success info danger warning}}

做过处理以后根据type就可以实现数据的操作了

动态绑定样式

  <template><button class="one-button" :class="`one-button-${type}`"><span><slot></slot></span></button></template>

最后定义好样式

  .one-button-primary{color:#fff;background-color: #409eff;border-color: #409eff;&:hover,&:focus{background: #66b1ff;background-color: #66b1ff;color: #fff;}}.one-button-success{color:#fff;background-color: #67c23a;border-color: #67c23a;&:hover,&:focus{background: #85ce61;background-color: #85ce61;color: #fff;}}.one-button-info{color:#fff;background-color: #909399;border-color: #909399;&:hover,&:focus{background: #a6a9ad;background-color: #a6a9ad;color: #fff;}}.one-button-warning{color:#fff;background-color: #e6a23c;border-color: #e6a23c;&:hover,&:focus{background: #ebb563;background-color: #ebb563;color: #fff;}}.one-button-danger{color:#fff;background-color: #f56c6c;border-color: #f56c6c;&:hover,&:focus{background: #f78989;background-color: #f78989;color: #fff;}}

运行

nice呀 有没有

这个时候你可能会想

如果设置plain属性怎么设置呢

和type类型相同,我们只要将样式先设置好,然后通过父组件传递过来的值进行判断,就可以设置plain属性了。

和type类型相同,我们只要将样式先设置好,然后通过父组件传递过来的值进行判断,就可以设置plain属性了。第一步:父组件组件传递plain值<template><div id="app"><div class="row"><one-button plain>按钮</one-button><one-button plain type="primary">primary按钮</one-button><one-button plain type="success">success按钮</one-button><one-button plain type="info">info按钮</one-button><one-button plain type="danger">danger按钮</one-button><one-button plain type="warning">warning按钮</one-button></div></div></template>第二步:子组件接收负组件传递的数据,同样进行props校验,并且设置默认值为falseprops: {plain: {type: Boolean,default: false}}第三步:通过绑定类名的方法动态控制样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式<template><button class="one-button" :class="[`one-button-${type}`,{'is-plain':plain}]"><span><slot></slot></span></button></template>第四步:设置不同类型的样式,由于plain类型是以对象的形式在类中定义的,所以使用获取属性的方法定义样式// 朴素按钮样式.one-button.is-plain{&:hover,&:focus{background: #fff;border-color: #489eff;color: #409eff;}}.one-button-primary.is-plain{color: #409eff;background: #ecf5ff;&:hover,&:focus{background: #409eff;border-color: #409eff;color: #fff;}}.one-button-success.is-plain{color: #67c23a;background: #c2e7b0;&:hover,&:focus{background: #67c23a;border-color: #67c23a;color: #fff;}}.one-button-info.is-plain{color: #909399;background: #d3d4d6;&:hover,&:focus{background: #909399;border-color: #909399;color: #fff;}}.one-button-warning.is-plain{color: #e6a23c;background: #f5dab1;&:hover,&:focus{background: #e6a23c;border-color: #e6a23c;color: #fff;}}.one-button-danger.is-plain{color: #f56c6c;background: #fbc4c4;&:hover,&:focus{background: #f56c6c;border-color: #f56c6c;color: #fff;}}

nice呀 有没有

round属性也是一样

button组件的round属性设置round属性和之前的相似,只要在组件中定义好了样式,动态获取属性值即可。获取属性值:round: {type: Boolean,default: false}round样式:.one-button.is-round{border-radius: 20px;padding: 12px 23px;}

看看效果

nice有没有

到这里

我们看看字体图标怎么实现

字体图标也是要引入的

第一步:在main.js中引入字体图标import './assets/fonts/iconfont.css'第二步:将下载的字体图标css文件中的类名做修改,我将icon全部改为了one-icon,并且将初始的iconfont类改为了[class*='one-icon'],当类名中有one-icon时使用,如下[class*='one-icon'] {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;}.one-icon-bluetoothoff:before {content: "\e697";}第三步:父组件传递图标名,子组件接收并且放到图标中父组件传值:<div class="row"><one-button icon="bluetoothon"></one-button><one-button type="primary" icon="camera">照相机</one-button><one-button type="success" icon="course"></one-button><one-button type="info" icon="bluetooth_link"></one-button><one-button type="danger" icon="addto"></one-button><one-button type="warning" icon="audio"></one-button></div>子组件接收:icon: {type: String,default: ''}使用接收到的字体图标。在没有传入icon时隐藏<i>标签,在slot插槽没有传入值时,不显示<span>标签<template><button class="one-button" :class="[`one-button-${type}`,{'is-plain':plain,'is-round':round,'is-circle':circle,}]"><i v-if="icon" :class="`one-icon-${icon}`"></i><!-- 如果没传入文本插槽,则不显示span内容 --><span v-if="$slots.default"><slot></slot></span></button></template>第四步:设置icon配套样式,使图标和文字之间有一定间隔.one-button [class*=one-icon-]+span{margin-left: 5px;}

查看效果

nice有没有

到这里

我们想一想element里面还有点击事件怎么实现

button组件中的点击事件我们在使用组件时,直接给组件定义事件是不会被触发的。我们需要在组件中定义一个点击事件,这个点击事件不进行其他操作,只出发父组件中的点击事件。组件中的定义点击事件:<template><button class="one-button" :class="[`one-button-${type}`,{'is-plain':plain,'is-round':round,'is-circle':circle,}]"@click="handleClick"><i v-if="icon" :class="`one-icon-${icon}`"></i><!-- 如果没传入文本插槽,则不显示span内容 --><span v-if="$slots.default"><slot></slot></span></button></template>定义一个点击事件,这个点击事件的作用是调用父组件中的点击事件,并且回调 methods: {handleClick (e) {this.$emit('click', e)}}父组件在使用时定义自己的点击事件,其本质是子组件中的点击事件触发父组件中的点击事件。<div class="row"><one-button @click="getInfo">按钮</one-button></div>methods: {getInfo () {console.log('获取信息!!')//获取信息!!}}

就很nice

按钮中会设置是否禁用

我们可以通过父子传值

给子组件设置样式实现

button组件中的disabled属性和之前相似,只要父子组件传值并且动态获取这个值并且赋给disabled属性,并且设置一个disabled样式即可。<div class="row"><one-button @click="getInfo" disabled>按钮</one-button></div><template><button class="one-button" :class="[`one-button-${type}`,{'is-plain':plain,'is-round':round,'is-circle':circle,'is-disabled':disabled}]"@click="handleClick":disabled="disabled"><i v-if="icon" :class="`one-icon-${icon}`"></i><span v-if="$slots.default"><slot></slot></span></button></template>disabled: {type: Boolean,default: false}disabled样式:.one-button.is-disabled{cursor: no-drop;}

至此 element中的button组件就封装完成了 是不是很nice

下次有时间继续封转其他的

看看封装的总代码

<template><button class="one-button" :class="[`one-button-${type}`,{'is-plain':plain,'is-round':round,'is-circle':circle,'is-disabled':disabled}]"@click="handleClick":disabled="disabled"><i v-if="icon" :class="`one-icon-${icon}`"></i><!-- 如果没传入文本插槽,则不显示span内容 --><span v-if="$slots.default"><slot></slot></span></button>
</template><script>export default {name: 'oneButton',// 此时对props进行校验,值接收string类型的type值props: {type: {type: String,// 设置默认值:如果不传值,那么使用defaultdefault: 'defalut'},plain: {type: Boolean,default: false},round: {type: Boolean,default: false},circle: {type: Boolean,default: false},icon: {type: String,default: ''},disabled: {type: Boolean,default: false}},created () {// 显示所有插槽// console.log(this.$slots)},methods: {// 定义一个点击事件,这个点击事件的作用是调用父组件中的点击事件,并且回调handleClick (e) {this.$emit('click', e)}}
}
</script><style lang="scss" scoped>.one-button{display: inline-block;line-height: 1;white-space: nowrap;cursor: pointer;background: #ffffff;border: 1px solid #dcdfe6;color: #606266;-webkit-appearance: none;text-align: center;box-sizing: border-box;outline: none;margin: 0;transition: 0.1s;font-weight: 500;//禁止元素的文字被选中-moz-user-select: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;padding: 12px 20px;font-size: 14px;border-radius: 4px;&:hover,&:focus{color: #409eff;border-color: #c6e2ff;background-color: #ecf5ff;}}
.one-button-primary{color:#fff;background-color: #409eff;border-color: #409eff;&:hover,&:focus{background: #66b1ff;background-color: #66b1ff;color: #fff;}}.one-button-success{color:#fff;background-color: #67c23a;border-color: #67c23a;&:hover,&:focus{background: #85ce61;background-color: #85ce61;color: #fff;}}.one-button-info{color:#fff;background-color: #909399;border-color: #909399;&:hover,&:focus{background: #a6a9ad;background-color: #a6a9ad;color: #fff;}}.one-button-warning{color:#fff;background-color: #e6a23c;border-color: #e6a23c;&:hover,&:focus{background: #ebb563;background-color: #ebb563;color: #fff;}}.one-button-danger{color:#fff;background-color: #f56c6c;border-color: #f56c6c;&:hover,&:focus{background: #f78989;background-color: #f78989;color: #fff;}}
// 朴素按钮样式
.one-button.is-plain{&:hover,&:focus{background: #fff;border-color: #489eff;color: #409eff;}
}
.one-button-primary.is-plain{color: #409eff;background: #ecf5ff;&:hover,&:focus{background: #409eff;border-color: #409eff;color: #fff;}
}
.one-button-success.is-plain{color: #67c23a;background: #c2e7b0;&:hover,&:focus{background: #67c23a;border-color: #67c23a;color: #fff;}
}
.one-button-info.is-plain{color: #909399;background: #d3d4d6;&:hover,&:focus{background: #909399;border-color: #909399;color: #fff;}
}
.one-button-warning.is-plain{color: #e6a23c;background: #f5dab1;&:hover,&:focus{background: #e6a23c;border-color: #e6a23c;color: #fff;}
}
.one-button-danger.is-plain{color: #f56c6c;background: #fbc4c4;&:hover,&:focus{background: #f56c6c;border-color: #f56c6c;color: #fff;}
}
// round属性
.one-button.is-round{border-radius: 20px;padding: 12px 23px;
}
// circle属性
.one-button.is-circle{border-radius: 50%;padding: 12px;
}
// icon配套样式
.one-button [class*=one-icon-]+span{margin-left: 5px;
}
// disabled属性
.one-button.is-disabled{cursor: no-drop;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 基础入门--简介和环境配置

2019 年第 32 篇&#xff0c;总 56 篇文章本文大约 1w 字&#xff0c;建议收藏阅读上周结束了如何构造一个机器学习项目的系列文章&#xff0c;当然还有一篇简单的总结以及介绍一些入门的学习资料&#xff0c;不过还在整理&#xff0c;应该这周内会整理好的。现在是系统的整理学…

这些单词你都念对了吗?顺便推荐三份程序员专属英语教程!

2019 第 36 篇文章&#xff0c;总第 60 篇文章本文大约 3500 字&#xff0c;阅读大约需要 9 分钟作为程序员&#xff0c;除了要有好的编程能力&#xff0c;计算机基础&#xff0c;还必须具备一定的英语能力&#xff0c;至少能看懂和计算机编程相关的英语&#xff0c;可以在谷歌…

curl

转载于:https://www.cnblogs.com/MyFlora/p/3164687.html

机器学习入门学习资料推荐

今天介绍一些机器学习的学习资料&#xff0c;主要是分为以下几个方面的内容&#xff1a; 编程语言&#xff1a;实现机器学习&#xff0c;主要是介绍 Python 方面的语言&#xff1b;书籍&#xff1a;看书通常是入门的一种方法&#xff0c;比较适合自律性强的同学&#xff1b;视…

漫画人工智能:人工智能简史

这是公众号推荐的第 8 篇好文来源&#xff1a;大鱼AI作者&#xff1a;Dr.Wu点击上方“大鱼AI”&#xff0c;选择“星标或置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;作者&#xff1a;武博士、宋知达、袁雪瑶、聂文韬本节我们会以生动有趣的漫画来介绍关于人工智…

字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

关于字符串的研究&#xff0c;目前已经有两篇。 原理篇&#xff1a;字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串 实践篇&#xff1a;字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来讲第三篇&#xff0c;如何应用上面所学内容&#xff0c…

Github上的各大高校资料以及国外公开课视频

2019 第 37 篇文章&#xff0c;总第 61 篇文章本文大约 1800 字&#xff0c;阅读大约需要 5 分钟最近发现兴起了一股在 Github 上大学的潮流&#xff0c;目前可以选择的大学包括清华、北大、上海交通大学、中国科学技术大学、中山大学&#xff0c;然后今天还发现还可以选择上国…

Python基础入门_2基础语法和变量类型

Python 基础入门系列第二篇&#xff0c;上一篇简单介绍了为什么用 Python&#xff0c;以及安装和配置环境。 这一篇将先介绍基础的语法&#xff0c;包括标识符&#xff0c;即变量名字&#xff0c;然后 Python 特色的缩进规则&#xff0c;注释、保留字等等&#xff0c;接着就是…

java解析bmp文件

最近想做一个图片查看器&#xff0c;因为bmp的图片简单些&#xff0c;也就从这个入手。 运用的基本知识还是IO的&#xff0c;关键是在于对于“协议”的理解。 一直觉得这些个协议是个很帅气的东西。感觉就像密码一样&#xff0c;你读到了一个文件&#xff0c;你只有知道对方的“…

不到20行代码,用Python做一个智能聊天机器人

这是小编推荐的第 11 篇好文来源&#xff1a;菜鸟学Python作者&#xff1a;小安和小编伴随着自然语言技术和机器学习技术的发展&#xff0c;越来越多的有意思的自然语言小项目呈现在大家的眼前&#xff0c;聊天机器人就是其中最典型的应用&#xff0c;今天小编就带领大家用不到…

详解div+css相对定位和绝对定位用法

1.定位的专业解释&#xff1a; (1)语法 position:static|absolute|fixed|relative 从上面语法可以看出&#xff0c;定位的方法有很多种&#xff0c;它们分别是静态(static)&#xff0c;绝对定位(absolute)&#xff0c;固定(fixed)&#xff0c;相对定位(relative)。在这个教程里…