import React, { useState, useEffect } from "react"; import styles from "./index.module.scss"; import BubbleItem from "./BubbleItem"; import {BubbleProps} from '../../../types/list/types' const Bubble: React.FC = ({ options, value, onChange, multiple = false, layout = "horizontal", columns = 3, size = "small", className = "", itemClassName = "", style = {}, disabled = false, name, }) => { const [selectedValues, setSelectedValues] = useState<(string | number)[]>([]); // 同步外部传入的value useEffect(() => { if (value !== undefined) { const newValues = Array.isArray(value) ? value : [value]; setSelectedValues(newValues); } }, [value]); const handleOptionClick = (option: BubbleOption) => { if (disabled || option.disabled) return; let newSelectedValues: (string | number)[]; if (multiple) { if (selectedValues.includes(option.value)) { newSelectedValues = selectedValues.filter((v) => v !== option.value); } else { newSelectedValues = [...selectedValues, option.value]; } } else { newSelectedValues = [option.value]; } setSelectedValues(newSelectedValues); // 调用onChange回调,传递选中的值和对应的选项 if (onChange) { if (multiple) { const selectedOptions = options.filter((opt) => newSelectedValues.includes(opt.value) ); onChange(name, newSelectedValues, selectedOptions); } else { console.log('===111', name, option.value) onChange(name, option.value, option); } } }; const isSelected = (option: BubbleOption) => { return selectedValues.includes(option.value); }; const renderHorizontalLayout = () => (
{options.map((option) => ( ))}
); const renderVerticalLayout = () => (
{options.map((option) => ( ))}
); const renderGridLayout = () => (
{options.map((option) => ( ))}
); const renderLayout = () => { switch (layout) { case "horizontal": return renderHorizontalLayout(); case "vertical": return renderVerticalLayout(); case "grid": return renderGridLayout(); default: return renderHorizontalLayout(); } }; return (
{renderLayout()}
); }; export default Bubble;