首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何切换布尔型的特定状态?

如何切换布尔型的特定状态?
EN

Stack Overflow用户
提问于 2021-05-02 17:01:15
回答 3查看 59关注 0票数 0

我想在点击芯片时添加一个startIcon={<Icon />}到芯片中。图标的状态由chipsState管理。

在这段代码中,所有芯片的状态都会改变。如何仅更改所单击元素的chipsState?

在这段代码中,所有芯片的状态都将改变。如何仅更改所单击元素的chipsState?

代码语言:javascript
运行
复制
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;
EN

回答 3

Stack Overflow用户

发布于 2021-05-02 17:10:06

您可以通过将chipState状态从boolean更改为object来实现所需的输出。

因此,首先让我们更改为对象状态,而不是布尔值

代码语言:javascript
运行
复制
const [chipsState, setChipsState] = useState({});

现在我们将更改onChipClick函数以更改选定芯片状态的值

代码语言:javascript
运行
复制
const onChipClick = (element:any) => {
   setChipsState({...chipsState, chipsState[element]: !chipsState[element]});  
  }

最后,我们将读取每个chipsState元素的正确值。

代码语言:javascript
运行
复制
<Chip onClick={() => onChipClick(element)} startIcon={chipsState[element] && <Icon />}>{element.description}</Chip>
票数 0
EN

Stack Overflow用户

发布于 2021-05-02 17:12:49

为了处理本地状态(以及更好的测试),您应该使用专用的chipState创建一个新的自定义芯片组件。

代码语言:javascript
运行
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2021-05-02 19:10:28

您可以像下面这样尝试

代码语言:javascript
运行
复制
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"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67354562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档