javascript - react js eventListeners 没有按预期删除

标签 javascript reactjs event-handling react-router addeventlistener

我正在开发一个包含多个页面的 React Web 应用程序。 我设置了一个在页面之间切换的 React 路由器。

类似于:

render((
    <Provider store={store}>
        <BrowserRouter>
            <Switch>
                <Route exact path='/' component={RedirectPage} />
                <Route exact path='/sign-in' render={() => <PlayerSelect />}/>
                <Route exact path='/most-recent-scenario' render={() => <ScenarioInterface />} />
                <Route exact path='/home' render={() => <Home />} />
                <Route exact path='/scenario/:id' render={props => <Index {...props} /> } />
                <Route exact path='/user-select' render={() => <UserSelect />}/>
            </Switch>
        </BrowserRouter>
    </Provider>
), document.getElementById('root'));

在页面本身,我使用了 react-router Redirect功能来回导航。像这样的东西:

import { Redirect} from 'react-router-dom'

class Index extends React.Component {
  state = {
    ...
    redirect: false,
    redirect_to: ""
  }

  setRedirect = (page) => {
      this.setState({
      redirect: true,
      redirect_to: page})
  }

  renderRedirect = () => {
  if (this.state.redirect) {
      return <Redirect to={this.state.redirect_to} /> }
  }

  render(){
    return (
        <div className={classes.root}>
          {this.renderRedirect()}
          ...

这一切都有效。但是,在一页上,我使用了一些键绑定(bind)。

我了解到分配键绑定(bind)的最佳方法是在创建组件时执行,例如 <MyWebpage onKeyDown={handleKeyDown} /> ,但由于遗留原因,这对我来说并不容易,目前我使用 :

进行键绑定(bind)
  componentDidMount(){
    document.addEventListener("keydown", this.handleKeyDown.bind(this));
    document.addEventListener("keyup", this.handleKeyUp.bind(this));}

  componentWillUnmount(){
    document.removeEventListener("keydown", this.handleKeyDown.bind(this));
    document.removeEventListener("keyup", this.handleKeyUp.bind(this));}

我发现 handleKeyDown仍在调用,即使在我导航到另一个页面之后也是如此。我检查过:componentWillUnmount被调用并执行。

所以我想弄清楚为什么我的 removeEventListener不工作以及如何修复它们。

最佳答案

您应该删除您添加的同一个监听器。所以我建议在 constructor 中创建一个绑定(bind)到 this 的最终版本,并在生命周期回调中对其进行操作:

  .....

  constructor(props) {
    super(props);

    this.handleKeyDown = this.handleKeyDown.bind(this);
    this.handleKeyUp = this.handleKeyUp.bind(this);
  }

  componentDidMount() {
    document.addEventListener("keydown", this.handleKeyDown);
    document.addEventListener("keyup", this.handleKeyUp);
  }

  componentWillUnmount() {
    document.removeEventListener("keydown", this.handleKeyDown);
    document.removeEventListener("keyup", this.handleKeyUp);
  }

  .....

关于javascript - react js eventListeners 没有按预期删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52073268/

相关文章:

javascript - 在 python 中使用 selenium 单击相同的按钮配置

javascript - 根据状态变化仅将样式应用于一个 div

reactjs - 如何将 FontAwesome 5 Pro 与 React 集成?

wpf - 在列表框中添加项目时将调用的事件处理程序

javascript - 将相同的更改功能应用于多个 div?

javascript - 为句子及其子集设计正则表达式

javascript - Xamarin Forms - 渲染为 HTML/JavaScript

css - 无法在与样式化组件的 react 中实现图像转换

javascript - jQuery 事件处理程序在 Chrome popup.js 中不起作用

Javascript - Bron-Kerbosch、Girvan-Newman 算法(图中的最大集团/社区)