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

原生JavaScript显隐控制逻辑如何改写为Gatsby React JSX并实现onClose

问题解决方法

报错原因

你在useEffect回调函数内直接定义了一个未赋值、未调用的匿名函数,ESLint检测到该表达式没有实际作用,因此抛出no-unused-expressions错误。你原本可能想将它作为useEffect的清理函数,但就算是清理函数也需要用return返回,且你的onClose是用户主动触发的交互逻辑,完全不应该写在useEffect内部。

正确实现方案

遵循React状态驱动渲染的设计原则,不要直接操作DOM,用state控制元素显隐,逻辑更清晰也更易维护,完整代码如下:

import React, { useEffect, useState } from 'react';
import '../index.css'

export default function Com() {
  // 用state控制元素是否渲染
  const [showDiv, setShowDiv] = useState(false);

  useEffect(() => {
    // localStorage存储的值都是字符串,需要转换为布尔值处理
    const storageVal = localStorage.getItem("showDiv");
    // 首次访问无存储值时默认展示
    setShowDiv(storageVal === null ? true : JSON.parse(storageVal));
  }, []);

  // 单独封装关闭逻辑,绑定到交互元素即可触发
  const onClose = () => {
    setShowDiv(false);
    localStorage.setItem("showDiv", false);
  };

  // 状态为false时直接不渲染,等效于原生代码的remove效果
  if (!showDiv) return null;

  return (
  <div className="contenedor">
    {/* 关闭按钮,可根据需求替换为你自己的触发元素 */}
    <button onClick={onClose} style={{position: 'absolute', top: '8px', right: '8px'}}>关闭</button>
    <img className="portada" src="https://res.cloudinary.com/lenguaestudiocreativo/image/upload/v1626228418/hportada_jgljqd.svg" alt="封面"/>
  </div>
 );
}

优化说明

  • 移除了所有手动DOM操作,完全通过React状态控制渲染,避免原生DOM操作和React渲染逻辑冲突的隐患
  • 处理了localStorage存值为字符串的特性,避免出现"false"字符串转布尔值为true的逻辑错误
  • 关闭逻辑独立封装,你可以根据需求将onClose绑定到任意元素的对应事件上,比如点击蒙层关闭、点击图片关闭等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:27:03