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

React Hooks实现多按钮分别点击计数,组件拆分后如何处理逻辑?

核心问题梳理
  • 组件状态作用域错误:React 组件内部的 state 是私有属性,兄弟组件(Buttons 和 Counter)之间无法直接互相访问内部状态,Buttons.count 这种写法完全无法获取到正确值
  • 缺少按钮标识区分:三个按钮共用同一个点击处理函数,没有传入对应类型参数,无法区分点击的是哪个按钮
  • 冗余状态定义:Counter 内部定义的 count 状态没有实际作用,计数逻辑分散导致数据无法同步

修复方案

采用状态提升的思路,将三个按钮的计数状态统一放到两个子组件的公共父组件中管理,再通过 props 把点击处理函数传递给 Buttons 组件、把计数数据传递给 Counter 组件即可,该方案状态集中管理没有冗余,子组件均为无内部状态的展示组件,渲染性能更优。

完整实现代码

1. 父组件 App.js

import React, { useState } from 'react';
import Buttons from './Buttons';
import Counter from './Counter';

function App() {
  // 用单个对象存储三类计数,避免创建多个重复state
  const [stats, setStats] = useState({
    good: 0,
    neutral: 0,
    bad: 0
  });

  // 接收按钮类型参数,更新对应分类的计数
  const handleButtonClick = (type) => {
    setStats(prevState => ({
      ...prevState,
      [type]: prevState[type] + 1
    }));
  };

  return (
    <div>
      <Buttons onClick={handleButtonClick} />
      <Counter stats={stats} />
    </div>
  );
}

export default App;

2. 按钮组件 Buttons.js

import React from "react";

const Buttons = ({ onClick }) => {
  return (
    <div>
      <button className="GoodBtn" onClick={() => onClick('good')}>Good</button>
      <button className="NeutralBtn" onClick={() => onClick('neutral')}>Neutral</button>
      <button className="BadBtn" onClick={() => onClick('bad')}>Bad</button>
    </div>
  );
};

export default Buttons;

3. 统计组件 Counter.js

import React from "react";

const Counter = ({ stats }) => {
  return (
    <div>
      <h2>Statistics</h2>
      <p>Good {stats.good}</p>
      <p>Neutral {stats.neutral}</p>
      <p>Bad {stats.bad}</p>
    </div>
  );
};

export default Counter;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:05