当前位置: 首页 > 知识库问答 >
问题:

向数组中添加复选框并删除未选中的复选框-react native

曾景龙
2023-03-14

我需要做的是-添加/删除数组中每个复选框的名称(由用户选中/未选中),并发送到服务器。我被困在以下代码中。任何帮助都很感激。谢啦

class App extends Component<Props> {
  render() {
    return (
      <View style={{ padding: 15 }}>
        {
            response.map(
              item => {
                return (
                  <CheckBoxItem label={item.name} />
                );
              }
            )
        }
       </View>
    );
  }
}

复选框项目。js

class CheckBoxItem extends Component<Props> {
  state = {
    check: false,
    problemTypeArray: [],
  }

  changeArray = (label) => {
      let array = [...this.state.problemTypeArray, label];
      let index = array.indexOf(label);
      console.log('array', array);//returns array with length 1 all the time
  }

  render() {
    return (
      <View>
        <CheckBox value={this.state.check} onValueChange={(checkBoolean) => { this.setState({ check: checkBoolean }); this.changeArray(this.props.label); }} />
        <MyText>{this.props.label}</MyText>
      </View>
    );
  }
}

export default CheckBoxItem;

共有1个答案

解修然
2023-03-14

真正的诀窍是在父组件中维护选定项的列表。每个CheckBoxItem都可以控制自己的状态,但每次选中/取消选中时,都需要将值传递回父组件。

由于您尚未显示复选框组件的来源,我将向您展示如何使用react native元素复选框。然后,这些原则可以应用于您自己的复选框

这里是App.js

import CheckBoxItem from './CheckBoxItem'

export default class App extends React.Component {

  // set some initial values in state
  state = {
    response: [
      {
        name:'first'
      },
            {
        name:'second'
      },
            {
        name:'third'
      },
      {
        name:'fourth'
      },
            {
        name:'fifth'
      },
            {
        name:'sixth'
      },
    ],
    selectedBoxes: [] // this array will hold the names of the items that were selected
  }

  onUpdate = (name) => {
    this.setState(previous => {
      let selectedBoxes = previous.selectedBoxes;
      let index = selectedBoxes.indexOf(name) // check to see if the name is already stored in the array
      if (index === -1) {
        selectedBoxes.push(name) // if it isn't stored add it to the array
      } else {
        selectedBoxes.splice(index, 1) // if it is stored then remove it from the array
      }
      return { selectedBoxes }; // save the new selectedBoxes value in state
    }, () => console.log(this.state.selectedBoxes)); // check that it has been saved correctly by using the callback function of state
  }

  render() {
    const { response } = this.state;
    return (
      <View style={styles.container}>
        {
          response.map(item => <CheckBoxItem label={item.name} onUpdate={this.onUpdate.bind(this,item.name)}/>)
        }
      </View>
    );
  }
}

这是CheckBoxItem

import { CheckBox } from 'react-native-elements'

class CheckBoxItem extends Component<Props> {
  state = {
    check: false, // by default lets start unchecked
  }

  onValueChange = () => {
    // toggle the state of the checkbox
    this.setState(previous => {
      return  { check: !previous.check }
    }, () => this.props.onUpdate()); 
    // once the state has been updated call the onUpdate function
    // which will update the selectedBoxes array in the parent componetn
  } 

  render() {
    return (
      <View>
        <CheckBox 
          title={this.props.label}
          checked={this.state.check} 
          onPress={this.onValueChange} 
        />
      </View>
    );
  }
}

export default CheckBoxItem;

创建CheckBoxItem时,会向其传递两个内容。一个是标签,第二个是onUpdate函数。onUpdate函数将CheckBoxItem链接回父组件,以便它可以操作父组件中的状态。

onUpdate函数获取应用此更新之前的状态值,并查看selectedbox数组中是否存在复选框的名称。如果它存在于selectedbox数组中,则会将其删除,否则会将其添加。

现在,父组件中存在一个数组,您可以访问该数组,该数组包含所有已选择的项。

想试试我的代码吗?我已经制作了一种零食,可以证明它是有效的https://snack.expo.io/@andypandy/复选框

您可能已经注意到,我正在使用setState执行一些不寻常的操作。通过使用状态的上一个值,然后对该值应用我的更新,我确保正确调用setState。我还利用了这样一个事实,即setState在状态更新后执行回调操作。如果你想阅读更多,这里有一些关于setState的好文章。

  • https://medium.learnreact.com/setstate-is-asynchronous-52ead919a3f0
  • https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296
  • https://medium.learnreact.com/setstate-takes-a-function-56eb940f84b6
 类似资料:
  • 我目前有以下情况: 我有多个复选框,一旦单击任何复选框,它的值将添加到数组中。如果未选中该复选框,则需要再次将该项从数组中删除。 以下操作有效,并将它们添加到我的中。但当再次选中该复选框时,它不会被删除。当然,我可以使用

  • 我试图创建一个表单,该表单顶部有一个复选框,当用户选中该复选框时,它会选择其他特定的复选框,但不是所有复选框。我很难通过反复试验或搜索找到答案。我唯一能找到的就是“全选”选项。不是我想要的。 理想情况下,当用户选中“管理包”旁边的复选框时,我想要“Chrome外观组”和“远程启动” 下面是代码和我在这方面的基本尝试,但它不起作用。提前谢谢。 超文本标记语言: Javascript 我不知道这个Ja

  • 问题内容: 如何在Firefox中设置复选框样式,并取消选中标记和边框? CSS: HTML: 问题答案: input[type=”checkbox”] {

  • 问题内容: 我有一堆默认情况下处于选中状态的复选框。我的用户可能会取消选中某些复选框(如果有),而其余复选框保持选中状态。 有没有什么办法让表单POST所复选框 不 检查,而不是的那些 被 选中? 问题答案: 为具有不同ID的复选框添加隐藏的输入: 提交表单之前,请根据检查的条件禁用隐藏的输入:

  • 我有一个复选框,其中有一对项目,当我单击该复选框时,该项目将添加到名为currentDevice的状态,但当我取消选中该项目时,它将保留“添加项目”,而不是删除它。 当我取消选中该框时,如何从状态中删除项。Im使用“反应本机元素”复选框。谢谢你 代码:

  • 我希望在选中表中的所有复选框时选中标题复选框,如果没有选中单个复选框,则应取消选中标题复选框。