「站在上帝的角度」谈谈Element组件结构-Switch

简介: 「站在上帝的角度」谈谈Element组件结构-Switch

前言👋


  • 用户就是上帝,站在上帝的角度也就是站在使用者的角度去看待组件。
  • 用过不少优秀的UI库,用的时候美滋滋,轮到自己搭组件库的时候往往会去参考别人的源码。
  • 看完源码后恍然大悟 噢!原来可以这样写,但心里难免会有疑惑别人是怎么想出来这种解决思路的?🤳
  • 这一系列文章主要是面向未理解或者有疑惑的同学所以讲的比较基础,就让我们站在用户的角度去思考结构,看看换一种思路去写代码是不是有变化?


关于Switch组件🥽


为什么我们会用到switch


作为用户👨‍💼

  • 想到选择,你们会想到什么,有的人第一时间会想到下拉框,而有的人第一时间会想到switch开关。
  • 在我记事以来我遇到的第一个switch可能就是我那台小小的iphone飞行模式的开关了,那时候还不是前端工程师,看到那个之后就觉得特别好看简洁,觉得其他的都low爆了。
  • 相信不只是我被switch简约的风格给迷住,往往我们在遇到只有两个选项的问题时更多希望遇到的是开关而不是下拉框,比如一个表单属性的()(成功失败)


