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

React点击收藏按钮更新state后列表未触发重渲染问题求解

问题根因

React 状态更新时会对引用类型做浅比较,如果传入的新值和旧值引用地址完全相同,React 会判定状态未发生变更,跳过组件重渲染。

你的代码中let newFavorites = favorites是直接将原状态数组的引用赋值给新变量,后续push操作是直接修改原数组,数组本身的引用地址没有发生变化,因此setFavorites传入的还是原数组,无法触发重渲染。你在控制台能看到数组内容变化,是因为你修改了原数组的内部内容,但React不会监听引用类型内部的属性变更。

修复方案

将状态作为不可变值处理,每次更新都返回全新的数组对象即可,推荐写法如下:

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

function App() {
    const [favorites, setFavorites] = useState([]);

    function addFavorite(name, id) {
        const newFav = {name, id};
        // 函数式更新+展开运算符,既避免闭包问题,也生成了全新数组
        setFavorites(prev => [...prev, newFav]);
    }

    return (
        <div className="App">
            <ul>
                {favorites.map((val) => {
                    return(<li key={val.id}><span>{val.name}</span></li>);
                })}
            </ul>

            <button onClick={() => addFavorite("Thing1", 1)}>Thing 1</button>
            <button onClick={() => addFavorite("Thing2", 2)}>Thing 2</button>
            <button onClick={() => {console.log(favorites)}}>Check</button>
        </div>
    );
}

export default App;

其他可选写法

  • 用concat方法生成新数组:setFavorites(favorites.concat({name, id}))
  • 先复制原数组再添加元素:
    const newFavorites = [...favorites]
    newFavorites.push({name, id})
    setFavorites(newFavorites)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:27:00