我想在点击芯片时添加一个startIcon={<Icon />}到芯片中。图标的状态由chipsState管理。
在这段代码中,所有芯片的状态都会改变。如何仅更改所单击元素的chipsState?
在这段代码中,所有芯片的状态都将改变。如何仅更改所单击元素的chipsState?
const Modal:React.FC<Props>= (props) => {
  const {modalData} = props;
  const [chipsState, setChipsState] = useState(false);
  const onChipClick = (element:any) => {
   setChipsState(chipsState => !chipsState);  
  }
  return (
    <div>
         {
           modalData.symtoms.map((element:any, index:number) => (
            <div key={index}>
             <Chip onClick={() => onChipClick(element)} startIcon={chipsState && <Icon />}>{element.description}</Chip>
            </div>
        ))}
    </div>
  );
}
export default Modal;发布于 2021-05-02 17:10:06
您可以通过将chipState状态从boolean更改为object来实现所需的输出。
因此,首先让我们更改为对象状态,而不是布尔值
const [chipsState, setChipsState] = useState({});现在我们将更改onChipClick函数以更改选定芯片状态的值
const onChipClick = (element:any) => {
   setChipsState({...chipsState, chipsState[element]: !chipsState[element]});  
  }最后,我们将读取每个chipsState元素的正确值。
<Chip onClick={() => onChipClick(element)} startIcon={chipsState[element] && <Icon />}>{element.description}</Chip>发布于 2021-05-02 17:12:49
为了处理本地状态(以及更好的测试),您应该使用专用的chipState创建一个新的自定义芯片组件。
interface CustomChipProps {
   description: string
}
const CustomChip = (props: CustomChipProps) => {
  const [chipState, setChipState] = useState(false);
   
  return <Chip onClick={() => setChipState(prev => !prev)} startIcon={chipState && <Icon />}>{props.description}</Chip>;
}
const Modal:React.FC<Props>= (props) => {
  const {modalData} = props;
  return (
    <div>
         {
           modalData.symtoms.map((element:any, index:number) => (
            <div key={index}>
             <CustomChip description={element.description} />
            </div>
        ))}
    </div>
  );
}
export default Modal;发布于 2021-05-02 19:10:28
您可以像下面这样尝试
import React, { useState, useCallback } from "react";
import ReactDOM from "react-dom";
import { Grid, Row } from "react-flexbox-grid";
const ChipSet = ({ symtomsData }) => {
  const data = symtomsData.map((symtom) => ({ ...symtom, isSelcted: false }));
  const [chipSets, setChipSets] = useState(data);
  const onSelectChipSet = useCallback(
    (e, index) => {
      const updatedChipSets = chipSets.map((chip, i) =>
        i === index ? { ...chip, isSelcted: e.target.checked } : chip
      );
      setChipSets(updatedChipSets);
    },
    [chipSets]
  );
  console.log("chipSets", chipSets);
  return (
    <div>
      <h1>Symtoms Data</h1>
      {chipSets.map((x, i) => (
        <div key={i}>
          <label>
            <input
              onChange={(e) => onSelectChipSet(e, i)}
              type="checkbox"
              value={x.isSelcted}
            />
            {x.description}
          </label>
        </div>
      ))}
    </div>
  );
};
class App extends React.Component {
  render() {
    const symtomsData = [
      {
        description: "mild"
      },
      {
        description: "cold"
      }
    ];
    return (
      <Grid>
        <Row>
          <ChipSet symtomsData={symtomsData} />
        </Row>
      </Grid>
    );
  }
}
ReactDOM.render(<App />, document.getElementById("root"));https://stackoverflow.com/questions/67354562
复制相似问题