【问题标题】:Handling state with multiple checkboxes in React Native在 React Native 中使用多个复选框处理状态
【发布时间】:2019-07-22 17:33:14
【问题描述】:

我有一个带有两个复选框的简单表单,供某人选择一个或另一个,即YesNo 不是两者都选。我正在使用React-native-element 工具包,如下所示。

export default class CheckerForm extends React.Component {
     state = {
       checked: false,
      }
    handleYesCheck =() => {
       this.setState({checked: !this.state.checked})
    }

    handleNoCheck =() => {
      this.setState({checked: !this.state.checked})
    }

    render(){

   const { checked } = this.state
     return (
      <View>
       <CheckBox
       center
        title='Yes'
        checked={checked}
        onPress={this.handleYesCheck}
     />
     <CheckBox
      center
      title='No'
      checked={checked}
      onPress={this.handleNoCheck}
    />
   <View>

我想捕获和修改复选框的状态,但是当我单击其中一个复选框时,我会修改另一个复选框的状态,即都将被选中和未选中。如何独立修改复选框的状态,以便当我单击 Yes 时,No 处于未选中状态,反之亦然?一般来说,捕获状态以便我可以使用它的最佳方法是什么。

【问题讨论】:

    标签: javascript reactjs react-native react-native-elements


    【解决方案1】:

    你可以做的是有一个复选框数组,并将选中的索引保存在状态中。

    state = {
      checkedId: -1,
      checkboxes: [{
        id: "yes",
        title: "Yes"
      }, {
        id: "no",
        title: "No"
      }]
    }
    
    handleCheck = (checkedId) => {
      this.setState({
        checkedId
      })
    }
    
    render() {
        const {
          checkboxes,
          checkedId
        } = this.state
        return ( <
          View > {
            checkboxes.map(checkbox => ( <
                CheckBox center key = {
                  checkbox.id
                }
                title = {
                  checkbox.title
                }
                checked = {
                  checkbox.id == checkedId
                }
                onPress = {
                  () => this.handleCheck(checkbox.id)
                }
                />
              )
            } <
            View >
          )
        }
    

    这样您还可以处理两个以上的复选框,并且还可以知道索引检查的是哪一个。

    【讨论】:

    • 使用索引来跟踪检查值通常不是一个好主意。尝试使您的代码更明确和指令
    • @JohnRuddell 为什么这不是一个好主意?如果你想拥有两个以上的复选框,那你会怎么做呢?
    • 我会引用一些独特的东西。表示选择的活动项目是 x。也许这意味着您在对象中定义了一个id,并将id 设置为选定项。您的checked 属性将是checked={checkbox.id === selectedId}。仅作为示例,但它更具指导性并且可能更不容易出错:)
    • @JohnRuddell 这是一个很好的观察,使用一些独特的属性确实比索引更好
    • 是的!如果您尝试保持这样的明确性,当产品希望您让用户拖放以更改复选框的顺序(例如作为用例)时,您可以实现该功能而无需更改验证方式作品。因为更改顺序会引入数组索引到检查值的错误(可能会检查您不想检查的内容,因为索引到检查的映射)
    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2018-03-18
    • 2020-03-24
    • 2022-01-14
    • 2019-05-26
    • 2016-12-15
    • 2019-03-01
    相关资源
    最近更新 更多