定制组件
当前位置:   article > 正文

Vue封装组件库-button组件_vue中button加图标

vue中button加图标

常见组件封装

使用vue create green-ui命令初始化一个vue项目

勾选如下

选择scss

选择eslint风格

选择保存时校验

选择In package.json

保存

输入项目名

创建项目成功

启动项目

然后把App.vue修改为如下内容

  1. <template>
  2. <div id="app">
  3. 定制组件
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. }
  9. </script>
  10. <style lang="scss">
  11. </style>

把router文件夹下的index.js修改为

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'
  3. Vue.use(VueRouter)
  4. const routes = [
  5. ]
  6. const router = new VueRouter({
  7. routes
  8. })
  9. export default router

然后把项目文件夹删除成如下状态

封装button组件

组件参数及事件

参数支持:

参数名参数描述参数类型默认值
type按钮类型(primary/success/warning/danger/info)stringdefault
plain是否是朴素按钮booleanfalse
round是否是圆角按钮booleanfalse
circle是否是圆形按钮booleanfalse
disabled是否禁用按钮booleanfalse
icon图标类名string

事件支持:

事件名事件描述
click点击事件

基本结构

在components下创建button.vue

  1. <template>
  2. <button class="g-button">按钮组件</button>
  3. </template>
  4. <script>
  5. export default {
  6. name: 'GButton'
  7. }
  8. </script>
  9. <style>
  10. </style>

其中name是表示该组件的名字,在引入的时候会用到这个组件名称。

接着在main.js文件中进行注册该组件

刷新浏览器,就可以看到调用的组件了

下面为组件添加样式,其中为插槽slot外套个span元素,可以方便为其设置样式,其中在style标签内写样式

  1. <template>
  2. <button class="g-button">
  3. <!-- slot表示插槽,用于要用户自定义的内容 -->
  4. <span><slot></slot></span>
  5. </button>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'GButton'
  10. }
  11. </script>
  12. <style lang="scss" scoped="scoped">
  13. .g-button {
  14. display: inline-block;
  15. line-height: 1;
  16. white-space: nowrap;
  17. cursor: pointer;
  18. background: #fff;
  19. border: 1px solid #dcdfe6;
  20. color: #606266;
  21. -webkit-apprearance: none;
  22. text-align: center;
  23. box-sizing: border-box;
  24. outline: none;
  25. margin: 0;
  26. transition: 0.1s;
  27. font-weight: 500;
  28. // 禁止元素的文字被选中
  29. -moz-user-select: none;
  30. -webkit-user-select: none;
  31. -ms-user-select: none;
  32. padding: 12px 20px;
  33. font-size: 14px;
  34. border-radius: 4px;
  35. &:hover,
  36. &:focus {
  37. color: #409eff;
  38. border-color: #c6e2ff;
  39. background-color: #ecf5ff;
  40. }
  41. }
  42. </style>

浏览器查看效果

type属性

传递参数

在element-ui及其他ui组件中都有为按钮设置不同样式

所以需要根据不同的type设置不同的样式,这就涉及到组件通信问题了

学过vue的知道可以通过props来接收传过来的参数,如下代码

打开浏览器控制台后台查看

对props进行约束校验

如果传递是一个数值类型

那么控制台会报错

正确传递参数打印的情况

为不同type的按钮设计不同的样式,动态绑定type到class中进行样式设置

