【问题标题】:Bootstrap Checkbox Not Toggling引导复选框未切换
【发布时间】:2021-02-17 03:54:19
【问题描述】:

我正在使用 Bootstrap 复选框和常规复选框。为什么 Bootstrap Checkbox 切换失败,而常规 input 字段切换成功?

onChange = (evt) => {
    const target = evt.target;
    const name = target.name;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    this.setState({
        [name]: value
    });

    this.props.onChange({ name, value });
};
                    <input
                        name="unlimited"
                        type="checkbox"
                        checked={this.state.unlimited}
                        onChange={this.onChange} />
                    <Checkbox
                        name="unlimited"
                        onChange={this.onChange}
                        checked={this.state.unlimited}
                    >
                        UNLIMITED {this.state.unlimited.toString()}
                    </Checkbox>

编辑 我最初发布代码时犯了很多错误。以上是修正后的代码。

编辑 我确信这是一个错误,因为 Bootstrap JS 库正在干扰see here

【问题讨论】:

  • 这可能是因为他们在幕后做了一些有趣的事情。您的 onChange 处理程序需要一个本机复选框事件。查看他们的文档,他们返回值而不是事件。您将不得不编写一个稍微不同的 onChange 处理程序。
  • 我已经 console.logged 一切并且本地事件工作得很好,在type == checkbox 时为我提供了正确的值。 checked 值在真假之间正确切换。
  • 你为什么要更新状态然后调用this.props.onChange??你应该做一个或另一个。

标签: reactjs checkbox react-bootstrap


【解决方案1】:

您正在通过props 将来自父级的值传递给Checkboxchecked 属性。你确定你更新了 parent 中的新 state 并再次传递了一个新的 prop 吗?

这是使用您的代码的示例:

const { Checkbox } = ReactBootstrap;

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      unlimited: false
    };
  }

onChange = (evt) => {
    const target = evt.target;
    const name = target.name;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    this.setState({
        [name]: value
    });
};

  render() {
    const { unlimited } = this.state;
    return (
      <div>
        <input
            name="unlimited"
            type="checkbox"
            checked={this.state.unlimited}
            onChange={this.onChange} />
        <Checkbox
            name="unlimited"
            onChange={this.onChange}
            checked={this.state.unlimited}
        >
            UNLIMITED {this.state.unlimited.toString()}
        </Checkbox>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.31.3/react-bootstrap.min.js"></script>
<div id="root"></div>

编辑

有覆盖 bootstrap.js 的经验吗?它在全球范围内 我们应用的模板页面(PHP smarty)

我不是 PHP 专家,但我想你可以有条件地渲染 bootstrap.js 的脚本标签,所以当你重定向到使用 react 应用程序的页面时,不要渲染 &lt;script&gt; 标签。

【讨论】:

  • 见我编辑的代码 - 我正在更新状态并已确认。
  • 您现在使用 this.state.unlimited 作为 checked 属性,但您从未更新它。您必须更新传递给 checked 属性的布尔值。看我上面的例子
  • 我正在使用 this.setState 设置状态。什么意思?
  • 抱歉,我没有注意到输入的名称是unlimited。无论如何,我完全使用您的代码更新了我的示例,并且它似乎可以正常工作,因此您的项目中肯定有更多代码导致了这种行为
  • 我完全复制了你的代码。在 github 上,他们说这可能是 bootstrap js 文件干扰,请参阅我添加的链接。
【解决方案2】:

您有一个受控输入 - 请参阅 https://reactjs.org/docs/forms.html#controlled-components

在这种情况下,checked 绑定到你父组件的 prop fields={unlimited}

您通过 onChange={} 告诉您的父母有一个新的名称和值 - 它将由 setState() 以传递新的 fields.unlimited 的方式来决定

例如,您的有状态父母可以是:

class Foo extends Component {
  state = {
    unlimited: false
  }

  onChange = (name, value) => this.setState({[name]: value})

  render(){
    return <MyOtherComponent fields={this.state} onChange={this.onChange} />
  }
}

如果您的组件本身是有状态的(查看您的 handleChange),那么您可以转换为不受控制的 (https://reactjs.org/docs/uncontrolled-components.html) 或绑定到本地状态(如果您从 mount 上的 props 同步它并获得 props 时)。

【讨论】:

  • 我发布了错误的代码,我已将其更正为仅依赖本地状态
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多