地址列表渲染首先是前端通过axios发送get请求,接受一个回调拿到数据
response.data的数据为
地址列表在result中
{"status":"0","msg":"","result":[{"addressId":"100001","userName":"JackBean","streetName":"北京市朝阳区朝阳公园","postCode":100001,"tel":12345678901,"isDefault":true},{"addressId":"100006","userName":"Cherry","streetName":"北京市海淀区回龙观","postCode":100009,"tel":10655555,"isDefault":false},{"addressId":"100006","userName":"Cherry","streetName":"北京市海淀区回龙观","postCode":100009,"tel":10655555,"isDefault":false},{"addressId":"100007","userName":"Joke","streetName":"北京市朝阳区望京","postCode":100010,"tel":13619898722,"isDefault":false},{"addressId":"100008","userName":"Frank","streetName":"北京市海淀区中关村软件园","postCode":100011,"tel":10125652345,"isDefault":false}]}
init(){
axios.get("/users/cartList").then((response)=>{
let res = response.data;
this.cartList = res.result;
})
}
后端接口收到get请求,拿到已登录用户cookie中的用户id,根据用户ID查找数据,若查找成功,返回用户的购物车列表
router.get("/addressList",function (req,res,next) {
var userId = req.cookies.userId;
User.findOne({userId:userId},function (err,doc) {
if(err){
res.json({
status:"1",
msg:err.message,
result:''
})
}else{
res.json({
status:"0",
msg:'',
result:doc.addressList
})
}
})
})
前端拿到数据渲染到界面
- {{item.userName}}
- {{item.streetName}}
- {{item.tel}}
在默认状态下只显示三条地址数据,点击more时才展开所有数据
使用computed计算
在computed中定义一个方法去addressListFilter动态截取地址列表的值,遍历的时候也是遍历返回的数组,默认limit是3
computed:{
addressListFilter(){
//数组动态控制,通过数据的slice方法返回一个全新的数组,不影响原数组
return this.addressList.slice(0,this.limit);//截取三条数据
}
},
在 more上定义一个方法expand,绑定一个open时间,当limit>3时,为true,箭头朝上
more
expand方法来修改limit的值,从而达到一个展开的效果。
expand(){
//如果此时数组显示长度是3说明是默认长度,赋值数组长度展开
if(this.limit===3){
this.limit = this.addressList.length;
}else{
this.limit = 3;
}
}
定义一个属性 checkIndex:0,默认是0
在li标签上定义一个属性check,当checkIndex和循环中的索引index相等时,属性为true,并且点击的时候索引值 index赋给checkIndex
v-bind:class="{‘check’:checkIndex==index}" @click=“checkIndex = index”
默认地址通过数据列表的isDefault字段来控制,数据列表中只有一个isDefault是true,其余的都是false,所以设置默认地址就是把该条目的isDefault设置为ture,并且把其他的值都改为false
Default address
前端传递一个地址列表的ID
setDefault(addressId){
axios.post("/users/setDefault",{
addressId:addressId
}).then((response)=>{
let res = response.data;
if(res.status==="0"){
console.log("set default");
this.init();
}
})
},
后端接口
拿到参数值,判断地址是否存在,不存在返回err,若存在通过forEach循环查找修改然后保存。
router.post("/setDefault",function (req,res,next) {
var userId = req.cookies.userId,
addressId = req.body.addressId;
if(!addressId){
res.json({
status:'1003',
msg:'addressId is null',
result:''
});
}else{
User.findOne({userId:userId},function (err,user) {
if(err){
res.json({
status:"1",
msg:err.message,
result:''
})
}else{
var addressList = user.addressList;
addressList.forEach((item)=>{
if(item.addressId===addressId){
item.isDefault = true;
}else{
item.isDefault = false;
}
})
user.save(function (err1,doc1) {
if(err1){
res.json({
status:"1",
msg:err1.message,
result:''
})
}else{
res.json({
status:"0",
msg:'',
result:''
})
}
})
}
})
}
})
删除地址列表的值
首先在删除图标上定义一个click事件,来控制删除模态框的显示
delAddressConfirm(addressId){
this.addressId = addressId;
this.isMdShow = true;
},
当点击时,控制模态框显示的属性为true,点击确认,向后端传递修改的请求
你确认要删除这个地址吗?
delAddress(){
axios.post('/users/addressDel',{
addressId:this.addressId
}).then((response)=>{
let res = response.data;
if(res.status ==="0"){
this.isMdShow = false;
this.init();
}
})
}
后端接口根据他的地址id使用update的方法去修改数据库里的值
router.post("/addressDel",function (req,res,next) {
var userId = req.cookies.userId,//拿到用户id
addressId = req.body.addressId;//拿到要删除的商品id
User.update({
userId:userId
},{//找到数据库cartlist
$pull:{
'addressList':{
addressId:addressId
}
}
},function (err,doc) {
if(err){
res.json({
status:"1",
msg:err.message,
result:''
})
}else{
res.json({
status:"0",
msg:'',
result:'suc'
})
}
})
})