根据复选框过滤数据库

时间:2018-07-05 09:53:19

标签: javascript reactjs checkbox

我想通过用户选择的复选框来过滤我的Firebase查询。我本来想通过复选框来做到这一点,但似乎并不是一个好主意。

这是我的代码:

handleCheckboxChange(value) {
    console.log(value);
}


<form style={{marginTop: 100}}>
    <FormGroup
        controlId="formBasicText">
        <ControlLabel>Working example with validation</ControlLabel>
        <FormGroup>
            <Checkbox onChange={() => this.handleCheckboxChange('Primary School')} inline>Primary
                School</Checkbox>
            <Checkbox inline>Middle School</Checkbox>
            <Checkbox inline>High School</Checkbox>
        </FormGroup>
        <FormGroup>
            <Checkbox inline>Math</Checkbox>
            <Checkbox inline>Chinese</Checkbox>
            <Checkbox inline>History</Checkbox>
            <Checkbox inline>Physics</Checkbox>
            <Checkbox inline>Chemistry</Checkbox>
            <Checkbox inline>Biology</Checkbox>
            <Checkbox inline>Geography</Checkbox>
            <Checkbox inline>English</Checkbox>
            <Checkbox inline>German</Checkbox>
            <Checkbox inline>Spanish</Checkbox>
            <Checkbox inline>Something</Checkbox>
            <Checkbox inline>Else</Checkbox>
            <Checkbox inline>IT</Checkbox>
            <Checkbox inline>Other</Checkbox>
        </FormGroup>
    </FormGroup>
</form>

这些是复选框。所以问题是,我需要获取Primary SchoolBiology等值,并使用它们来过滤我的数据库。但是我不知道如何使他们正确。如果我将其作为函数参数传递(例如在Primary School示例中),则意味着我必须做两次所有事情,这没有任何意义。

所以我的问题是:如何获取Checkbox元素的值,而不必每次都将其传递给函数?

Checkbox元素正在使用react-bootstrap。它呈现为:

<label class="checkbox-inline" title="">
<input type="checkbox">Primary School</label>

1 个答案:

答案 0 :(得分:1)

您可以将所有这些选项添加到某个数组

const OPTIONS = ["Math", "Chinese", "History", "Physics", ...];

,然后从该数组中创建如下复选框:

<FormGroup>
{OPTIONS.map((option, index) => (
    <Checkbox
        key={index}
        title={option}
        value={option}
       checked={this.state.options.includes(option)}
       onChange={this.handleCheckboxChange}
    />
 ))}

并管理handleCheckboxChange内部的值,您需要在组件内部创建状态,例如this.state = {options:[“”]},然后将值添加/删除到这样的选项数组中

handleCheckbox = e => {
    let val = e.target.value;
    console.log({val});
    if (this.state.options.includes(val)) {
        this.setState(prevState => ({
            options: prevState.options.filter(option => option !== val)
        }));
    } else {
        this.setState(prevState => ({
            options: [...prevState.options, val]
        }));
    }
};