You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中TypeError: Cannot read property 'substr' of null问题求助

解决React中TypeError: Cannot read property 'substr' of null的问题

嘿,这个报错的原因很明确——你的eventDesc有时候是null或者undefined,这时候去调用它的substr方法自然会抛出错误,因为null/undefined并没有这个方法。下面给你几个实用的解决办法:

方法1:使用可选链+空值合并(ES2020+推荐)

这是最简洁的写法,利用ES新语法快速处理空值情况:

{eventDesc?.substr(0, 140) ?? ''}
  • ?.:会先检查eventDesc是否为null/undefined,如果是就直接返回undefined,不会继续调用substr
  • ??:把前面的undefined转换成空字符串,避免页面上显示undefined字样

方法2:三元运算符(兼容性更好)

如果你的项目需要兼容不支持ES2020的环境,用三元判断更稳妥:

{eventDesc ? eventDesc.substr(0, 140) : ''}

它会先判断eventDesc是否为“真值”(非null、非undefined、非空字符串等),满足条件才执行截取,否则返回空字符串。

方法3:从源头初始化默认值

在组件的state里给eventDesc设置默认值,从根源避免null的出现:
修改构造函数中的state初始化代码:

constructor(props) {
  super(props);
  this.state = {
    eventName: props.eventName || '',
    eventDate: props.eventDate || '',
    eventDesc: props.eventDesc || '', // 这里给个空字符串默认值
    eventPic: props.eventPic || ''
  }
}

这样即使父组件传入的eventDesc是null,state里的eventDesc也会是空字符串,调用substr就不会报错了。

方法4:抽离成处理函数(更易维护)

如果后续需要扩展截取逻辑(比如添加省略号),把逻辑抽成组件方法会更清晰:

class Card extends Component {
  // ... 其他代码 ...
  
  getTruncatedDescription = () => {
    const { eventDesc } = this.state;
    if (!eventDesc) return '';
    // 还可以在这里加个判断,如果原内容超过140字符就加省略号
    return eventDesc.length > 140 ? `${eventDesc.substr(0, 140)}...` : eventDesc;
  }

  render () {
    const { eventDate, eventName, eventPic } = this.state;
    return (
      // ... 其他JSX代码 ...
      <p className="f6 lh-copy measure mt2 mid-gray">
        {this.getTruncatedDescription()}
      </p>
      // ... 其他JSX代码 ...
    )
  }
}

另外提一句:现在React官方更推荐使用函数组件+Hooks开发,如果是新项目的话可以考虑重构,但上面的方法在类组件里都是完全适用的~

内容的提问来源于stack exchange,提问作者Ricardo Sawir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:34:22