作为组件库使用者👨‍💻

  • 当我们将组件库的switch组件放到我们的页面我们想要的效果是什么?
  • 简约
  • 可以满足基本的切换需求
  • 可以在基本的需求上进行定制增加功能(比如:颜色属性大小是否添加文字
  • 在某一个方面来说,switch也可以规避一个字段是否必填必选,相信大家有遇到过这样的需求,在制作表单时往往需要对某一个字段判断'有没有填写''是否为空' 然后弹出一行红色的提示说'此项不能为空',然而使用了switch则可以避免用户不选选错这种情况发生也不用丑陋的红色提示占了页面位置。


搭建组件⚒️


接下来可能用尽可能少的代码搭配element的源码进行结构说明,配合element Switch源码食用更加美味喔


基本架子🔨

  • 要设计一个switch非常简单,在看element源码之前我也自己写过一个switch,要想让上图的开关动起来其实只是中间白色那块在一个绿色的容器里面改变了定位位置而已然而当点击了开关后背景从绿色会变成其他颜色来给一种视觉上是动了起来
  • 总结起来总共也只有3个要点
  • 准备一个外部的容器
  • 准备一个内部的圆圈
  • 点击时改变外部容器的颜色和内部圆圈的定位位置顺带加上亿点点的过渡效果
  • 根据不同的状态改变不同的input值从而实现双向绑定
<template>
  <div class="el-switch">
    <input type="checkbox" class="el-switch__input">
    <span ref="core" class="el-switch__core">
    </span>
  </div>
</template>
复制代码
  • 以上就是element最简单的switch结构,可以看到外部是由一个div包裹住inputspan
  • 这个input就是方便我们做双向绑定接收,当然要把他隐藏掉我们不希望他出现在页面中,我们只需要它的功能就好了

  • 然后是接下来的span,在element中这个span就是外部的容器了,然后在这个容器中巧妙地运用了伪元素来制作一个白色的圈圈,上图是该switch的基本样式,运用了BEM的命名结构,如果不了解BEM的可以看到我之前的一篇介绍,这里主要就是将中间的伪元素做了定位处理让它一开始的时候在最左边。


双向绑定🎶

  • 当然现在的switch是没有动效的,我们要给组件传入v-model绑定属性
<template>
<l-switch v-model="value"></l-switch>
</template>
<script>
  export default {
    data () {
      return {
        value: false
      };
    }
  }
</script>
复制代码
  • 父组件用v-model进行传值,v-model提供了一个value值和一个input方法,子组件props接收value数值并增加一个点击事件改变父组件的input方法即可实现双向绑定。
  • 现在点击switch是可以让value动态变化的,上述默认的是一个圆圈在最左边代表未选中的情况,新增一个圆圈在最右边的class顺便改变背景颜色,接下来只需要为组件动态切换class就可以了。

template
<div
    class="el-switch"
    :class="{ 'is-checked': checked }"
    @click="switchValue"
  >
    <input ref="input" type="checkbox" class="el-switch__input" :value="value">
    <span ref="core" class="el-switch__core">
    </span>
  </div>
script
export default {
   props:{
    value: {
      type: [Boolean, String, Number],
      default: false
    }
   },
   computed: {
     checked() {
       return this.value;
     },
   },
   methods:{
    switchValue() {
       this.handleChange();
     },
    handleChange() {
      this.$emit('input', !this.value);
    },
   }
};
复制代码

  • 至此一个最简单switch就做好了


更多需求🧮

  • 往往我们不局限于这一简单的功能,还需要添加禁用,改变大小等功能
  • 我们只需要给子组件传入不同的属性,在子组件通过判断该属性值得不同来处理逻辑即可


写在最后👋


  • 总的来说switch组件相对于其他复杂组件比较简单,一般的处理逻辑就是父组件要想v-model一个值到子组件,子组件就必须设置一个valueprops,并且使用$emit来改变父组件的input的事件,再相应的做些处理即可。
  • 对于组件库的搭建我也在慢慢的摸索,讲的都是我自己得出来的分享所以说可能对于大佬来说会比较基础,但我相信我的不断输出可以帮助到一些有疑惑的同学。
  • 如果您觉得这篇文章有帮助到您的的话不妨🍉关注+点赞+收藏+评论+转发🍉支持一下哟~~😛


往期精彩🌅


如何优雅的使用Vuepress编写组件示例(上)👈

如何优雅的使用Vuepress编写组件示例(下)👈

样式命名有多难?浅谈BEM命名规范⚡

「站在上帝的角度」谈谈Element组件结构-Radio



相关文章
|
前端开发 JavaScript 索引
三大应用场景调研,Webpack 新功能 Module Federation 深入解析
Federated Modules 是一个令人激动的功能,它可能会改变未来几年的前端打包方式,作者深入分析了 Module Federation 的原理及其应用场景,希望能对大家有所启发。
12514 0
三大应用场景调研,Webpack 新功能 Module Federation 深入解析
|
8月前
|
人工智能 安全 Go
go快速上手:golang中的反射
本文深入解析Go语言反射机制,涵盖reflect包的核心类型与操作方法,通过实例演示如何动态获取类型信息、修改值及调用方法,并探讨反射的高级用法与注意事项,帮助开发者合理高效地使用反射。
384 1
|
安全 Linux 网络安全
如何在 CentOS 7 上为 Apache 创建 SSL 证书
如何在 CentOS 7 上为 Apache 创建 SSL 证书
381 0
|
存储 API 计算机视觉
自学记录HarmonyOS Next Image API 13:图像处理与传输的开发实践
在完成数字版权管理(DRM)项目后,我决定挑战HarmonyOS Next的图像处理功能,学习Image API和SendableImage API。这两个API支持图像加载、编辑、存储及跨设备发送共享。我计划开发一个简单的图像编辑与发送工具,实现图像裁剪、缩放及跨设备共享功能。通过研究,我深刻体会到HarmonyOS的强大设计,未来这些功能可应用于照片编辑、媒体共享等场景。如果你对图像处理感兴趣,不妨一起探索更多高级特性,共同进步。
666 11
报错
下载数据后,从本地缓存加载出错
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
存储 开发框架 JSON
uni-app 73聊天类封装(八)-添加聊天记录,在移动应用开发中,聊
uni-app是跨平台移动应用开发框架,简化了聊天功能的实现。开发聊天应用涉及数据存储(如IndexedDB、SQLite、云服务)、数据结构设计、消息发送(WebSocket或HTTP接口)、消息接收与展示(组件化开发,如`&lt;view&gt;`、`&lt;scroll-view&gt;`)及消息保存。通过uni-app的组件和插件,开发者能高效实现聊天记录的完整流程。[Read more](http://colorsound.cn/post/173.html?093671)
472 0
|
机器学习/深度学习 人工智能 弹性计算
智能化运维:AI在故障预测与自我修复系统中的应用
随着技术的不断进步,传统的运维模式已逐渐不能满足现代企业的需求。本文将探讨如何通过人工智能技术,特别是机器学习和深度学习算法,实现对IT系统的实时监控、故障预测以及自动化修复。我们将分析AI技术在智能运维中的具体应用案例,并讨论其带来的效率提升和成本节约效果。文章旨在为读者提供一种全新的运维视角,展示AI技术在提高系统稳定性和减少人工干预方面的潜力。
|
缓存 监控 前端开发
前端性能监控:从Lighthouse到Real User Monitoring
**前端性能监控关乎用户体验。Lighthouse是自动化审计工具,评估网页性能、最佳实践、可访问性等,通过CLI或Chrome DevTools使用。RUM则实时监控用户与网站互动,收集性能数据。两者结合,从开发到生产环境,全面优化前端性能,包括资源加载、代码优化、网络性能和用户体验。使用Lighthouse和RUM数据,结合CI/CD,持续改进并设定性能预算,采用SSR、Service Worker、Code Splitting等高级策略,确保高性能和用户满意度。**
510 2
|
SQL JavaScript 前端开发
简单用Nodejs + express 编写接口
【6月更文挑战第3天】该文介绍了如何在Node.js和Express中创建GET和POST接口。首先,简要提到了准备工作,建议查阅上一篇文章。接着展示了GET接口的示例,说明可以直接在浏览器中请求。然后,详细解释了POST接口的步骤,包括引入Express模块、设置路由处理程序、解析请求体及处理请求。最后,强调了编写接口时应注意错误处理、安全性、中间件使用、路由组织、日志记录、性能优化和测试等关键点。作者以肥晨的身份结尾,鼓励关注其分享的前端学习资料和技术动态。
469 1

热门文章

最新文章