在后台项目中,我总会遇到一些不能立刻解决的问题,这里总结了一部分:
- 当进行调用获取用户详情数据时,可能会遇到获取的基本信息不足的情况,可能需要在此基础上继续获取用户详情
这时我们可以选择再次封装一个通过id获取的接口
接口代码如下:
// api/user.js
import request from '@/utils/request'
// 获取用户基本资料
export function getUserInfo() {
return request({
method: 'post',
url: '/sys/profile'
})
}
// 根据 id 获取用户详情
export function getUserDetailById(id) {
return request({
url: '/sys/user/' + id // 字符串
})
}
接口代码调用如下:
// store/mudules/user.js
import { login, getUserInfo, getUserDetailById } from '@/api/user'
const mutations = {
// 存储用户信息
async setUserInfo(state, data) {
state.userInfo = { ...data }
},
// 调用获取用户信息
async getUserInfo(store) {
// 获取基本信息这里不够
// 还需要在此之后获取详情
const simpleData = await getUserInfo()
const detail = await getUserDetailById(simpleData.userId)
// 合并对象 成为一个新对象
const data = { ...simpleData, ...detail }
store.commit('setUserInfo', data)
}
项目进行到这里,我们需要对项目数据进行修改,可以看出:这里将两个对象合并为一个新对象
- 总结:
- 对于两个对象合并为一个新对象,可以对两个对象打散,即**…obj**
- 然后将两个被打散的对象存放在一个新对象中,即得到一个合并的新对象
当然:对象的合并方法不止一种,如:
- 方法二:
- $.extend()
- $.extend()
- 遍历赋值
var obj1={'a':1};
var obj2={'b':2};
for(var key in obj2){
// hasOwnProperty 是判断自有属性,即在当前对象中查找是否拥有某个属性,
// 当我们在使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问会避免原型对象扩展带来的干扰
if(obj2.hasOwnProperty(key)===true){
obj1[key]=obj2[key];
}
}
console.log(obj1);//{'a':1,'b':2};
- 对象的深拷贝和浅拷贝
- 浅拷贝
let obj1={'a':1};
let obj2={'b':{'b1':22,'b2':33}};
// obj2 的属性是从 obj1 中进行拷贝得到的
$.extend(obj1, obj2);
console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1) // 22
// obj2重新赋值
obj2.b.b1=44;
console.log(obj1.b.b1) // 44 obj1.b 只拷贝了对象的指引,所以受原obj2的影响
- 深拷贝
let obj1={'a':1};
let obj2={'b':{'b1':22,'b2':33}};
//第一个参数设为true表示深拷贝, 若没有,则为浅拷贝,默认浅拷贝
$.extend(true,obj1, obj2);
console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1) // 22
obj2.b.b1=44; //obj2重新赋值
console.log(obj1.b.b1) // 22 obj1拷贝了obj2的所有属性以及值,并不受obj2的影响
复制代码
- 回忆深拷贝与浅拷贝