【青训营】写好JS——组件封装(上)

简介: 【青训营】写好JS——组件封装(上)

组件是指Web页面上抽出来一个个包含模版(HTML)、功能(JS)和样式(CSS)的单元。好的组件具备封装性、正确性、扩展性、复用性。


例子:轮播图



如果要你用原生JS写一个电商或视频网站上常见的轮播图,应该怎么实现?怎么封装成组件?怎么让它的扩展性和复用性更高?


image.png


1. 结构设计



轮播图是一个典型的列表结构,我们可以用无序列表ul>li*4来实现,然后根据效果图插入4张图片即可:



这里我们使用的命名是一种CSS的书写规范,叫做BEM,是英文Block-Element-Modifier的简写,这一规范采用三个部分来描述规则,其中:


  • __:双下划线用来连接块和块的子元素
  • -:单中划线仅作为连字符使用,连接块或元素或修饰符的多个单词
  • --:双中划线用来连接块或元素的状态

这样命名可以将用户界面分隔为独立的块,从而使开发复杂的UI界面变得更简单,代码可读性也更强。


上面的HTML结构中,我们使用a元素分别表示上一张和下一张:


<a class="slider__previous"></a>
<a class="slider__next"></a>
复制代码

span*4表示底部的四个小圆点:


<div class="slider__control">
  <span class="slider__control-buttons--selected"></span>
  <span class="slider__control-buttons"></span>
  <span class="slider__control-buttons"></span>
  <span class="slider__control-buttons"></span>
</div>
复制代码


2. 展现效果



根据效果图我们继续添加CSS样式,首先设置宽高,隐藏列表样式:


.slider {
  position: relative;
  width: 790px;
  height: 340px;
}
.slider ul {
  list-style-type:none;
  position: relative;
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
}
复制代码

将图片重叠,只显示.slider__item--selected


.slider__item,
.slider__item--selected {
  position: absolute;
  transition: opacity 1s;
  opacity: 0;     /* 完全透明 */
  text-align: center;
}
.slider__item--selected {
  transition: opacity 1s;
  opacity: 1;
}
复制代码

能够上下切换的左右箭头:


最后定义底部的4个小圆点:


3. API设计



API的设计应保证原子操作,职能单一,满足灵活性。


我们先简单分析一下需求:


  1. 图片循环播放,每张停留若干时间
  2. 点击左右箭头可以上下切换
  3. 鼠标悬浮在底部小圆点上时会跳到对应图片
  4. 小圆点也会随着图片滚动


根据需求和月影大大的设计要求,我们设计了几个组件API:


将其封装成一个类:


然后通过setInterval()实现循环播放,间隔为3秒:


const container = document.querySelector('.slider');
const slider = new Slider(container);
setInterval(() => {
  slider.slideNext();
}, 3000);
复制代码


4. 用户控制



在JS代码中,一个方法一般来说最多只能有15行代码,超过了就需要重构。


实现了API后,我们需要实现用户控制,根据需求修改构造器:


image.png


用定时器来实现stop()start(),当鼠标移动到小圆点上(mouseover),判断是第几个小圆点,停止循环播放,切换到对应图片,当鼠标移出后(mouseout)再开始循环。


start() {
  this.stop();
  this._timer = setInterval(() => this.slideNext(), this.cycle);
}
stop() {
  clearInterval(this._timer);
}
复制代码

然后我们处理自定义的slide事件,修改slideTo()


slideTo(idx) {
  ...
  // 触发自定义事件slide
  const detail = {index: idx};
  const event = new CustomEvent('slide', {bubbles: true, detail});
  this.container.dispatchEvent(event);
}
复制代码

最后将调用过程修改一下,组件的全部功能就完成了。


const container = document.querySelector('.slider');
const slider = new Slider({container});
slider.start();
复制代码

通过轮播图组件编写过程,我们可以总结一下组件设计的一般性步骤:


  1. 结构设计和展现效果(HTML&CSS)
  2. 设计组件API
  3. 设计用户控制流程


我们实现的轮播组件实现了封装性和正确性,但是缺少了可扩展性,这个组件只能满足自身的使用,很难扩展到其他的组件。而且当有功能变化时,也需要修改其自身内部的代码。


比如当产品经理希望将图片下方的小圆点去掉只保留左右箭头时,在这个版本中我们就需要注释或修改所有与小圆点相关的代码,而且当有新的用户控制需求时,我们都需要涉及核心代码的修改,所以如何避免这样的修改,让组件具备可扩展性和复用性就是我们下节要做的事情了。

目录
相关文章
|
2月前
|
前端开发 数据安全/隐私保护
crypto-js中AES的加解密封装
文章介绍了如何在前端使用crypto-js库进行AES加密和解密,提供了加解密的函数封装示例,并演示了如何加密和解密字符串或对象。
186 1
crypto-js中AES的加解密封装
|
3月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
142 0
|
20天前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
2月前
|
设计模式 JavaScript
JS发布订阅模式封装(纯手工)
发布订阅模式是JS常用的设计模式,在面试中也会经常遇到,以下是我的手写实现方式,经测试效果不错,小伙伴们们可以直接拷贝使用。
|
2月前
|
Web App开发 JavaScript 前端开发
用 JavaScript 创建 XPCOM 组件
用 JavaScript 创建 XPCOM 组件
|
3月前
|
JavaScript 前端开发 测试技术
[译]: Vue.js 函数式组件:what, why & when?
[译]: Vue.js 函数式组件:what, why & when?
[译]: Vue.js 函数式组件:what, why & when?
|
3月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
130 0
|
3月前
|
JavaScript 开发者
揭秘Vue.js生命周期钩子:它们是如何掌控组件的生与死?
【8月更文挑战第30天】Vue.js 的生命周期钩子是开发者必须掌握的关键概念,它涵盖了组件从创建、挂载、更新到销毁的整个过程,提供了在特定时机操作DOM、获取数据或执行逻辑的能力。从 `beforeCreate` 到 `unmounted`,每个阶段都有特定的任务:如 `created` 适合异步数据获取,`mounted` 用于DOM操作,而 `beforeUnmount` 则用于清理资源。
24 0
|
3月前
|
JavaScript 前端开发
揭秘Vue.js组件魔法:如何轻松驾驭前端代码,让维护变得轻而易举?
【8月更文挑战第30天】本文探讨了如何利用Vue.js的组件化开发提升前端代码的可维护性。组件化开发将复杂页面拆分为独立、可复用的组件,提高开发效率和代码可维护性。Vue.js支持全局及局部组件注册,并提供了多种组件间通信方式如props、事件等。通过示例展示了组件定义、数据传递及复用组合的方法,强调了组件化开发在实际项目中的重要性。
37 0
|
3月前
|
存储 缓存 自然语言处理
深入理解JS | 青训营笔记
深入理解JS | 青训营笔记
38 0