【问题标题】:React Bootstrap ToggleButton triggering function twiceReact Bootstrap ToggleButton 触发函数两次
【发布时间】:2021-04-06 22:41:24
【问题描述】:

单击我的 react-bootstrap ToggleButtons 时遇到问题。他们似乎两次触发了 handlePlatformChange() 函数——它首先传递了正确的 id,然后在传递 null 之后立即传递。我遇到的一个选项是在函数中包含 e.preventDefault() ,但这会阻止按钮正确切换。我已经用尽了所有我能想到的选项 - 任何建议都将不胜感激。

import React, {Component} from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
import Button from 'react-bootstrap/Button';
import ToggleButton from 'react-bootstrap/ToggleButton';
import ToggleButtonGroup from 'react-bootstrap/ToggleButtonGroup';

class App extends Component {
  constructor () {
    super();
    this.state = {
        User : "",
        Platform: "battle",
        Player: "",
        Level: ""
    };

    this.handleChange = this.handleChange.bind(this);
  }

  handlePlatformChange = (e) => {
    this.setState({Platform: e.target.id}, function () {
      console.log(this.state.Platform);
    });
  }
    
    
  handleChange(e) {
    if (e.target.id === "usernameinput") {
      this.setState({User: e.target.value});
    }
  }

    render() {
        return (
          <div className="infoSection">
          <div className="center">
            <input type="text" id="usernameinput" value={this.state.value} onChange={this.handleChange} placeholder="Username" /><br/>
            <ToggleButtonGroup id="buttongroup" name="buttongroup" defaultValue={[1]}>
              <ToggleButton id="battle" value={1} variant="secondary" onClick={this.handlePlatformChange}></ToggleButton>
              <ToggleButton id="acti" value={2} variant="secondary" onClick={this.handlePlatformChange}></ToggleButton>
              <ToggleButton id="psn" value={3} variant="secondary" onClick={this.handlePlatformChange}></ToggleButton>
              <ToggleButton id="xbl" value={4} variant="secondary" onClick={this.handlePlatformChange}></ToggleButton>
            </ToggleButtonGroup>
            <br/>
              <Button id="searchButton" variant="primary">Search</Button>
              <div className="displaySection">

                <p id="displayHeader">Username: {this.state.Player}<br/>
                Level: {this.state.Level}</p>
                <p id="displayInfo1">some info here</p>
                <p id="displayInfo1">some info here</p>
              </div>
          </div>
          </div>
        );
}
}

export default App;

【问题讨论】:

  • 你可以在handlePlatformChange中添加条件为null。
  • 您需要在此处进行一些调试...在您的 handlePlatformChange 方法上,只需 console.log(e.target) 即可检查您得到的结果。正在寻找您的代码,我猜测您没有达到理想的目标。

标签: javascript css reactjs bootstrap-4 react-bootstrap


【解决方案1】:

您的 ToggleButton 元素实际上是标签内的输入。将此元素转换为您拥有的纯 html(第一个按钮的示例):

<label id="battle" variant="secondary" type="button" class="btn btn-default active"
  <input type="radio" name="buttongroup" autocomplete="off" value="1"></input>
</label>

您想要的 id 在标签标签上,但是当您单击输入时,您只能到达输入标签。

所以,要解决您的问题,您需要将您的 handlePlatformChange 方法更改为:

handlePlatformChange = (e) => {
    this.setState({Platform: e.target.parentNode.id}, function () {
      console.log(this.state.Platform);
    });
  }

【讨论】:

  • 谢谢!这解决了我的问题。但是,我确实必须将 e.preventDefault() 添加回我的函数中才能正常工作。我仍然收到两个 console.log 输出...但我认为这是因为 onClick 事件同时适用于标签和输入字段,所以它本质上调用了两次函数?
  • 没错..您正在触发点击标签和输入。但是,您可以将 css 属性“pointer-events: none”设置为该表单标签,以避免在这些标签上发生点击事件。
  • 我猜是这样的:#buttongroup label { pointer-events: none } 会解决你的问题。
  • 未来访问者的注意事项:更改 onClick => onChange 也将解决此问题。
  • @KreepN 是正确的 - 存在双重触发器,因为当值更改时,会再次调用 onChange 处理程序 - 检查文档
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2018-10-16
  • 2013-12-02
  • 2018-01-08
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多