实现拖放功能
在这一步中,你将为在线购物车实现拖放功能。
- 打开
trolley.vue
文件。
- 在
data()
函数中,你可以看到 goods
数组,它包含了商品信息。这些数据将用于在“商品列表”部分显示商品。
- 在
methods
部分添加以下代码:
methods: {
dragstart(e, good) {
e.dataTransfer.setData("name", good.name);
e.dataTransfer.setData("price", good.price);
},
dragover(e) {
e.preventDefault();
},
drop(e) {
const { bought } = this;
const name = e.dataTransfer.getData("name");
const price = e.dataTransfer.getData("price");
bought.push({ name, price: Number(price) });
}
}
解释:
dragstart
方法在用户开始拖动商品时被调用。它在 dataTransfer
对象中设置商品名称和价格,稍后可以在 drop
方法中访问。
dragover
方法在被拖动的项目悬停在购物车上时被调用。它阻止了浏览器的默认行为,这对于 drop
事件的正常工作是必要的。
drop
方法在用户将拖动的项目放入购物车时被调用。它从 dataTransfer
对象中获取商品名称和价格,并将商品添加到 bought
数组中。
- 在
computed
部分添加以下代码:
computed: {
totalPrice() {
const { bought } = this;
var sum = 0;
for (key in bought) {
sum += bought[key].price;
}
return sum;
},
goodsDetail() {
const { bought } = this;
const names = [];
const goods = [];
for (key in bought) {
names.push(bought[key].name);
}
function getRepeatNum() {
return names.reduce(function (prev, next) {
prev[next] = prev[next] + 1 || 1;
return prev;
}, {});
}
for (key in getRepeatNum()) {
goods.push(`${key}*${getRepeatNum()[key]}`);
}
return goods.join(" ");
}
},
解释:
totalPrice
计算属性计算购物车中商品的总价。
goodsDetail
计算属性生成购物车中商品的详细信息,显示商品名称和数量。