button.vue完整代码如下:

  1. <template>
  2. <button class="g-button" :class="[`g-button-${type}`]">
  3. <!-- slot表示插槽,用于要用户自定义的内容 -->
  4. <span><slot></slot></span>
  5. </button>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'GButton',
  10. // 封装一个通用的组件,会对props做一个约束,即对props进行校验,校验方法参考官网
  11. props: {
  12. type: {
  13. // 数据类型:字符串
  14. type: String,
  15. default: 'default'// 不传type值,传默认值
  16. }
  17. },
  18. created () {
  19. console.log(this.type)
  20. }
  21. }
  22. </script>
  23. <style lang="scss" scoped="scoped">
  24. .g-button {
  25. display: inline-block;
  26. line-height: 1;
  27. white-space: nowrap;
  28. cursor: pointer;
  29. background: #fff;
  30. border: 1px solid #dcdfe6;
  31. color: #606266;
  32. -webkit-apprearance: none;
  33. text-align: center;
  34. box-sizing: border-box;
  35. outline: none;
  36. margin: 0;
  37. transition: 0.1s;
  38. font-weight: 500;
  39. // 禁止元素的文字被选中
  40. -moz-user-select: none;
  41. -webkit-user-select: none;
  42. -ms-user-select: none;
  43. padding: 12px 20px;
  44. font-size: 14px;
  45. border-radius: 4px;
  46. &:hover,
  47. &:focus {
  48. color: #409eff;
  49. border-color: #c6e2ff;
  50. background-color: #ecf5ff;
  51. }
  52. }
  53. .g-button-primary{
  54. color:#fff;
  55. background-color: #409eff;
  56. border-color: #409eff;
  57. &:hover,
  58. &:focus{
  59. background: #66b1ff;
  60. background-color: #66b1ff;
  61. color: #fff;
  62. }
  63. }
  64. .g-button-success{
  65. color:#fff;
  66. background-color: #67c23a;
  67. border-color: #67c23a;
  68. &:hover,
  69. &:focus{
  70. background: #85ce61;
  71. background-color: #85ce61;
  72. color: #fff;
  73. }
  74. }
  75. .g-button-info{
  76. color:#fff;
  77. background-color: #909399;
  78. border-color: #909399;
  79. &:hover,
  80. &:focus{
  81. background: #a6a9ad;
  82. background-color: #a6a9ad;
  83. color: #fff;
  84. }
  85. }
  86. .g-button-warning{
  87. color:#fff;
  88. background-color: #e6a23c;
  89. border-color: #e6a23c;
  90. &:hover,
  91. &:focus{
  92. background: #ebb563;
  93. background-color: #ebb563;
  94. color: #fff;
  95. }
  96. }
  97. .g-button-danger{
  98. color:#fff;
  99. background-color: #f56c6c;
  100. border-color: #f56c6c;
  101. &:hover,
  102. &:focus{
  103. background: #f78989;
  104. background-color: #f78989;
  105. color: #fff;
  106. }
  107. }
  108. </style>

浏览器查看效果,有其他UI组件的外表了

plain属性

第一步:父组件传递plain值

第二步:子组件接收值

第三步:添加plain样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式

动态添加样式

第四步:设置plain的样式

其中plain的CSS样式如下:

  1. // 朴素按钮样式
  2. .g-button.is-plain {
  3. &:hover,
  4. &:focus {
  5. background: #fff;
  6. border-color: #489eff;
  7. color: #409eff;
  8. }
  9. }
  10. .g-button-primary.is-plain {
  11. color: #409eff;
  12. background: #ecf5ff;
  13. &:hover,
  14. &:focus {
  15. background: #409eff;
  16. border-color: #409eff;
  17. color: #fff;
  18. }
  19. }
  20. .g-button-success.is-plain {
  21. color: #67c23a;
  22. background: #c2e7b0;
  23. &:hover,
  24. &:focus {
  25. background: #67c23a;
  26. border-color: #67c23a;
  27. color: #fff;
  28. }
  29. }
  30. .g-button-info.is-plain {
  31. color: #909399;
  32. background: #d3d4d6;
  33. &:hover,
  34. &:focus {
  35. background: #909399;
  36. border-color: #909399;
  37. color: #fff;
  38. }
  39. }
  40. .g-button-warning.is-plain {
  41. color: #e6a23c;
  42. background: #f5dab1;
  43. &:hover,
  44. &:focus {
  45. background: #e6a23c;
  46. border-color: #e6a23c;
  47. color: #fff;
  48. }
  49. }
  50. .g-button-danger.is-plain {
  51. color: #f56c6c;
  52. background: #fbc4c4;
  53. &:hover,
  54. &:focus {
  55. background: #f56c6c;
  56. border-color: #f56c6c;
  57. color: #fff;
  58. }
  59. }

