【问题标题】:How do I toggle class with React radio component using Hooks?如何使用 Hooks 切换带有 React 无线电组件的类?
【发布时间】:2020-02-06 11:15:37
【问题描述】:

我已经将一个带有 React Hooks 的单选组件放在一起,它可以在两个有效的选项之间切换。选择单选按钮时,如何将类添加到大纲框?我希望背景从白色变为灰色。我正在使用样式化组件并尝试仅使用 CSS 来执行此操作,但没有成功。我怎样才能使用钩子来完成这个?此处的工作示例:https://codesandbox.io/embed/react-styled-components-radio-button-qpxul?fontsize=14

const { useState } = React;

const App = () => {
  const [select, setSelect] = useState("optionA");

  const handleSelectChange = event => {
    const value = event.target.value;
    setSelect(value);
  };
  return (
    <Wrapper>
      <Item>
        <RadioButton
          type="radio"
          name="radio"
          value="optionA"
          checked={select === "optionA"}
          onChange={event => handleSelectChange(event)}
        />
        <RadioButtonLabel />
        <div>Choose Pickup</div>
      </Item>
      <Item>
        <RadioButton
          type="radio"
          name="radio"
          value="optionB"
          checked={select === "optionB"}
          onChange={event => handleSelectChange(event)}
        />
        <RadioButtonLabel />
        <div>Choose Delivery</div>
      </Item>
    </Wrapper>
  );
};

const Wrapper = styled.div`
  height: auto;
  width: 100%;
  padding: 0px 16px 24px 16px;
  box-sizing: border-box;
`;

const Item = styled.div`
  display: flex;
  align-items: center;
  height: 48px;
  position: relative;
  border: 1px solid #ccc;
  box-sizing: border-box;
  border-radius: 2px;
  margin-bottom: 10px;
`;

const RadioButtonLabel = styled.label`
  position: absolute;
  top: 25%;
  left: 4px;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: white;
  border: 1px solid #ccc;
`;
const RadioButton = styled.input`
  opacity: 0;
  z-index: 1;
  cursor: pointer;
  width: 25px;
  height: 25px;
  margin-right: 10px;
  &:hover ~ ${RadioButtonLabel} {
    background: #ccc;
    &::after {
      content: "\f005";
      font-family: "FontAwesome";
      display: block;
      color: white;
      width: 12px;
      height: 12px;
      margin: 4px;
    }
  }
  &:checked + ${Item} {
    background: yellowgreen;
    border: 2px solid yellowgreen;
  }
  &:checked + ${RadioButtonLabel} {
    background: yellowgreen;
    border: 1px solid yellowgreen;
    &::after {
      content: "\f005";
      font-family: "FontAwesome";
      display: block;
      color: white;
      width: 12px;
      height: 12px;
      margin: 4px;
    }
  }
`;

【问题讨论】:

    标签: reactjs radio-button react-hooks styled-components


    【解决方案1】:

    在 CSS 中没有父选择器,因此您不能从 checkbox 定位父元素。

    但是您可以根据收音机的选定状态添加一个类

    <Item className={select === "optionA" ? 'active-radio' : null}>
    

    或者如果你想通过样式化的组件来实现,你可以使用

    <Item active={select === "optionA"}>
    

    结合

    const Item = styled.div`
      display: flex;
      align-items: center;
      height: 48px;
      position: relative;
      border: 1px solid #ccc;
      box-sizing: border-box;
      border-radius: 2px;
      margin-bottom: 10px;
      ${props => props.active && (`
        box-shadow: 0 0 10px -4px black;
      `)}
    `;
    

    https://codesandbox.io/s/react-styled-components-radio-button-f5zpe的演示

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2021-10-11
      • 2021-12-13
      相关资源
      最近更新 更多