这是我参与「第四届青训营 」笔记创作活动的第6天
写好JS的一些原则
各司其职: 让HTML,CSS,和JavaScript只能分离
案例: 写一段JS, 控制一个页面, 让它支持浅色和深色两种浏览模式, 如果你来实现, 你会怎么做.
新人版本: JS直接操作DOM, 修改字体颜色, 修改文本内容. 这是不可取的, 违反了"各司其职"的有原则
优化版本: 减少JS对DOM的操作. 在CSS中书写"浅色模式"与"深色模式"两种样式的CSS, 然后通过JS修改类名className方式,来切换样式模式.
终极版本: 不写JS代码. 通过checkbox来扩展其作用范围到夜间切换的小图标, 然后在CSS中 通过点击下图标改变checkbox的状态来给content加上另一种反色样式
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.content {
width: 100px;
height: 100px;
background-color: white;
transition: all 1s;
}
#modeCheckBox:checked+.content {
background-color: black;
color: white;
width: 100px;
height: 100px;
font-size: 30px;
}
/* #modeBtn::after {
content:'☀';
}
#modeCheckBox:checked + .box #modeBtn::after {
content:'🌙';
} */
</style>
</head>
<body>
<!-- 位置1 -->
<label for="modeCheckBox" id="modeBtn">按钮1</label>
<input type="checkbox" id="modeCheckBox">
<!-- 位置2 -->
<!-- <label for="modeCheckBox" id="modeBtn">按钮2</label> -->
<div class="content">
<!-- 位置3 -->
<!-- <label for="modeCheckBox" id="modeBtn">按钮3</label> -->
<div class="box">这是个盒子</div>
</div>
<!-- 位置4 -->
<!-- <label for="modeCheckBox" id="modeBtn">按钮4</label> -->
<!-- <input type="checkbox" id="modeCheckBox"> -->
</body>
总结:
- HTML/CSS/JS各司其责
- 应该避免不必要的由JS直接操作的样式
- 可以用class来表示状态
- 纯展示类交互寻求零JS方案
组件封装: 好的UI组件具备正确性, 扩展性, 复用性
书写轮播图
结构HTML
使用ul+li无序列表来实现
表现CSS
CSS:
- 使用CSS绝对定位将图片重叠在同一位置
- 轮播图切换的状态使用修饰符(modifier)
- 轮播图的切换动画使用CSS tansition
行为JS
API:
- 得到当前的选中元素
- 得到当前选中元素的索引
- 滑动到哪个index的元素上的方法
- 轮播下一张图片
- 轮播上一张图片
重构: 模板化
解耦: 将HTML模板化, 更易于扩展
抽象: 通过组件通用模型抽象出来
总结
组件设计的原则: 封装性, 正确性, 扩展性, 复用性
实现组件的步骤: 结构设计, 展现效果, 行为设计
三次重构: 模板化, 插件化, 抽象化(组件框架)
组件是指web页面上抽象出来一个个含模板(HTML), 功能(JS) 和样式(CSS)的单元. 好的组件具备四种特性.
过程抽象: 应用函数式编程思想/范式
过程抽象: 用来处理局部细节控制的一些方法; 函数式变成思想的基础应用
点击保证只执行一次
经典的过程抽象 once 函数
高阶函数: 以函数为参数, 以函数作为返回值, 常用于作为函数装饰器
Throttle 节流函数, mousemove限制
Debounce 防抖函数 自动保存
键盘300ms不触发 才执行自动保存
Consumer/2
每隔一个时间 执行这个代码
延时调用
iterative: 迭代器
为什么要用高阶函数去解决这些问题?
纯函数: 结果可预期, 无副作用
非纯函数
调用次数影响
命令式于声明式
命令式: 怎么做, 注重解决的每一个步骤,
声明式: 做什么, 封装函数, 使用通过调用方法来达到目的
当需要修改代码时, 声明式更有优势,只需要添加状态;命令式需要增加代码逻辑
写代码应该注意: 使用场景
repeat 比 for while 在短字符 补齐 性能更好
交通灯
数据抽象
过程抽象
函数式交通灯