第五步:查看浏览器效果

round属性

round是设置按钮圆角的

第一步:父组件传值

第二步:子组件接收值,并进行校验

第三步:动态添加class样式

第四步:设置round样式

  1. .g-button.is-round{
  2. border-radius: 20px;
  3. padding: 12px 23px;
  4. }

第五步:浏览器查看效果

circle属性

第一步:父组件传参

第二步:子组件通过props来接收参数

第三步:动态添加样式

第四步:设置circle样式

  1. .g-button.is-circle {
  2. border-radius: 50%;
  3. padding: 12px;
  4. }

第五步:浏览器查看效果

字体图标

第一步:下载字体图标

字体图标使用阿里巴巴矢量图标库的图标

搜索合适的图标添加到购物车

点击上方的购物车图标

下载下来,将文件复制到assets目录下创建的fonts文件夹中

然后在main.js中导入

第二步:修改图标样式

  1. // 意思是只要类名中包括g-icon就调用该样式
  2. [class*='g-icon'] {
  3. font-family: "iconfont" !important;
  4. font-size: 16px;
  5. font-style: normal;
  6. -webkit-font-smoothing: antialiased;
  7. -moz-osx-font-smoothing: grayscale;
  8. }

第三步:父组件传icon值

其中g-icon是上面的图标样式的设置,而icon-guanzhu是下载下来的图标名称

第四步:子组件接收值

接收一个string值,默认为空。

第五步:添加显示标签

设置icon中图标和文字之间的间隔样式

  1. .g-button [class*=g-icon]+span {
  2. margin-left: 5px;
  3. }

文字和图标的间隔有了,但是只有图标显示的时候却没有居中了,作如下处理

可以通过this.$slots获取到所有的插槽。本段代码通过v-if来判断如果有文本则显示文本,如果没有文本则不显示

查看效果

click事件

在使用组件时,直接给组件定义事件是不会被触发的。我们需要在组件中定义一个点击事件,这个点击事件不进行其他操作,只出发父组件中的点击事件。

第一步:在子组件中定义事件

第二步:父组件定义处理函数

第三步:浏览器查看效果

disabled属性

第一步:父组件传值

<g-button disabled @click="getType" icon="g-icon icon-guanzhu" round plain type="danger"></g-button>

第二步:子组件接收值

第三步:绑定属性

其中'is-disabled':disabled是绑定当按钮处于disabled状态时的CSS样式,而:disabled="disabled"是将按钮置于disabled状态。

第四步:设置样式

  1. // disabled样式
  2. .g-button.is-disabled{
  3. cursor: no-drop;
  4. }

完整代码

