如果选中复选框,则反应复选框

时间:2020-05-24 13:10:09

标签: javascript reactjs checkbox checked

嗨,这可能是一个非常新手的问题,但这是我的问题。我有代表一周中所有时间的复选框。如果检查了一天,我想将其添加到数组中,以便在提交时可以将数组传递到后端。我从启动复制了复选框结构。我试图添加逻辑以查看是否选中了框,以及是否选中了框,我想将其推入状态为空数组。另外,如果选中了一个复选框,然后又未选中它,那么我想从状态数组中删除该项目。到目前为止,我还没有找到一种方法可以使所有这些工作。

import React from 'react'

class CalenderSettingsModal extends React.Component {
    constructor(props) {
        super(props);
        this.state={
            workStart: 8,
            workEnd: '',
            workDays:[],

        }

        handleCheckboxChange = (event)=> this.setState({workDays: event.target.value});


    }

    render() {


        return (
            <React.Fragment>
                        <form>
                            <div>
                                <h5>Select your workday(s):</h5>
                                <div class="custom-control custom-checkbox " >
                                    <input type="checkbox" class="custom-control-input" id="monday" value="monday"  onChange={this.handleCheckboxChange}/>
                                    <label class="custom-control-label" for="monday">Monday</label>

                                </div>
                                <div class="custom-control custom-checkbox">
                                    <input type="checkbox" class="custom-control-input" id="tuesday" value="tuesday" onChange={ this.handleCheckboxChange}/>
                                    <label class="custom-control-label" for="tuesday">Tuesday</label>

                                </div>

                        </form>
                            <button >Save settings</button>



            </React.Fragment>

        );
    }
}

export default CalenderSettingsModal;

到目前为止,当复选框被选中但无法正常工作时,我试图完成将值分配给workDays的任务,而且我不确定如何完成我想做的事情。任何见识将不胜感激。

4 个答案:

答案 0 :(得分:2)

现在,您正在将workDays数组分配为string类型。

您可以使用spread运算符将值添加到workDays状态数组中。如果event.target.id状态中已经存在workDays,则可以对其进行过滤。这是工作代码段。

Edit reverent-franklin-ziqrn

 handleCheckboxChange = event => {
    let newArray = [...this.state.workDays, event.target.id];
    if (this.state.workDays.includes(event.target.id)) {
      newArray = newArray.filter(day => day !== event.target.id);
    } 
    this.setState({
      workDays: newArray
    });
  };

答案 1 :(得分:1)

看看是否有帮助。

class CalenderSettingsModal extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      workStart: 8,
      workEnd: '',
      workDays: [],
    }
  }

  handleCheckboxChange = (event) => {
    if (event.target.checked) {
      if (!this.state.workDays.includes(event.target.value)) {
        this.setState(prevState => ({ workDays: [...prevState.workDays, event.target.value]}))
      }
    } else {
      this.setState(prevState => ({ workDays: prevState.workDays.filter(day => day !== event.target.value) }));
    }
  }


  render() {
    return (
      <React.Fragment>
        <form>
          <div>
            <h5>Select your workday(s):</h5>
            <div class="custom-control custom-checkbox" >
              {
                ["Monday", "Tuesday", /*... */].map(day => {
                  return (
                    <div class="custom-control custom-checkbox">
                      <input type="checkbox" class="custom-control-input" id={day} value={day} onChange={this.handleCheckboxChange} />
                      <label class="custom-control-label" for={day}>{day}</label>
                    </div>
                  )
                })
              }
            </div>
          </div>
        </form>
        <button >Save settings</button>
      </React.Fragment>

    );
  }
}

答案 2 :(得分:1)

不必保留所有选中复选框的数组。 保存数据时,您可以轻松收集所有复选框。

const checkedBoxes = document.querySelectorAll('input[type=checkbox]:checked');

如果您有不同的复选框组,则可以使用唯一的类来标识该组:

const checkedBoxes = document.querySelectorAll('input[class=unique-class]:checked');

答案 3 :(得分:0)

const [category_check_list, setCategoryCheckList] = useState([]);
const categoryCheckboxFilterHandler = e => {
    if (e.target.checked == true){
        setCategoryCheckList([...category_check_list, Number(e.target.value)]);
    }else{
        let check_list = [];
        category_check_list.map(check => {
            if (Number(check) != Number(e.target.value)){
                check_list.push(Number(check));
            }
        });
        setCategoryCheckList(check_list);
    }
};
var checked_category_id_list = category_check_list.toString();

然后在返回中我放置了以下代码,它对我来说很完美,因为现在它是动态的

return(
<>
 {categoriesQuery.isLoading ? (
   <span>Loading...</span>
    ) : categoriesQuery.isError ? (
    categoriesQuery.error.message
    ) : (
    categoriesQuery.data.slice(0, list_limit).map((category) => (
    <Grid item key={category.id} >
     <Paper className={paper}>
      <div className="form-check">
 <label htmlFor={category.id} className="form-check-label-form_check_label">
 <input className="form-check-label form_checkbox" type="checkbox" 
        name={category.category_name} value={category.id}  id={category.id} 
        onChange={e => categoryCheckboxFilterHandler(e)} />
             {category.category_name}
   </label>
                       </div>
               </Paper>
            </Grid>
         ))
             )}
   <>
)

我使用的是 Material UI 设计,因此使用了 Grid 和 Paper,您也可以替换为 div