如何在reactJs中的数组内部条件下禁用某些单选按钮

Posted

技术标签:

【中文标题】如何在reactJs中的数组内部条件下禁用某些单选按钮【英文标题】:How to make some radio buttons disable under condition inside array in reactJs 【发布时间】:2022-01-23 10:31:38 【问题描述】:

我在一个电子商务网站上工作,我需要根据颜色显示产品尺寸。所有可用尺寸都可以点击,而其他尺寸将被禁用。这是我的 SizeVariant 组件代码。

import React from "react";
import styled from "styled-components";

const SizeVariant = ( text, ...props ) => 

  return (
    <StyledSizeVariant ...props>
      <input type="radio" name="text" id=text value=text />
      <label htmlFor=text>text</label>
    </StyledSizeVariant>
  );
;

const StyledSizeVariant = styled.div`
  input[type="radio"] 
    display: none;

    &:checked + label 
      box-shadow: 0px 0px 2px #7d7d31;
      border: 2px solid #FFCD4E;
    
     //
  

  label 
    display: inline-block;
    padding: 0 1rem;
    height: 30px;
    margin-right: 10px;
    cursor: pointer;
    font-weight: 600;
    box-shadow: 0px 0px 1px rgba(0, 0, 0, 1);
    text-align: center;
    display: flex;
    align-items: center;
    font-size: 16px;
  
`;

export default SizeVariant;

我有一个尺寸数组。

   <FlexBox alignItems="center" mb="16px">

            sizeList && sizeList.map((item) => (
              <SizeVariant key=item.attribute_title text=item.attribute_title onClick=(e) => handlePrice(item) />
            ))
          </FlexBox>

在某些情况下,我想禁用 sizeList 数组中的某些尺寸(即单选按钮)。我该怎么做?

【问题讨论】:

【参考方案1】:

这取决于您在sizeList 项中有什么信息:

    如果尺码列表只为您提供可用尺码,那么您需要为所有可能的尺码创建单选选项,并仅启用尺码列表中存在的尺码,例如
const allSizes = [
   title: 'S', enabled: false ,
   title: 'M', enabled: false ,
   title: 'L', enabled: false ,
]

const Component = () => 
  const sizes = useMemo(() => 
    return (sizeList || []).reduce((agg, item) => 
      agg[item.attribute_title].enabled = true
      return agg
    , allSizes)
  , [sizeList])

  return (
    <FlexBox alignItems="center" mb="16px">
      sizes.map((item) => (
        <SizeVariant
          key=item.title
          text=item.title
          disabled=item.disabled
          onClick=(e) => handlePrice(item) // you might need to change this to match the new structure
        />
      ))
    </FlexBox>
  )


const SizeVariant = ( text, ...props ) => 

  return (
    <StyledSizeVariant ...props>
      <input type="radio" name="text" disabled=props.disabled id=text value=text />
      <label htmlFor=text>text</label>
    </StyledSizeVariant>
  );
;
    sizeList 包含所有可能的大小,并带有一些属性来判断它是否可用。在这种情况下,您需要将该标志用作禁用的道具。

希望这是有道理的:)

【讨论】:

【参考方案2】:

您可以在输入disable 属性中传递条件。

这是您问题中的代码示例:

<FlexBox alignItems="center" mb="16px">
    sizeList && sizeList.map((item) => (
        <SizeVariant
            key=item.attribute_title
            text=item.attribute_title
            onClick=(e) => handlePrice(item)
            disabled=item.attribute_disable />
    ))
</FlexBox>
// sizevariant
const SizeVariant = ( text, disabled, ...props ) => 
    return (
        <StyledSizeVariant ...props>
            <input type="radio" name="text" id=text value=text disabled=disabled />
            <label htmlFor=text>text</label>
        </StyledSizeVariant>
    );

在这里你可以看到,我已经传递了新的 props,命名为 disabled,并在 SizeVariant 组件中使用了它。


你可以在逻辑上禁用输入框,

<input type="radio" name="text" id=text value=text disabled=something ? true : false />

这里的东西可以是你数组中的任何条件。

【讨论】:

我将如何设置 attribute_disable 属性?现在没有这样的财产。你能详细说明你的答案吗? 你的数组里基本上应该有一些东西,在这个基础上你可以启用和禁用你的输入框,对吧?【参考方案3】:

获取状态并存储单击的单选按钮的索引号。然后比较其他单选按钮的索引号,如果索引不匹配,则可以禁用这些按钮。

import React from "react";
import styled from "styled-components";

const SizeVariant = ( text, ...props ) => 

    const [buttonIndex, setButtonIndex] = useState();


  return (
    <StyledSizeVariant ...props>
      <input onClick=()=>setButtonIndex(index) disabled=buttonIndex  && buttonIndex == indexOfYourArry?false:true type="radio" name="text" id=text value=text />
      <label htmlFor=text>text</label>
    </StyledSizeVariant>
  );
;

【讨论】:

我需要先禁用单选按钮,然后再单击它。我需要显示其中一些已经禁用,这意味着不可点击。

以上是关于如何在reactJs中的数组内部条件下禁用某些单选按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ReactJS 中更改单选按钮时重置选定的下拉列表

OroCommerce:在某些条件下禁用订单编辑

带有禁用日期的 ReactJS 日期范围选择器 - Rsuite

我想在 reactjs 中实现一个条件渲染系统

执行IF条件时如何重定向到ReactJS中的另一个页面?

ReactJS:如何在单选按钮中使用布尔值?