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

在React Hooks页面中实现「显示更多/显示更少」功能时出现「Cannot read properties of undefined (reading substring)」错误求助

解决React Hooks中「显示更多/显示更少」功能的"Cannot read properties of undefined (reading 'substring')"错误

咱们直接从报错根源入手,帮你快速解决这个问题:

错误原因分析

你遇到的这个TypeError,核心问题出在变量的导入与解构不匹配:

  • 在textData1.js里,你导出的是一个纯字符串常量TextData,但在middleSection.js中,你却用了解构赋值const { text } = TextData;——字符串类型根本没有text这个属性,所以解构后text变量会变成undefined,调用text.substring()自然就会抛出"Cannot read properties of undefined"的错误。
  • 另外你导入时用的变量名是data1,但解构时却写了TextData,这也是一个小失误。

解决方案

这里提供两种修复方式,你可以根据需求选择:

方式1:直接使用导出的字符串(适合当前简单场景)

修改middleSection.js中的变量获取逻辑,去掉不必要的解构,直接使用导入的字符串:

import React, { useState } from 'react';
import data1 from "../data/textData1";
const MiddleSection = () => {
  const [showMore, setShowMore] = useState(false);
  // 直接将导入的字符串赋值给text变量
  const text = data1;
  
  return (
    <div className='row'>
      <div className="middleTextContent">
        <p id="middleTextOverlay">
          {/* 给截断文本加上省略号,体验更友好 */}
          {showMore ? text : `${text.substring(0, 50)}...`}
        </p>
        {/* 把按钮移出p标签,语义更合理 */}
        <button className='showMoreLess' onClick={() => setShowMore(!showMore)}>
          {showMore ? "Show less" : "Show More"}
        </button>
      </div>
    </div>
  )
}
export default MiddleSection;

方式2:改为导出对象(适合未来扩展多字段场景)

如果以后需要给文本数据添加更多属性(比如标题、标签),可以修改textData1.js导出一个对象:

// textData1.js 修改后
import React from 'react';
const TextData = {
  text: "We are an awesome bunch of friendly people. We play together for fun and enjoy every moments of soccer."
};
export default TextData

然后同步修改middleSection.js的导入和解构:

import React, { useState } from 'react';
// 导入变量名和导出的常量名保持一致
import TextData from "../data/textData1";
const MiddleSection = () => {
  const [showMore, setShowMore] = useState(false);
  // 现在解构text属性就可以正常获取值了
  const { text } = TextData;
  
  return (
    <div className='row'>
      <div className="middleTextContent">
        <p id="middleTextOverlay">
          {showMore ? text : `${text.substring(0, 50)}...`}
        </p>
        <button className='showMoreLess' onClick={() => setShowMore(!showMore)}>
          {showMore ? "Show less" : "Show More"}
        </button>
      </div>
    </div>
  )
}
export default MiddleSection;

额外提示

关于错误边界的建议,你可以创建一个类组件作为错误边界,包裹你的MiddleSection组件,这样后续如果组件出现其他意外错误,能及时捕获并展示友好的提示,避免页面直接崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:42:42