侦听综合运用

Watch

实验题目
购物车
实验目的
掌握侦听器 Watch 的基本使用
进一步理解 Vue 的响应式数据
进一步熟悉事件和事件修饰符的使用
实验内容

使用侦听处理业务

全选
部分选择
结算
参考效果和参考代码
准备工作

.引入监听包 watch


      

.取消结构中的事件绑定

.注释或移除之前的事件处理函数:全选 selAll 和部分选 selItem

引入 flag 辅助判断;默认是真;初值也可以为假,后面的逻辑判断相应调整即可
let flag = true
全选侦听 - selectedAll

.使用函数返回购物车数据 cartData 中的全选 selectedAll

.只有 flag 为真时,才真正置空购物车数据;利用 flag 保留选中的部分数据

watch(() => cartData.selectedAll, (newVal) => {
  if (newVal) {
    cartData.selectedLists = [...cartData.lists]
  } else {
    if (flag) cartData.selectedLists = []
  }
})
单选侦听 - 商品选中列表 selectedLists - 使用函数返回方式

.如果选中列表长度和商品列表长度相等,则全选为真,同时置 flag 为真;否则全为假

watch(() => cartData.selectedLists, (newVal) => {
  if (newVal.length == cartData.lists.length && cartData.lists.length) {
    cartData.selectedAll = true
    flag = true
  } else {
    cartData.selectedAll = false
    flag = false
  }
})
结算侦听 - 选择列表商品的数量的变化,更新总价

.深度侦听:数量是对象的一个属性

.立即侦听:页面渲染完毕也应该结算异常

.重新声明一个 ref 数据 sum 为结算总价,替换结构中的计算属性 getTotal

let sum = ref(0)

.改写商品选中列表的侦听如下

watch(() => cartData.selectedLists, (newVal) => {
  if (newVal.length == cartData.lists.length && cartData.lists.length) {
    cartData.selectedAll = true
    flag = true
  } else {
    cartData.selectedAll = false
    flag = false
  }
  sum.value = cartData.selectedLists.reduce((sum, item) => {
    return sum + item.quantity * item.price
  }, 0).toFixed(2)
}, { deep: true, immediate: true })        
拓展与思考
为项目增加删除功能;删除时,不仅要删除商品列表 lists 的数据;还要删除选中商品列表 selectedLists 的数据;另外,如果商品列表为空,还要注意全选标记是否正常
增加排序:价格、库存等字段的升序、降序
体会 watch 和表单的 change 事件有何异同
说明

现场验收、课后提交实验报告

在开发环境中获取数据并渲染