码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 你也想做一个Element-ui吧!!!——Blueの前端路(一)


    目录

    前言:

     父子组件

    button组件

     使用vue脚手架初始化一个项目

    如何封装,注册和使用一个组件

    main.js中将组件设置为全局

    使用

    此组件我们所需实现的内容

    type

    父组件组件传递type属性

    子组件接收负组件传递的数据

    通过绑定类名的方法动态控制样式

    设置不同类型的样式

    plain属性

    父组件组件传递plain值

    子组件接收负组件传递的数据,同样进行props校验,并且设置默认值为false

    通过绑定类名的方法动态控制样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式

    设置不同类型的样式,由于plain类型是以对象的形式在类中定义的,所以使用获取属性的方法定义样式

    round

    父组件传递round值

    子组件获取属性值:

    round样式

    子组件设置该选择器

    circle

    button组件中使用字体图标

    第一步: 在main.js中引入字体图标

    第二步:父组件传递图标名,子组件接收并且放到图标中

    父组件传值:

    子组件接收:

    使用接收到的字体图标。在没有传入icon时隐藏标签,在slot插槽没有传入值时,不显示标签

    设置icon配套样式,使图标和文字之间有一定间隔

    button组件中的点击事件

    组件中的定义点击事件:

    定义一个点击事件,这个点击事件的作用是调用父组件中的点击事件,并且回调

    父组件在使用时定义自己的点击事件,其本质是子组件中的点击事件触发父组件中的点击事件。

    结尾


    前言:

      又到了暑假了,俺最近想做一个属于自己的组件库类似Element-ui这样的东东,奈何本人也是一名新手,没有那么强的前端功力,所俺就边学边记录自己的学习过程,将自己的笔记和所遇到的问题写成csdn的文章,一是为了分享笔记,让更多朋友们能够轻松学习,二是在写笔记的途中,也可以总结提高。以下是我所观看的视频:

    http://【VUE进阶-从0到1搭建UI组件库(1-3)】https://www.bilibili.com/video/BV1nJ411V75n?p=7&vd_source=bb412cc25ca27e171f8e17085daad038

     父子组件

    父组件:为你所写的页面,该页面需要引入其他组件所以为父组件

    子组件:你所写的能够被引用到其他页面的东东

    button组件

     使用vue脚手架初始化一个项目

    使用vue created one-ui,创建一个名为one-ui的项目。

    按照自己的习惯设置脚手架风格,这里不多做介绍。

    脚手架搭建完毕后,将App.vue文件下的自带内容清理一下,为后续开发做准备。

    如何封装,注册和使用一个组件

    在componet下创建一个button.vue的文件,放置button组件代码。创建一个组建的button组件,,并且指定name为WssButton(按照自己想法来取名)。  

    1. <template>
    2. <button class="wss-button">
    3. 按钮组件
    4. button>
    5. template>
    6. <script>
    7. export default {
    8. name: 'WsButton'
    9. }
    10. script>
    11. <style lang="scss">
    12. style>

     

    main.js中将组件设置为全局

    1. import Button from './components/button.vue'
    2. Vue.component(Button.name, Button)//用此组件命名为我们取的名字

    使用

    1. <template>
    2. <div>
    3. <WsButton>one-button>
    4. div>
    5. template>

    此组件我们所需实现的内容

     

    type

    让按钮支持type属性,使得按钮支持不同样式

    父组件组件传递type属性

    App.vue:

    1. <template>
    2. <div class="app">
    3. <div class="row">
    4. <WsButton type="primary" @click="ww(123)">按钮WsButton>
    5. <WsButton type="success">按钮WsButton>
    6. <WsButton type="info">按钮WsButton>
    7. <WsButton type="warning">按钮WsButton>
    8. <WsButton type="danger">按钮WsButton>
    9. div>
    10. div>
    11. template>
    子组件接收负组件传递的数据

    button.vue代码:

    1. export default {
    2. name: 'oneButton',
    3. // 此时对props进行校验,值接收string类型的type值
    4. props: {
    5. type:{
    6. type: String,
    7. // 设置默认值:如果不传值,那么使用default
    8. default: 'default'
    9. }
    10. },
    11. created () {
    12. console.log(this.type)//defalut primary success info danger warning
    13. }
    14. }
    通过绑定类名的方法动态控制样式

    button.vue代码:

    1. <template>
    2. <button class="wss-button" :class="`wss-button-${type}`">
    3. <span><slot>slot>span>
    4. button>
    5. template>
    设置不同类型的样式

    button.vue代码:

    1. .wss-button
    2. {
    3. display: inline-block;
    4. line-height: 1;
    5. white-space: nowrap;
    6. cursor: pointer;
    7. background: #ffffff;
    8. border: 1px solid #dcdfe6;
    9. color: #606266;
    10. -webkit-appearance: none;
    11. text-align: center;
    12. box-sizing: border-box;
    13. outline: none;
    14. margin: 0;
    15. transition: 0.1s;
    16. font-weight: 500;
    17. //禁止元素的文字被选中
    18. -moz-user-select: none;
    19. -webkit-user-select: none;
    20. -moz-user-select: none;
    21. -ms-user-select: none;
    22. padding: 12px 20px;
    23. font-size: 14px;
    24. border-radius: 4px;
    25. &:hover,
    26. &:hover{
    27. color: #409eff;
    28. border-color: #c6e2ff;
    29. background-color: #ecf5ff;
    30. }
    31. }
    32. .wss-button-primary{
    33. color:#fff;
    34. background-color: #409eff;
    35. border-color: #409eff;
    36. &:hover,
    37. &:focus{
    38. background: #66b1ff;
    39. background-color: #66b1ff;
    40. color: #fff;
    41. }
    42. }
    43. .wss-button-success{
    44. color:#fff;
    45. background-color: #67c23a;
    46. border-color: #67c23a;
    47. &:hover,
    48. &:focus{
    49. background: #85ce61;
    50. background-color: #85ce61;
    51. color: #fff;
    52. }
    53. }
    54. .wss-button-info{
    55. color:#fff;
    56. background-color: #909399;
    57. border-color: #909399;
    58. &:hover,
    59. &:focus{
    60. background: #a6a9ad;
    61. background-color: #a6a9ad;
    62. color: #fff;
    63. }
    64. }
    65. .wss-button-warning{
    66. color:#fff;
    67. background-color: #e6a23c;
    68. border-color: #e6a23c;
    69. &:hover,
    70. &:focus{
    71. background: #ebb563;
    72. background-color: #ebb563;
    73. color: #fff;
    74. }
    75. }
    76. .wss-button-danger{
    77. color:#fff;
    78. background-color: #f56c6c;
    79. border-color: #f56c6c;
    80. &:hover,
    81. &:focus{
    82. background: #f78989;
    83. background-color: #f78989;
    84. color: #fff;
    85. }
    86. }

    plain属性

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

    父组件组件传递plain值

    App.vue的代码:

    1. <div class="row">
    2. <WsButton type="primary" plain>按钮WsButton>
    3. <WsButton type="success" plain>按钮WsButton>
    4. <WsButton type="info" plain>按钮WsButton>
    5. <WsButton type="warning" plain>按钮WsButton>
    6. <WsButton type="danger" plain>按钮WsButton>
    7. div>
    子组件接收负组件传递的数据,同样进行props校验,并且设置默认值为false

    button.vue代码:

    1. props: {
    2. plain: {
    3. type: Boolean,
    4. default: false
    5. }
    6. }

    通过绑定类名的方法动态控制样式,由于plain类型是布尔值,所以在类型中我们使用对象的形式来控制样式

    App.vue的代码:

    1. <template>
    2. <button class="wss-button" :class="[`wss-button-${type}`,{
    3. 'is-plain':plain
    4. }]">
    5. <span><slot>slot>span>
    6. button>
    7. template>
    设置不同类型的样式,由于plain类型是以对象的形式在类中定义的,所以使用获取属性的方法定义样式

    button.vue代码:

    1. // 朴素按钮样式
    2. .wss-button.is-plain{
    3. &:hover,
    4. &:focus{
    5. background: #fff;
    6. border-color: #489eff;
    7. color: #409eff;
    8. }
    9. }
    10. .wss-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. .wss-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. .wss-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. .wss-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. .wss-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属性和之前的相似,只要在组件中定义好了样式,动态获取属性值即可

    父组件传递round值

    App.vue代码:

    1. <div class="row">
    2. <WsButton type="primary" round>按钮WsButton>
    3. <WsButton type="success" round>按钮WsButton>
    4. <WsButton type="info" round>按钮WsButton>
    5. <WsButton type="warning" round>按钮WsButton>
    6. <WsButton type="danger" round>按钮WsButton>
    7. div>
    子组件获取属性值:

    button.vue代码

    1. round: {
    2. type: Boolean,
    3. default: false
    4. }
    round样式

    button.vue代码

    1. .wss-button.is-round{
    2. border-radius: 20px;
    3. padding: 12px 23px;
    4. }
    子组件设置该选择器

    button.vue代码

    1. <button class="wss-button" :class="[`wss-button-${type}`, {'is-plain': plain ,'is-round': round}>

    circle

    自己动手看看吧!!!!

    button组件中使用字体图标

    在项目中使用字体图标,首先需要有字体图标,我们可以去阿里巴巴矢量图标库下载。

    下载完成后,在asset目录下新建一个fonts目录,存放我们下载到的字体图标。

    第一步: 在main.js中引入字体图标
    import './assets/iconf/iconfont.css'
    第二步:父组件传递图标名,子组件接收并且放到图标中
    父组件传值:

    App.vue代码:

    1. <div class="row">
    2. <WsButton icon="dingbudaohang_xiaoxi" circle>WsButton>
    3. <WsButton type="primary" icon="cedaohang_shouye" circle>WsButton>
    4. <WsButton type="success" icon="cuowu" circle>WsButton>
    5. <WsButton type="warning" icon="touxiangxiala_shuaxin" circle>WsButton>
    6. <WsButton type="danger" icon="dingbudaohang_weizhigongneng" circle>WsButton>
    7. div>
    子组件接收:

    button.vue

    1. icon: {
    2. type: String,
    3. default: ''
    4. }
    使用接收到的字体图标。在没有传入icon时隐藏标签,在slot插槽没有传入值时,不显示标签

    button.vue

    1. <template>
    2. <button class="wss-button" :class="[`wss-button-${type}`,{
    3. 'is-plain':plain,
    4. 'is-round':round,
    5. 'is-circle':circle,
    6. }]">
    7. <i v-if="icon" :class="`icon-${icon}`">i>
    8. <span v-if="$slots.default"><slot>slot>span>
    9. button>
    10. template>
    设置icon配套样式,使图标和文字之间有一定间隔

    button.vue代码

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

    button组件中的点击事件

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

    组件中的定义点击事件:
    1. <template>
    2. <button class="wss-button" :class="[`wss-button-${type}`, {'is-plain': plain ,'is-round': round,'is-circle': circle}]" @click="clickthing">
    3. <i v-if="icon" class="iconfont" :class="`icon-${icon}`">i>
    4. <span v-if="$slots.default"><slot>slot>
    5. span>
    6. button>
    7. template>
    定义一个点击事件,这个点击事件的作用是调用父组件中的点击事件,并且回调
    1. methods: {
    2. clickthing (e) {
    3. this.$emit('click', e)
    4. }
    5. }
    父组件在使用时定义自己的点击事件,其本质是子组件中的点击事件触发父组件中的点击事件。
     <WsButton type="primary" @click="ww(123)">按钮WsButton>
    1. <script>
    2. export default {
    3. methods: {
    4. ww (a) {
    5. console.log(a)
    6. }
    7. }
    8. }
    9. script>

    结尾

    一起加油吧!!!

  • 相关阅读:
    跨境分析 | 疫情之下跨境电商如何选品?这类商品亚马逊销量不降反增
    C++标准模板(STL)- 类型支持 (std::size_t,std::ptrdiff_t,std::nullptr_t)
    Qt监控目录文件变化:QFileSystemWatcher用法
    xpath获取带命名空间节点注意事项
    猿创征文 |【SpringBoot】SSM“加速器”SpringBoot初体验
    鸿蒙特色物联网实训室
    Pycharm专业版注册教程
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[7]比特币-分叉
    vue手搓悬浮在线客服按钮
    【BOOST C++ 13 并行编程】(3) Futures和 Promises线程
  • 原文地址:https://blog.csdn.net/m0_75148088/article/details/140385846
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号