当组件中有解构赋值时,为啥默认道具不能防止 TypeError?

Posted

技术标签:

【中文标题】当组件中有解构赋值时,为啥默认道具不能防止 TypeError?【英文标题】:Why do default props not protect against a TypeError when there is a destructuring assignment in a component?当组件中有解构赋值时,为什么默认道具不能防止 TypeError? 【发布时间】:2020-01-11 15:32:27 【问题描述】:

我有一个组件接受一个 prop a,它是一个具有 b 属性的对象:

const MyComponent = ( a:  b  ) => b;

MyComponent.defaultProps = 
  a: 
    b: 4,
  ,
;

这个组件连接到一个 Redux 存储:

export default connect(state => ( a: state.a ))(MyComponent)

而且商店似乎很好地防止了类型错误:

const INITIAL_STATE =  a:  b: 0  ;

const reducer = (state = INITIAL_STATE, action) => 
  switch (action.type) 
    // none of the branches of the switch statement removes state.a.b or reassigns state.a to something other than an object
    default: return state;
  
;

有时,非常罕见,在不到 1000 个请求中,我会看到相应的

TypeError: 无法读取未定义的属性“b”

记录在异常监控系统中。似乎与用户的浏览器版本没有关联。 React 的最新稳定版本始终在生产环境中运行。其他周围的代码不太可能导致这种行为。

我的问题是,我是否遗漏了一些关于默认道具或 Redux 工作方式的信息?即使我有默认道具,我是否必须围绕解构赋值表达式编写更多防御性代码?

【问题讨论】:

为什么一个组件只返回一个数字而不是 JSX? @John Ruddell 这无关紧要。执行没有到达那个点,它在函数返回之前发生的解构赋值失败。 我明白,我只是在询问组件,因为这不正确。我不会依赖默认道具,而只是确保您使用正确的道具渲染组件。如果您想创建一个复制问题的代码框,您提供的代码看起来不错。没有看到设置很难分辨。 【参考方案1】:

您正确使用了defaultProps,但我怀疑a 被设置为null 而不是undefineddefaultProps 仅在值为undefined 时替换props,所以如果有a 设置为null 的情况,默认的props 将不会出现,这会导致您的错误。

从您的示例中,无法判断将其设置为 null 的位置,但您可以使用该位置开始搜索。我会开始查看执行分配的 redux reducer,因为它可能是一个意外返回 null 的端点,或者类似的东西。

参考:React.js - default prop is not used with `null` is passed

【讨论】:

以上是关于当组件中有解构赋值时,为啥默认道具不能防止 TypeError?的主要内容,如果未能解决你的问题,请参考以下文章

使用对象解构赋值时,为啥将属性“名称”转换为字符串? [复制]

为啥不能根据道具反应设置初始状态

为啥在 vuejs2 中我的默认道具没有传递给我的子组件?

es6解构赋值总结

为啥我不能在组件道具中使用内联函数?可以举个例子详细解释一下吗?失去所有状态是啥意思?

es6--解构赋值