You need to enable JavaScript to run this app. React调用setState后状态不更新:点击汉堡菜单实现导航动画异常
优惠活动
大模型
产品
解决方案
定价
更多

React调用setState后状态不更新:点击汉堡菜单实现导航动画异常

你的代码存在几处语法和逻辑错误,修正后就能正常触发动画更新:

错误点说明

  • 更新state时未使用动态键名:你写的{link: {animation: xxx}}实际是给state新增了一个固定名为link的属性,而非将循环变量link的值作为属性名,需要写成{[link]: {animation: xxx}}才能正确匹配style1/style2等key
  • 清除动画的逻辑错误:你写的{...prevState, animation: ''}是给根state新增了一个名为animation的属性,没有修改每个style下的animation值
  • 循环内多次调用setState会被React合并,反而会丢失更新,应该先计算出完整的新state,再一次性调用setAnimations更新
  • setState是异步更新API,调用后立刻打印state拿到的永远是旧值,不代表state没更新
  • useRef返回的是一个包裹对象,需要通过.current属性才能访问到绑定的DOM元素,不能直接操作ref变量本身

修正后完整代码

import React from 'react'
import {useRef, useState} from 'react';

const Navbar = () => {
  const [animations, setAnimations] = useState({
    style1:{animation:null},
    style2:{animation:null},
    style3:{animation:null},
    style4:{animation:null}
  }) 

  const burger = useRef(null)
  const nav = useRef(null)

  function HandleBurger(){
    // 操作DOM要通过ref.current访问
    nav.current.classList.toggle('nav-active');
    burger.current.classList.toggle('toggle')

    // 先计算完整的新state再一次性更新
    const newAnimations = {...animations}
    Object.keys(animations).forEach((link, index) => {
      if (newAnimations[link].animation) {
        newAnimations[link].animation = ''
      } else {
        newAnimations[link].animation = `navLinkFade 0.5s ease forwards ${index / 7 + 1}s`
      }            
    })
    // 一次性更新state
    setAnimations(newAnimations)
  }
  
  return (
    <nav className="navbar">
      <div className="logo">
        <h3 id="art">BURJTECH</h3>
        <h3 id="scope">LIMITED</h3>
      </div>
      {/* ref绑定正确写法 */}
      <div className="side-header" ref={nav}>
        <li style={animations["style1"]}><a className="cool-link" href="/">Homepage</a></li>
        <li style={animations["style2"]}><a className="cool-link" href="/about">About</a></li>
        <li style={animations["style3"]}><a className="cool-link" href="/services">Services</a></li>
        <li style={animations["style4"]}><a className="cool-link" href="/contact">Contact</a></li>
      </div>
      {/* ref绑定正确写法 */}
      <div className="burger" ref={burger} onClick={HandleBurger}>
        <div className="line1"></div>
        <div className="line2"></div>
        <div className="line3"></div>
      </div>
    </nav>
  )
}

export default Navbar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 11:54:02