如何基于类属性简便创建含当前类已有属性的对象?
简便提取MobX类属性生成请求对象的方案
嘿,我懂你不想每次手动列一堆属性的心情——这种重复代码确实挺磨人的!结合你用MobX的场景,给你几个实用的简化方案:
方案1:给类添加专属的属性提取方法
直接在User类里写一个方法,专门返回需要提交的用户数据,以后要改属性只需要维护这一个地方:
class User { @observable username = ''; @observable email = ''; @observable password = ''; @observable gender = ''; @observable errors = {}; // 新增方法,统一处理需要提交的属性 @action toUserData() { return { username: this.username, email: this.email, password: this.password, gender: this.gender }; } @action submitRegister() { const userData = this.toUserData(); Axios.post('/api/users', userData).then(/* 你的后续逻辑 */); } }
这种方式的好处是清晰可控,别人看代码一眼就知道哪些属性会被提交,而且后续属性变更时只需要修改toUserData方法,不用到处找提交逻辑。
方案2:用「属性列表+提取工具函数」简化
如果不想写单独的方法,可以把需要的属性存在一个数组里,配合提取工具函数(可以用现成的也可以自己写):
用Lodash的pick(如果项目已引入)
import { pick } from 'lodash'; class User { // ... 你的属性定义 ... @action submitRegister() { // 定义需要提取的属性列表 const submitFields = ['username', 'email', 'password', 'gender']; const userData = pick(this, submitFields); Axios.post('/api/users', userData).then(/* ... */); } }
自己写轻量版提取函数(不想加依赖的话)
如果项目没引入Lodash,写个几行的小函数就行:
// 可以放在工具文件里复用 const pick = (obj, keys) => { return keys.reduce((result, key) => { result[key] = obj[key]; return result; }, {}); }; // 然后在类里用: class User { // ... 属性 ... @action submitRegister() { const submitFields = ['username', 'email', 'password', 'gender']; const userData = pick(this, submitFields); Axios.post('/api/users', userData).then(/* ... */); } }
这种方式的优势是代码更简洁,属性列表集中管理,适合属性较多的场景。
方案3:自动过滤不需要的属性(适合属性多且排除项少的情况)
如果你的类里大部分属性都需要提交,只有少数几个(比如errors)要排除,可以遍历实例属性自动过滤:
class User { // ... 属性 ... @action submitRegister() { const userData = {}; // 遍历实例自身的可枚举属性 for (const key in this) { // 排除不需要提交的属性,同时跳过MobX的内部属性(以$开头) if (key !== 'errors' && !key.startsWith('$')) { userData[key] = this[key]; } } Axios.post('/api/users', userData).then(/* ... */); } }
⚠️ 注意:这种方式要谨慎用,后续如果新增了不需要提交的属性,一定要记得更新过滤条件,不然会把不该传的字段提交给后端。
个人更推荐方案1或方案2,既清晰又好维护,能有效避免重复代码的问题。
内容的提问来源于stack exchange,提问作者felixbreuer
相关产品推荐
相关产品推荐

