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

React点击更多/关闭按钮触发TypeError报错的解决及按钮显隐需求

报错原因

你在showMore函数中的三目运算存在语法错误:连续相邻的括号会被JavaScript解析为「将前一个表达式的返回值作为函数调用」,而setVisible作为useState提供的状态更新函数,执行后无返回值(返回undefined),因此触发TypeError: setVisible(...) is not a function报错。

功能实现&代码修正

以下是修正后的完整代码,同时满足「数据量小于5时自动隐藏按钮」的需求:

import { useState } from 'react';

// 组件内部逻辑
const [visible, setVisible] = useState(5);
// 直接通过visible值判断展开状态,无需额外维护expanded状态,减少冗余
const isExpanded = visible !== 5;

const showMore = () => {
  // 改用if-else写法,可读性更高,避免三目运算多操作的语法问题
  if (visible === 5) {
    setVisible(ProductDetail.allergies.length);
  } else {
    setVisible(5);
  }
};

// 组件渲染逻辑
return (
  <>
    {/* 列表渲染部分 */}
    <ul>
      {ProductDetail && ProductDetail.allergies?.length ? (
        ProductDetail.allergies.slice(0, visible).map(All => (
          <li key={All.id}>{All.displayText}</li>
        ))
      ) : (
        <li>No information.</li>
      )}
    </ul>

    {/* 仅当数据总量大于5时渲染切换按钮 */}
    {ProductDetail?.allergies?.length > 5 && (
      <button type="button" onClick={showMore}>
        {isExpanded ? <span>close</span> : <span>see more</span>}
      </button>
    )}
  </>
);

如果你需要保留原来的expanded状态,仅修正语法错误的话,showMore函数可以修改为以下写法(用逗号分隔同一分支下的多个操作):

const showMore = () => {
  visible === 5 
    ? (setVisible(ProductDetail.allergies.length), setExpanded(true))
    : (setVisible(5), setExpanded(false))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:15:04