button.vue的完整代码

  1. <template>
  2. <button class="g-button" :class="[`g-button-${type}`, {
  3. 'is-plain': plain,
  4. 'is-round': round,
  5. 'is-circle': circle,
  6. 'is-disabled': disabled
  7. }]" @click="handleClick" :disabled="disabled">
  8. <!-- slot表示插槽,用于要用户自定义的内容 -->
  9. <!-- 传了icon才使用图标,没有传icon属性则不使用 -->
  10. <i v-if="icon" :class="icon"></i>
  11. <span v-if="$slots.default"><slot></slot></span>
  12. </button>
  13. </template>
  14. <script>
  15. export default {
  16. name: 'GButton',
  17. // 封装一个通用的组件,会对props做一个约束,即对props进行校验,校验方法参考官网
  18. props: {
  19. type: {
  20. // 数据类型:字符串
  21. type: String,
  22. default: 'default'// 不传type值,传默认值
  23. },
  24. plain: {
  25. type: Boolean,
  26. default: false
  27. },
  28. round: {
  29. type: Boolean,
  30. default: false
  31. },
  32. circle: {
  33. type: Boolean,
  34. default: false
  35. },
  36. icon: {
  37. type: String,
  38. default: ''
  39. },
  40. disabled: {
  41. type: Boolean,
  42. default: false
  43. }
  44. },
  45. methods: {
  46. handleClick (e) {
  47. this.$emit('click', e)
  48. }
  49. }
  50. }
  51. </script>
  52. <style lang="scss" scoped="scoped">
  53. .g-button {
  54. display: inline-block;
  55. line-height: 1;
  56. white-space: nowrap;
  57. cursor: pointer;
  58. background: #fff;
  59. border: 1px solid #dcdfe6;
  60. color: #606266;
  61. -webkit-apprearance: none;
  62. text-align: center;
  63. box-sizing: border-box;
  64. outline: none;
  65. margin: 0;
  66. transition: 0.1s;
  67. font-weight: 500;
  68. // 禁止元素的文字被选中
  69. -moz-user-select: none;
  70. -webkit-user-select: none;
  71. -ms-user-select: none;
  72. padding: 12px 20px;
  73. font-size: 14px;
  74. border-radius: 4px;
  75. &:hover,
  76. &:focus {
  77. color: #409eff;
  78. border-color: #c6e2ff;
  79. background-color: #ecf5ff;
  80. }
  81. }
  82. .g-button-primary {
  83. color: #fff;
  84. background-color: #409eff;
  85. border-color: #409eff;
  86. &:hover,
  87. &:focus {
  88. background: #66b1ff;
  89. background-color: #66b1ff;
  90. color: #fff;
  91. }
  92. }
  93. .g-button-success {
  94. color: #fff;
  95. background-color: #67c23a;
  96. border-color: #67c23a;
  97. &:hover,
  98. &:focus {
  99. background: #85ce61;
  100. background-color: #85ce61;
  101. color: #fff;
  102. }
  103. }
  104. .g-button-info {
  105. color: #fff;
  106. background-color: #909399;
  107. border-color: #909399;
  108. &:hover,
  109. &:focus {
  110. background: #a6a9ad;
  111. background-color: #a6a9ad;
  112. color: #fff;
  113. }
  114. }
  115. .g-button-warning {
  116. color: #fff;
  117. background-color: #e6a23c;
  118. border-color: #e6a23c;
  119. &:hover,
  120. &:focus {
  121. background: #ebb563;
  122. background-color: #ebb563;
  123. color: #fff;
  124. }
  125. }
  126. .g-button-danger {
  127. color: #fff;
  128. background-color: #f56c6c;
  129. border-color: #f56c6c;
  130. &:hover,
  131. &:focus {
  132. background: #f78989;
  133. background-color: #f78989;
  134. color: #fff;
  135. }
  136. }
  137. // 朴素按钮样式
  138. .g-button.is-plain {
  139. &:hover,
  140. &:focus {
  141. background: #fff;
  142. border-color: #489eff;
  143. color: #409eff;
  144. }
  145. }
  146. .g-button-primary.is-plain {
  147. color: #409eff;
  148. background: #ecf5ff;
  149. &:hover,
  150. &:focus {
  151. background: #409eff;
  152. border-color: #409eff;
  153. color: #fff;
  154. }
  155. }
  156. .g-button-success.is-plain {
  157. color: #67c23a;
  158. background: #c2e7b0;
  159. &:hover,
  160. &:focus {
  161. background: #67c23a;
  162. border-color: #67c23a;
  163. color: #fff;
  164. }
  165. }
  166. .g-button-info.is-plain {
  167. color: #909399;
  168. background: #d3d4d6;
  169. &:hover,
  170. &:focus {
  171. background: #909399;
  172. border-color: #909399;
  173. color: #fff;
  174. }
  175. }
  176. .g-button-warning.is-plain {
  177. color: #e6a23c;
  178. background: #f5dab1;
  179. &:hover,
  180. &:focus {
  181. background: #e6a23c;
  182. border-color: #e6a23c;
  183. color: #fff;
  184. }
  185. }
  186. .g-button-danger.is-plain {
  187. color: #f56c6c;
  188. background: #fbc4c4;
  189. &:hover,
  190. &:focus {
  191. background: #f56c6c;
  192. border-color: #f56c6c;
  193. color: #fff;
  194. }
  195. }
  196. .g-button.is-round{
  197. border-radius: 20px;
  198. padding: 12px 23px;
  199. }
  200. .g-button.is-circle {
  201. border-radius: 50%;
  202. padding: 12px;
  203. }
  204. // 意思是只要类名中包括g-icon就调用该样式
  205. [class*='g-icon'] {
  206. font-family: "iconfont" !important;
  207. font-size: 16px;
  208. font-style: normal;
  209. -webkit-font-smoothing: antialiased;
  210. -moz-osx-font-smoothing: grayscale;
  211. }
  212. .g-button [class*=g-icon]+span {
  213. margin-left: 5px;
  214. }
  215. // disabled样式
  216. .g-button.is-disabled{
  217. cursor: no-drop;
  218. }
  219. </style>

