一、效果展示
图片展示:
效果展示视频:(忽略清朝画质)
二、前置知识点
1.解构赋值:数组解构、对象解构
2.事件委托,利用冒泡原理为多个元素绑定事件
3.forEach()--遍历数组,循环;filter()筛选数组
4.箭头函数
三、练习素材(html+css)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>第一天练习</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
li {
list-style: none;
}
a {
text-decoration: none;
}
.viewPort {
width: 1024px;
height: 780px;
margin: 0 auto;
}
.list {
margin-top: 30px;
display: flex;
width: 1024px;
flex-wrap: wrap;
}
.item {
width: 240px;
margin-left: 10px;
padding: 20px 30px;
transition: all .5s;
margin-bottom: 20px;
}
.item:nth-child(4n) {
margin-left: 0;
}
.item:hover {
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
transform: translate3d(0, -4px, 0);
cursor: pointer;
}
.item img {
width: 100%;
}
.item .name {
font-size: 18px;
margin-bottom: 10px;
color: #666;
}
.item .price {
font-size: 22px;
color: firebrick;
}
.item .price::before {
content: "¥";
font-size: 14px;
}
.filter {
display: flex;
width: 990px;
margin: 0 auto;
padding: 50px 30px;
}
.filter a {
padding: 10px 20px;
background: #f5f5f5;
color: #666;
text-decoration: none;
margin-right: 20px;
}
.filter a:active,
.filter a:focus {
background: #05943c;
color: #fff;
}
</style>
</head>
<body>
<div class="viewPort">
<div class="filter">
<a data-index="1" href="javascript:;">0-100元</a>
<a data-index="2" href="javascript:;">100-300元</a>
<a data-index="3" href="javascript:;">大于300元</a>
<a href="javascript:;">全部区间</a>
</div>
<div class="list">
<!-- <div class="item">
<img src="" alt="">
<p class="name"></p>
<p class="price"></p>
</div> -->
</div>
</div>
<script>
// 2. 初始化数据
const goodsList = [
{
id: '4001172',
name: '称心如意手摇咖啡磨豆机咖啡豆研磨机',
price: '289.00',
picture: 'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg',
},
{
id: '4001594',
name: '日式黑陶功夫茶组双侧把茶具礼盒装',
price: '288.00',
picture: 'https://yanxuan-item.nosdn.127.net/3346b7b92f9563c7a7e24c7ead883f18.jpg',
},
{
id: '4001009',
name: '竹制干泡茶盘正方形沥水茶台品茶盘',
price: '109.00',
picture: 'https://yanxuan-item.nosdn.127.net/2d942d6bc94f1e230763e1a5a3b379e1.png',
},
{
id: '4001874',
name: '古法温酒汝瓷酒具套装白酒杯莲花温酒器',
price: '488.00',
picture: 'https://yanxuan-item.nosdn.127.net/44e51622800e4fceb6bee8e616da85fd.png',
},
{
id: '4001649',
name: '大师监制龙泉青瓷茶叶罐',
price: '139.00',
picture: 'https://yanxuan-item.nosdn.127.net/4356c9fc150753775fe56b465314f1eb.png',
},
{
id: '3997185',
name: '与众不同的口感汝瓷白酒杯套组1壶4杯',
price: '108.00',
picture: 'https://yanxuan-item.nosdn.127.net/8e21c794dfd3a4e8573273ddae50bce2.jpg',
},
{
id: '3997403',
name: '手工吹制更厚实白酒杯壶套装6壶6杯',
price: '99.00',
picture: 'https://yanxuan-item.nosdn.127.net/af2371a65f60bce152a61fc22745ff3f.jpg',
},
{
id: '3998274',
name: '德国百年工艺高端水晶玻璃红酒杯2支装',
price: '139.00',
picture: 'https://yanxuan-item.nosdn.127.net/8896b897b3ec6639bbd1134d66b9715c.jpg',
},
]
四、功能JS模块
1.渲染函数的封装
function(arr){
let str = "" //声明一个空字符串
arr.forEach(item => {
const {name,picture,price} = item //对象解构,快速批量的声明变量,缩减代码量
str += `
<div class="item">
<img src=${picture} alt="">
<p class="name">${name}</p>
<p class="price">${price}</p>
</div>
`
//arr中有几个元素就渲染几个div,将数据填入 ${},动态渲染
})
document.queryselector(".list").innerHTML = str //将字符串放入.list的div盒子中
}
render(goodsList) //调用函数
2.绑定点击事件
//事件委托,为父元素绑定点击事件
document.queryselector("filter").addEventListener("click",e =>{
const {tagName,dataset} = e.target //获取点击对象+对象解构
let arr = goodsList //因为如果都不点击就显示全部元素,所以初始值将arr直接等于goodsList
if(tagName === "A"){ //点击a标签时才触发,点击父元素空白区域不触发
if (dataset.index === "1") {
arr = goodsList.filter(item => item.price > 0 && item.price <= 100)
} else if (dataset.index === "2") {
arr = goodsList.filter(item => item.price >= 100 && item.price <= 300)
} else if (dataset.index === "3") {
arr = goodsList.filter(item => item.price >= 300)
}
render(arr)
}
})
五、易错点
1.对象解构时,例如const {name,price} = item //这里是花括号,数组解构时是[]。并且对象解构时声名的变量名必须和数据中的属性名一致
2.函数不调用不执行,封装好函数后一定要调用执行
3.箭头函数省略原则:参数只有一个时,()可以省略;若函数中只有一句return语句时,{}和return都可以省略;!!!没有参数时,()一定不要省