推荐用 Object.assign({}, DEFAULTS, props) 合并默认配置与传入属性,再解构提取字段;避免在解构中重复设默认值,应封装为 initProps 工具函数,确保不可变性。

可以用 Object.assign() 合并默认配置与传入属性,再配合解构赋值一次性提取所需字段,避免手动逐个判断默认值,代码更简洁且可读性高。
用 Object.assign() 合并默认值和用户传入的 props
先定义一个包含所有可能属性及其默认值的对象,再用 Object.assign() 将用户传入的配置覆盖到默认对象上。这样既保留了未传值字段的默认行为,又支持灵活覆盖。
- 默认对象应尽量完整,涵盖组件所有可配置项
- 传入对象为
null或undefined时,Object.assign()会跳过,不影响默认值 - 注意:
Object.assign()是浅拷贝,嵌套对象不会被递归合并
解构前先合并,避免重复写默认值
不要在解构语法里每个字段都写默认值(如 { size = 'md', theme = 'light' } = props),而应在合并后统一解构。这样逻辑集中、易维护,也避免默认值散落在多处导致不一致。
- 错误写法:
const { size = 'md', theme = 'light' } = props || {}—— 默认值和业务逻辑耦合 - 推荐写法:
const config = Object.assign({}, DEFAULTS, props); const { size, theme } = config; - 可进一步简写为:
const { size, theme } = Object.assign({}, DEFAULTS, props);
结合函数参数默认值,封装成可复用初始化函数
把合并 + 解构逻辑抽成工具函数,让多个组件共享同一套初始化规则,减少重复代码。
- 例如:
function initProps(props, defaults = {}) { return Object.assign({}, defaults, props); } - 在组件内:
const { label, disabled, variant } = initProps(props, { variant: 'primary', disabled: false }); - 支持运行时动态 defaults(比如根据主题切换基础配置)
注意不可变性与副作用
Object.assign() 的第一个参数是目标对象,如果传入空对象字面量 {},就不会修改原始默认对象或用户传入对象,符合函数式编程习惯。
- 安全写法:
Object.assign({}, DEFAULTS, props)—— 创建新对象 - 危险写法:
Object.assign(DEFAULTS, props)—— 直接修改 DEFAULTS,后续调用会受影响 - 若需深默认值,应换用
structuredClone或三方库如 lodash 的defaultsDeep