App.vue测试代码

  1. <template>
  2. <div id="app">
  3. <div>
  4. <h1>type属性</h1>
  5. <g-button>按钮</g-button>
  6. <g-button type="primary">按钮</g-button>
  7. <g-button type="success">按钮</g-button>
  8. <g-button type="info">按钮</g-button>
  9. <g-button type="warning">按钮</g-button>
  10. <g-button type="danger">按钮</g-button>
  11. </div>
  12. <div>
  13. <h1>plain属性</h1>
  14. <g-button plain>按钮</g-button>
  15. <g-button plain type="primary">按钮</g-button>
  16. <g-button plain type="success">按钮</g-button>
  17. <g-button plain type="info">按钮</g-button>
  18. <g-button plain type="warning">按钮</g-button>
  19. <g-button plain type="danger">按钮</g-button>
  20. </div>
  21. <div>
  22. <h1>round属性</h1>
  23. <g-button round>按钮</g-button>
  24. <g-button round type="primary">按钮</g-button>
  25. <g-button round type="success">按钮</g-button>
  26. <g-button round type="info">按钮</g-button>
  27. <g-button round type="warning">按钮</g-button>
  28. <g-button round type="danger">按钮</g-button>
  29. </div>
  30. <div>
  31. <h1>circle属性</h1>
  32. <g-button circle>按钮</g-button>
  33. <g-button circle type="primary">按钮</g-button>
  34. <g-button circle type="success">按钮</g-button>
  35. <g-button circle type="info">按钮</g-button>
  36. <g-button circle type="warning">按钮</g-button>
  37. <g-button circle type="danger">按钮</g-button>
  38. </div>
  39. <div>
  40. <h1>icon属性</h1>
  41. <g-button icon="g-icon icon-guanzhu">按钮</g-button>
  42. <g-button icon="g-icon icon-guanzhu" type="primary">按钮</g-button>
  43. <g-button icon="g-icon icon-guanzhu" type="success">按钮</g-button>
  44. <g-button icon="g-icon icon-guanzhu" type="info">按钮</g-button>
  45. <g-button icon="g-icon icon-guanzhu" type="warning">按钮</g-button>
  46. <g-button icon="g-icon icon-guanzhu" type="danger">按钮</g-button>
  47. </div>
  48. <div>
  49. <h1>disabled属性</h1>
  50. <g-button disabled>按钮</g-button>
  51. <g-button disabled type="primary">按钮</g-button>
  52. <g-button disabled type="success">按钮</g-button>
  53. <g-button disabled type="info">按钮</g-button>
  54. <g-button disabled type="warning">按钮</g-button>
  55. <g-button disabled type="danger">按钮</g-button>
  56. </div>
  57. <div>
  58. <h1>click事件</h1>
  59. <g-button @click="getType">按钮</g-button>
  60. <g-button @click="getType" type="primary">按钮</g-button>
  61. <g-button @click="getType" type="success">按钮</g-button>
  62. <g-button @click="getType" type="info">按钮</g-button>
  63. <g-button @click="getType" type="warning">按钮</g-button>
  64. <g-button @click="getType" type="danger">按钮</g-button>
  65. </div>
  66. </div>
  67. </template>
  68. <script>
  69. export default {
  70. methods: {
  71. getType () {
  72. console.log('type')
  73. }
  74. }
  75. }
  76. </script>
  77. <style lang="scss">
  78. </style>

测试效果

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