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

React技术问题:放置于CSS Grid的简易单选按钮组件故障排查

嘿,很高兴看到你在搭建第一个React应用时就考虑到了组件复用!用react-bootstrap的Toggle组件来封装通用的单选按钮组是个很棒的选择,既能利用成熟库的稳定性,又能打造符合自己需求的专属组件。下面我给你完善一下这个ToolButtonGroup的实现,让它更健壮、易用:

1. 完整的ToolButtonGroup封装组件

这个组件会接收选项列表、当前选中值和变化回调作为props,内部封装react-bootstrap的ToggleButtonGroup和ToggleButton,同时支持自定义样式:

import { ToggleButtonGroup, ToggleButton } from 'react-bootstrap';
import PropTypes from 'prop-types';

const ToolButtonGroup = ({ options, selectedValue, onValueChange, className }) => {
  return (
    <ToggleButtonGroup
      type="radio"
      name="tool-filter-group"
      value={selectedValue}
      onChange={onValueChange}
      className={`${className} custom-tool-button-group`}
    >
      {options.map((option) => (
        <ToggleButton
          key={option.value}
          id={`tool-btn-${option.value}`}
          value={option.value}
          variant={selectedValue === option.value ? 'primary' : 'light'}
        >
          {option.label}
        </ToggleButton>
      ))}
    </ToggleButtonGroup>
  );
};

// 定义props类型,提升组件健壮性
ToolButtonGroup.propTypes = {
  options: PropTypes.arrayOf(
    PropTypes.shape({
      value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
      label: PropTypes.string.isRequired,
    })
  ).isRequired,
  selectedValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
  onValueChange: PropTypes.func.isRequired,
  className: PropTypes.string,
};

// 默认props
ToolButtonGroup.defaultProps = {
  className: '',
};

export default ToolButtonGroup;
2. 组件使用示例

在你的页面或图表组件中,就可以轻松复用这个按钮组,结合状态管理来实现数据过滤:

import { useState } from 'react';
import ToolButtonGroup from './ToolButtonGroup';
import YourChartComponent from './YourChartComponent';

const ChartPage = () => {
  // 初始化选中值,比如默认显示"全部"数据
  const [filterValue, setFilterValue] = useState('all');
  // 模拟图表数据源
  const chartData = [
    { category: 'sales', value: 120, type: 'all' },
    { category: 'sales', value: 80, type: 'month' },
    { category: 'sales', value: 30, type: 'week' },
    // 更多数据...
  ];

  // 过滤数据的函数
  const getFilteredData = () => {
    if (filterValue === 'all') return chartData;
    return chartData.filter(item => item.type === filterValue);
  };

  return (
    <div className="chart-container">
      <h3>销售数据统计</h3>
      {/* 使用自定义的按钮组 */}
      <ToolButtonGroup
        options={[
          { value: 'all', label: '全部数据' },
          { value: 'month', label: '月度数据' },
          { value: 'week', label: '周度数据' },
        ]}
        selectedValue={filterValue}
        onValueChange={(value) => setFilterValue(value)}
      />
      {/* 传入过滤后的数据到图表组件 */}
      <YourChartComponent data={getFilteredData()} />
    </div>
  );
};

export default ChartPage;
3. 样式优化小技巧

如果想要让按钮组更贴合你的应用风格,可以添加自定义CSS来调整外观:

.custom-tool-button-group .btn {
  margin-right: 8px;
  border-radius: 6px;
  font-weight: 500;
}

.custom-tool-button-group .btn-primary {
  background-color: #2563eb;
  border-color: #2563eb;
}

.custom-tool-button-group .btn-light:hover {
  background-color: #f3f4f6;
}
4. 额外增强建议
  • 支持禁用状态:可以给组件添加isDisabled props,传递给ToggleButtonGroup的disabled属性,方便在数据加载时禁用按钮组
  • 支持垂直布局:添加orientation props,可选horizontal或vertical,传递给ToggleButtonGroup
  • 国际化支持:如果需要多语言,可以让options的label接收翻译后的文本,或者组件内部集成i18n逻辑

这样封装后的组件不仅能在应用的多数页面复用,还能灵活适配不同的场景需求,非常适合作为你的核心组件之一!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:40:17