reactjs - 禁用非 defaultChecked 项目的复选框

标签 reactjs class checkbox default

我有两个复选框项目。其中之一将在进入页面时通过 Prop 默认选择。根据默认选择的项目,进入页面时应禁用其他复选框项目

此外,用户可以取消选择默认选中的项目,在这种情况下,两个复选框都会变为可供选择的状态。当用户选择这两个选项之一时,未选择的选项将再次被禁用。

有效方法:当我取消选择默认选项并重新选择两个复选框之一时,禁用的行为可以正常工作(因为未选择的选项将被禁用)。

什么不起作用并需要找到解决方案:当我进入该页面时,需要禁用默认情况下未选择的选项。我需要弄清楚如何在进入页面时禁用未选择的选项。

我有一个包含以下内容的类组件:

      constructor(props) {
         super(props);
         this.state = {
           aSelected: false,
           bSelected: false
         }
      }
  
     handleCheckboxChange = (e) => {   
         const { checked, value } = e.target;

         // NOTE: 'checked' is a boolean

         if(value=="a") {
            this.setState( {aSelected: checked} );
         }

         if(value=="b") {
            this.setState( {bSelected: checked} );
         } 
     }

     // returns default value of each checkbox based on props
     handleDefault = (trueOrFalse, name) => {   
         if(name == "a") { return trueOrFalse; } 
         if(name == "b") { return trueOrFalse; }
     }

在渲染返回的某个地方,我有这个:

<input>
   type="checkbox"
   value="a"
   onChange={this.handleCheckboxChange}
   disabled={ (this.state.aSelected || (!this.state.aSelected && !this.state.bSelected) ) ? false : true}
   defaultChecked={this.handleDefault(this.props.selected["a"], "a")}
</input>

<input>
   type="checkbox"
   value="b"
   onChange={this.handleCheckboxChange}
   disabled={ (this.state.bSelected || (!this.state.aSelected && !this.state.bSelected) ) ? false : true}
   defaultChecked={this.handleDefault(this.props.selected["b"])}
</input>

最佳答案

目前,您正在通过 false 值初始化 aSelectedbSelected 状态,为了处理您的场景,您可以通过 props 初始化您的状态在组件的构造函数中,如下例所示:

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      aSelected: props.selectedValue == 'a',
      bSelected: props.selectedValue == 'b',
    };
  }

  handleCheckboxChange = (e) => {
    const { checked, value } = e.target;
    if (value == 'a') {
      this.setState({ aSelected: checked });
    }

    if (value == 'b') {
      this.setState({ bSelected: checked });
    }
  };

  render() {
    return (
      <div>
        <input
          type="checkbox"
          value="a"
          onChange={this.handleCheckboxChange}
          defaultChecked={this.props.selectedValue == 'a'}
          disabled={
            this.state.aSelected ||
            (!this.state.aSelected && !this.state.bSelected)
              ? false
              : true
          }
        />

        <input
          type="checkbox"
          value="b"
          defaultChecked={this.props.selectedValue == 'b'}
          onChange={this.handleCheckboxChange}
          disabled={
            this.state.bSelected ||
            (!this.state.aSelected && !this.state.bSelected)
              ? false
              : true
          }
        />
      </div>
    );
  }
}

ReactDOM.render(<App selectedValue='a'/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

关于reactjs - 禁用非 defaultChecked 项目的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70759628/

相关文章:

java - Android:如何在另一个包的 Activity 中显示异步任务的进度对话框?

c++ - 将值返回给 C++ 中的类对象

checkbox - WPF 将 DataGridCheckBoxColumn 更改为红点

reactjs - eslint vscode 插件不会为钩子(Hook)产生警告

javascript - (REACT) 如何从数组创建动态选择选项列表

javascript - 无法使用 Expo.io 在 IOS 上测试我的应用程序。找不到模块 hashAssetFiles

javascript - index.js :1 Material-UI: The key `selectLabel` provided to the classes prop is not implemented in ForwardRef(TablePagination)

c# - 基类、派生类、Iclass?

data-binding - 如何在 AngularJS 中使用 radio 和复选框绑定(bind)到复杂对象?

带有 CheckBox : setOnClickListener or setOnCheckedChangeListener 的 Android 自定义适配器