【问题标题】:Unable to persist the checkboxes无法保留复选框
【发布时间】:2020-05-11 19:48:35
【问题描述】:

当我更改组件并返回时,我无法保留复选框...只是我想保留选中的复选框

这是代码沙盒的链接:https://codesandbox.io/s/suspicious-glitter-0or0t?file=/src/components/branches.js...请看上面代码沙盒的链接...

courses.js

import React, { Component } from "react";
import Checkbox from "@material-ui/core/Checkbox";
import FormGroup from "@material-ui/core/FormGroup";
import FormControlLabel from "@material-ui/core/FormControlLabel";
import { List, ListItem } from "@material-ui/core";
import Button from "react-bootstrap/Button";

// const [isChecked, setIsChecked] = useState(true);
class CheckboxComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      values: {},
      count: 0,
      checked: true
    };
    this.ChangeCheckBox = this.ChangeCheckBox.bind(this);
    this.checkBoxSubmit = this.checkBoxSubmit.bind(this);
  }
  ChangeCheckBox = e => {
    let checked = e.target.checked;
    let { count } = this.state;
    let value = this.state.values;
    if (checked) {
      // console.log("checked");
      count++;
      this.setState({
        checked
      });
    } else {
      // console.log("un-checked");
      count--;
    }
    this.setState({ count });
    // console.log(count);
    // console.log(checked);
    // console.log(value);

    value[e.target.value] = e.target.checked;
    this.setState({ values: value });
  };
  checkBoxSubmit = e => {
    let CheckedValues = this.state.values;
    e.preventDefault();
    console.log(CheckedValues);
  };
  render() {
    const arr = ["Course 1", "Course 2", "Course 3"];
    return (
      <React.Fragment>
        <form onSubmit={this.checkBoxSubmit}>
          <FormGroup aria-label="position" row>
            <List className="courses-college-regis">
              {arr.map((a, key) => (
                <ListItem button key={key}>
                  <FormControlLabel
                    label={a}
                    type="checkbox"
                    value={a}
                    name={a}
                    control={<Checkbox color="primary" />}
                    onChange={this.ChangeCheckBox}
                  />
                </ListItem>
              ))}
            </List>
          </FormGroup>
          count:{this.state.count}
          <br />
          <Button type="submit" variant="primary">
            Submit
          </Button>
        </form>
      </React.Fragment>
    );
  }
}

export default CheckboxComponent;

branch.js

import React, { Component } from "react";
import Checkbox from "@material-ui/core/Checkbox";
import FormGroup from "@material-ui/core/FormGroup";
import FormControlLabel from "@material-ui/core/FormControlLabel";
import { List, ListItem } from "@material-ui/core";
import Button from "react-bootstrap/Button";

// const [isChecked, setIsChecked] = useState(true);
class BranchComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      values: {},
      count: 0,
      checked: true
    };
    this.ChangeCheckBox = this.ChangeCheckBox.bind(this);
    this.checkBoxSubmit = this.checkBoxSubmit.bind(this);
  }
  ChangeCheckBox = e => {
    let checked = e.target.checked;
    let { count } = this.state;
    let value = this.state.values;
    if (checked) {
      // console.log("checked");
      count++;
      this.setState({
        checked
      })
    } else {
      // console.log("un-checked");
      count--;
    }
    this.setState({ count });
    // console.log(count);
    // console.log(checked);
    // console.log(value);

    value[e.target.value] = e.target.checked;
    this.setState({ values: value });
  };
  checkBoxSubmit = e => {
    let CheckedValues = this.state.values;
    e.preventDefault();
    console.log(CheckedValues);
    localStorage.setItem('this.state.values', CheckedValues)
  };
  render() {
    const arr = ["Branch 1", "Branch 2", "Branch 3"];
    return (
      <React.Fragment>
        <form onSubmit={this.checkBoxSubmit}>
          <FormGroup aria-label="position" row>
            <List className="courses-college-regis">
              {arr.map((a, key) => (
                <ListItem button key={key}>
                  <FormControlLabel
                    label={a}
                    type="checkbox"
                    value={a}
                    name={a}
                    control={<Checkbox color="primary" />}
                    onChange={this.ChangeCheckBox}
                  />
                </ListItem>
              ))}
            </List>
          </FormGroup>
          count:{this.state.count}
          <br />
          <Button type="submit" variant="primary">
            Submit
          </Button>
        </form>
      </React.Fragment>
    );
  }
}

export default BranchComponent;

【问题讨论】:

  • 保持复选框是什么意思?您是指在单个页面加载内还是跨页面加载?如果是后者,您将需要一个带有数据库和一些端点的服务器,或者至少是本地存储。

标签: javascript reactjs checkbox


【解决方案1】:

您需要将这些值保存到localStorage

将您最初的 state 更改为:

this.state = {
   values: {},
   count: 0,
   checked: localStorage.getItem('checkbox') === 'true' ? true : false
};

然后在您的 ChangeCheckBox 处理程序中,在其底部添加以下行:

localStorage.setItem('checkbox', e.target.checked.toString())

这会更新您提供的 localStorage 键的值,然后将您的初始状态设置为保存在本地存储中的该键值。

【讨论】:

  • 它不工作巴里....如果我改变试图改变组件..来了...检查正在消失
  • 您需要控制复选框,因此表单控件上的checked 值应设置为this.state.checked
  • 如果我喜欢这样......复选框无法正常工作......codesandbox.io/s/thirsty-shadow-6fmv0?file=/src/components/…
  • 那么你需要保持数组处于状态并保持它并在那里保持它们的检查值。
  • 看你的问题是关于如何使用持久状态,我给了你一个持久状态键的解决方案。您需要先自己更改应用程序,以确保您的复选框值受到控制并链接到状态。完成后,我将更新我的答案以解决问题。我不是为你写你的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2022-01-17
  • 2020-10-18
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多