有没有办法让这3个事件有一个事件?

时间:2017-10-05 00:54:48

标签: javascript reactjs redux jsx

如何将这3个事件处理程序合并为1个?我的行动中只有一个属性是不同的。

  clickHandler1 () {
    this.props.dispatch({type: 'updateMenuFave', current: '1' });
  }
  clickHandler2 () {
    this.props.dispatch({type: 'updateMenuFave', current: '280' });
  }
  clickHandler3 () {
    this.props.dispatch({type: 'updateMenuFave', current: '268' });
  }

相关的React / JSX

  <div id = 'arc_hold'>
    <img className='arcs' id="arc_arc" src="../_images/arc_arc.svg" onClick={this.clickHandler1.bind(this)} ></img>
    <img className='arcs' id="arc_news" src="../_images/arc_news.svg" onClick={this.clickHandler2.bind(this)} ></img>
    <img className='arcs' id="arc_sw" src="../_images/arc_sw.svg" onClick={this.clickHandler3.bind(this)} ></img>
  </div>

4 个答案:

答案 0 :(得分:2)

重用处理程序:

  <div id = 'arc_hold'>
    <img className='arcs' id="arc_arc" src="../_images/arc_arc.svg" onClick={this.clickHandler.bind(this, '1')} ></img>
    <img className='arcs' id="arc_news" src="../_images/arc_news.svg" onClick={this.clickHandler.bind(this, '280')} ></img>
    <img className='arcs' id="arc_sw" src="../_images/arc_sw.svg" onClick={this.clickHandler.bind(this, '268')} ></img>
  </div>

绑定参数:

{{1}}

您可以阅读有关bind at the MDN documentation的更多信息。

答案 1 :(得分:0)

这是将值存储为data-*属性的用例之一。

<img className='arcs' id="arc_arc" src="../_images/arc_arc.svg" data-value="1" onClick={this.clickHandler.bind(this)} ></img>
<img className='arcs' id="arc_news" src="../_images/arc_news.svg" data-value="280" onClick={this.clickHandler.bind(this)} ></img>
<img className='arcs' id="arc_sw" src="../_images/arc_sw.svg" data-value="268" onClick={this.clickHandler.bind(this)} ></img>

clickHandler (e) {
    this.props.dispatch({type: 'updateMenuFave', current: e.target.getAttribute('data-value') });
  }

答案 2 :(得分:0)

最好的方法是将这些提取到子组件中。它有点冗长,但它可以使事情变得更清晰,并且可以防止不必要的重新渲染。

class ArcImg extends Component {
  handleClick = () => {
    this.props.onImageClick(this.props.current);
  }

  render() {
    const {
      onImageClick,
      ...otherProps
    } = this.props;

    return (
      <img
        className="arcs"
        onClick={this.handleClick}
        {...otherProps}
      />
    )
  }
}
// you should bind this.clickHandler in the constructor or use property initializer
<div id="arc_hold">
  <ArcImg
    id="arc_arc"
    src="../_images/arc_arc.svg"
    onImageClick={this.clickHandler}
  />
  <ArcImg
    id="arc_news"
    src="../_images/arc_news.svg"
    onImageClick={this.clickHandler}
  />
  <ArcImg
    id="arc_sw"
    src="../_images/arc_sw.svg"
    onImageClick={this.clickHandler}
  />
</div>

答案 3 :(得分:0)

重用处理程序:

  clickHandler(current) {
   this.props.dispatch({type: 'updateMenuFave', current: current });
  }

JSX:

  <div id = 'arc_hold'>
   <img className='arcs' id="arc_arc" src="../_images/arc_arc.svg" 
    onClick={() => this.clickHandler('1')} ></img>
   <img className='arcs' id="arc_news" src="../_images/arc_news.svg" 
    onClick={() => this.clickHandler('280')} ></img>
   <img className='arcs' id="arc_sw" src="../_images/arc_sw.svg" 
    onClick={() => this.clickHandler('268')} ></img>
  </div>