You need to enable JavaScript to run this app. 为什么JSX中为条件类元素绑定的内联样式未正常生效
优惠活动
大模型
产品
解决方案
定价
更多

为什么JSX中为条件类元素绑定的内联样式未正常生效

问题根因拆解

代码存在三处会直接导致内联样式失效的问题:

  • JSX内联样式语法写法错误
    JSX的style属性仅能接收单个样式对象,当前写法style={{top:random_number+"%"} , {left:random_number+"%"}}完全不符合语法要求:
    逗号运算符会直接取表达式链的最后一个值,相当于最终传给style的只有{left: random_number + "%"}这一个对象,前面定义的top属性直接被丢弃,根本不会被解析到目标元素上。正确写法是将所有样式属性合并到同一个对象中。
  • 随机数变量无持久化能力
    组件顶层声明的let random_number;是普通局部变量,每次组件因状态更新触发重渲染时,函数体从头执行,这行代码会直接把之前在doThings方法中赋值的随机数重置为undefined。最终渲染时,元素拿到的top、left值全是无效的undefined,浏览器自然不会应用对应的定位样式。
  • 样式缺少基础定位支撑
    就算top、left的数值能正确传递,只要.circle类的CSS规则里没有配置position: absolute/position: fixed这类定位属性,top、left的设置也完全不会生效——这两个属性仅对已定位的元素有效果。
修正后的核心可运行代码
function App() {
  const [date, setDate] = useState('')
  const [circleBoolean, setCircleBoolean] = useState(false);
  // 将随机数存为独立状态,避免重渲染时丢失赋值
  const [randomNumber, setRandomNumber] = useState(0);

  useEffect(() => {
    // 用空依赖固定定时器,避免因状态更新频繁重建
    const interval = setInterval(() => {
      // 用函数式状态更新规避闭包取值过期问题
      setCircleBoolean(prev => !prev);
      setDate(moment().format('MMMM Do YYYY, h:mm:ss a'));
      setRandomNumber(Math.random() * 100);
    }, 2000);
    return () => clearInterval(interval);
  }, []);

  return (
    <div className="App">
      <div className="bg">
        <div 
          style={{ top: `${randomNumber}%`, left: `${randomNumber}%` }}
          className={circleBoolean ? "circle" : ""} 
        />
        <div className="card">
          <p className="card-info">{date}</p>
        </div>
      </div>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 10:27:03