ReactJS - 鼠标点击无需点击即可触发

IT技术 javascript reactjs
2021-05-09 15:39:33

我是 React.JS 的新手,并尝试在渲染组件内的元素上创建单击事件。

这是我的代码:

class InputPanel extends React.Component{

  handleClick(i,j) {    
    this.props.dispatch(actions.someMethod());
   // e.preventDefault();
  }  

  render() {
    const { dispatch, board } = this.props;

    return(
   <div>           
      {
        board.map((row, i) => (
        <div>{row.map((cell, j) => <div className="digit" 
                                onClick={this.handleClick(i,j)}>{cell}</div>)}</div>
      ))
    }
  </div>
   );

 }
};

我的问题是“handleClick”在页面加载后被触发而没有点击任何鼠标!

我已经阅读了 React.JS 生命周期并考虑过在componentDidMount方法中注册点击事件,但我真的不确定:

  1. 有没有更简单的方法?(或:我做错了什么触发了点击?)

  2. 如果添加componentDidMount方法是正确的方法 - 如何获取我在render方法中创建的元素

4个回答

你应该使用.bind经过回调做props时。有一个ESLint 规则您可以在此处阅读有关如何在不破坏 React 性能的情况下传递回调的更多信息

概括:

  1. 确保您不是在调用函数,而是在 props 中将函数作为处理程序传递。
  2. 确保您没有在每次渲染时创建函数,为此,您需要在父组件中绑定处理程序,将所需的数据(例如迭代索引)向下传递到子组件,并让它使用数据调用父组件的处理程序它有

理想情况下,您应该为行创建另一个组件并在那里传递回调。此外,理想情况下,您应该在父组件的构造函数(或 componentWillMount)中绑定 onClick。否则,每次运行呈现一个新的功能被创建(在这两个匿名函数处理() => { this.onClick() },并this.onClick.bind和失败阵营的虚拟域差异造成的每一行重新呈现每一次。

所以:

class InputPanel extends React.Component{
  constructor() {
    super();
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(i,j) {    
    this.props.dispatch(actions.someMethod());
   // e.preventDefault();
  }  

  render() {
    const { dispatch, board } = this.props;

    return(
   <div>           
      {board.map((row, i) => <div>
          {row.map((cell, j) => <Digit 
            onClick={this.handleClick})
            i={i} 
            j={j}
            cell={cell}
          />)}
      </div>)}
  </div>
   );

 }
};

class Digit extends React.Component {
  constructor() {
    super();
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    this.props.onClick(this.props.i, this.props.j);
  }

  render() {
    return <div 
      className="digit"
      onClick={this.handleClick}
    >{this.props.cell}</div>
  }
} 

这是因为您正在调用 this.handleClick() 函数而不是提供函数定义作为 onClick props。

尝试像这样更改 div 行:

<div className="digit" onClick={ () => this.handleClick(i,j) }>{cell}</div>

您还必须绑定 this.handleClick() 函数。您可以添加一个构造函数并在那里绑定一个类的所有成员函数。这是 ES6 中的最佳实践。

constructor(props, context) {
  super(props, context);
  this.handleClick = this.handleClick.bind(this);
}

你在渲染中调用这个函数。你应该只传递函数和bind参数。

onClick={this.handleClick.bind(null,i,j)}

你应该使用.bind().

class InputPanel extends React.Component{

  handleClick(i,j) {    
    this.props.dispatch(actions.someMethod());
   // e.preventDefault();
  }  

  render() {
    const { dispatch, board } = this.props;

    return(
   <div>           
      {
        board.map((row, i) => (
        <div>{row.map((cell, j) => <div className="digit" 
                                onClick={this.handleClick.bind(null,i,j)}>{cell}</div>)}</div>
      ))
    }
  </div>
   );

 }
};