vue项目中购物车的全选功能的实现
主要思路:
1、单个商品的复选框的选中状态标识flag需要存到数据库中,每个商品添加到购物车时的默认为选中状态,所以全选按钮初始值设置为选中状态。
2、mounted渲染页面时从数据库取出数据,遍历数据中的flag值,来设置全选按钮的状态
3、全选按钮的事件触发为click(有试过change的,有bug),在事件中对全选的changed值进行取反,调用接口函数将数据库中的所有商品的flag值设为和changed相同,前端效果的更新(节省服务器资源) - 全选选中,则全部选中,全选不选中,则全部不选中,即实现了全选按钮控制全部商品选中和不选中的功能。
4、单选按钮事件为change,传入当前点击商品信息为参数,如果当前flag为true,则使用every遍历所有购物车商品的flag值,将结果赋给全选的checked
,如果当前flag为false,则checked的值为false。
业务代码:
data () { return { cartlist: [], checked: true, // 代表的全选是不是被选中 testflag: true // 标识 } }, methods: { selectItem (item) { console.log(item) // 如果我当前点击的这个商品复选框是true,那么就去cartlist中去查询 // 将every遍历的结果赋给全选框 updateItemFlag({ cartid: item.cartid, num: item.flag ? 1 : 0 }).then(() => { if (item.flag) { const val = this.cartlist.every(item => { return item.flag }) this.checked = val this.testflag = val } else { // 如果我当前点击的商品复选框是false,那么就直接将全选框设为false this.checked = false this.testflag = false } }) }, selectAll (event) { // console.log(event) // 每次点击都会切换标识 this.testflag = !this.testflag // 选中的状态和标识一致 this.checked = this.testflag console.log(this.checked) updataAllFlag({ userid: localStorage.getItem('userid'), num: this.checked ? 1 : 0 // 后端接收的状态是number类型 }).then(res => { // 前端效果的更新 - 全选选中,则全部选中,全选不选中,则全部不选中 this.cartlist.map(item => { // 双向绑定,数据改变自动渲染view层 item.flag = this.checked }) }) }, onSubmit () { console.log('提交订单') }, changeNum (value, detail) { console.log(value, detail) updateCart({ cartid: detail.name, num: value }).then(res => { // 更新成功 }) }, deleteItem (item, index) { Dialog.confirm({ message: '亲,便宜不等人,请三思而行' }).then(() => { // on confirm deleteCart({ cartid: item.cartid }).then(res => { // 删除之后更新列表数据 this.cartlist.splice(index, 1) // 删除完数据,计算属性具有依赖性,删除数据时,原数据发生改变 // 计算属性重新计算 // if (this.cartlist.length === 0) { // Toast('购物车空空如也') // this.flag = true // } else { // this.flag = false // } }) }).catch(() => { // on cancel }) } }, computed: { totalNum () { return this.cartlist.reduce((sum, item) => { return item.flag ? sum + item.num : sum + 0 }, 0) }, totalPrice () { return this.cartlist.reduce((sum, item) => { return item.flag ? sum + item.num * item.price : sum + 0 }, 0) }, lenFlag () { if (this.cartlist.length === 0) { return true } else { return false } } }, mounted () { getCartData({ userid: localStorage.getItem('userid') }).then(res => { // if (res.data.data.length === 0) { // Toast('购物车空空如也') // this.flag = true // } else { // console.log(res.data.data) // this.cartlist = res.data.data // this.flag = false // } this.cartlist = res.data.data // console.log(111) // console.log(res.data.data) const val = this.cartlist.every(item => { return item.flag }) this.checked = val this.testflag = val }) }