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

JSX中调用函数触发no-unused-expressions ESLint错误的问题排查请求

分析与解决方案:JSX中的no-unused-expressions错误

错误原因

你遇到的Expected an assignment or function call and instead saw an expression错误,来自ESLint的no-unused-expressions规则——它会标记那些没有被有效利用的表达式。在你的代码里,问题出在这一行:

{this.isRemoved()}

如果isRemoved()这个函数只是执行一些副作用逻辑(比如修改组件状态、处理数据),而没有返回有效的React元素(比如null、组件或者DOM元素),那么这个函数调用就是一个“未被使用”的表达式:渲染阶段它的返回值通常是undefined,没有实际渲染意义,ESLint就会抛出这个错误。

解决方案

根据isRemoved()的实际用途,你可以选择以下两种处理方式:

1. 若isRemoved()是副作用函数(无JSX返回)

不要在渲染过程中直接调用这类函数,因为React渲染阶段应该是纯逻辑(只根据props/state返回JSX,不产生副作用)。你应该把它移到合适的场景:

  • 如果是组件挂载/更新时需要执行,放到componentDidMount、componentDidUpdate(类组件)或者useEffect(函数组件)中;
  • 如果是用户交互触发的逻辑,绑定到按钮点击等事件回调里。

调整后的示例代码:

<Accordion> 
  { Object.keys(this.state.comparedResult.sourceNotMatched).map((item, index) => ( 
    <AccordionTab header={"PAGE " + item} key={index}> 
      <Item.Group divided > 
        { this.state.comparedResult.sourceNotMatched[item].map((fields, i) => ( 
          <> 
            <Item key={i}> 
              <span className='reviewCardErrorBody'>{fields}</span> 
            </Item> 
            {/* 移除直接调用,将逻辑移到生命周期或事件回调 */}
            <ButtonNew label="removed" className="p-button-danger" /> 
          </> 
        )) } 
      </Item.Group> 
    </AccordionTab> 
  )) } 
</Accordion>

(额外提醒:React自定义组件首字母必须大写,所以<buttonNew>要改成<ButtonNew>,否则会被当成原生HTML标签处理)

2. 若isRemoved()需要返回JSX元素

确保函数返回一个有效的React元素,哪怕是null(当不需要渲染内容时)。比如修改isRemoved()函数:

isRemoved() {
  // 根据业务条件返回JSX或null
  if (this.someCondition) {
    return <span className="removed-tag">已移除</span>;
  }
  return null;
}

这样{this.isRemoved()}就会返回一个可渲染的元素,ESLint就不会认为这是未使用的表达式了。

额外优化建议

你当前用index作为map循环的key,虽然能运行,但如果列表项存在排序、添加或删除操作,建议使用数据中唯一的标识(比如fields里的ID)作为key,避免渲染性能问题或意外的DOM行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:34:07