【问题标题】:Not all touch-events are fired in array.map react并非所有的触摸事件都在 array.map react 中触发
【发布时间】:2019-04-02 21:12:44
【问题描述】:

我想在 array.map 函数中添加事件监听器 onTouchStart、Move 和 End 到 img 标记,因此它只捕获一个事件监听器(onTouchStart),但如果我将此监听器设置为 div 且 class="header- added-heroes”所有 3 个侦听器都工作,我阅读了有关将 'this' 绑定到 array.map 及其仅捕获 onTouchStart 的信息,我将不胜感激有关此问题的任何信息。

{this.props.addedHeroes.map( function(el) {
            return (<a name={el.link} key={uniqueId()} className="heroes__link">
              <div className="hero"> {console.log(' map this : ', this === that)}
                {
                  <img className="hero__image"
                    onTouchStart={this.onTouchStart}
                    onTouchMove={this.handleMove}
                    onTouchEnd={this.onTouchEnd}
                    src={el.image}
                  />
                }
              </div>
            </a>);
          }, this )} 

完整代码:

import React from "react";
import uniqueId from "lodash/uniqueId";
import HeroCounter from "../../images/HeroCounter.svg";

class HeaderAddedHeroes extends React.Component {
  state = {
    heroes: [1, 2, 3, 4],
    showCloseButton: 0
  };
  constructor(props) {
    super(props);

    this.onTouchStart = this.onTouchStart.bind(this);
    this.onTouchEnd = this.onTouchEnd.bind(this);
    this.handleMove = this.handleMove.bind(this);
  }

  handleMove() {
    console.log('moved');
    this.setState({ showCloseButton: 1 })
  }
  onTouchStart() {
    console.log('started');
    this.setState({ showCloseButton: 2 })
  }
  onTouchEnd() {
    console.log('ended');
    this.setState({ showCloseButton: 3 })
  }

  render() { var that = this;
    return (
      <header className="header-added-heroes"> { console.log(' this : ', that)}
        <div className="header-added-heroes" 
             onTouchMove={this.handleMove} 
             onTouchStart={ this.onTouchStart } 
             onTouchEnd={this.onTouchEnd}>
                  { this.state.showCloseButton }
        </div>
        <div className="heroes">
          {this.props.addedHeroes.map( function(el) {
            return (<a name={el.link} key={uniqueId()} className="heroes__link">
              <div className="hero"> {console.log(' map this : ', this === that)}
                {
                  <img className="hero__image"
                    onTouchStart={this.onTouchStart}
                    onTouchMove={this.handleMove}
                    onTouchEnd={this.onTouchEnd}
                    src={el.image}
                  />
                }
              </div>
            </a>);
          }, this )} 
      </header>
    );
  }
}

【问题讨论】:

  • 所以问题是onTouchMoveonTouchEnd 没有被解雇?为什么你需要 console.log 内部渲染?请删除它,并为地图this.props.addedHeroes.map((el) =&gt;{制作箭头功能@
  • 是的,onTouchMove和onTouchEnd都没有触发,忘了说最初是用箭头函数启动的,而且也只捕获了onTouchStart

标签: reactjs touch touch-event


【解决方案1】:

你总是可以使用箭头功能。

解决方案是:删除“uniqueId()”

{this.props.addedHeroes.map((el, i) => {
            return (<a name={el.link} key={i} className="heroes__link">
              <div className="hero">
                  <img className="hero__image"
                    onTouchStart={this.onTouchStart}
                    onTouchMove={this.handleMove}
                    onTouchEnd={this.onTouchEnd}
                    src={el.image}
                  />
              </div>
            </a>);
          }
)}

【讨论】:

  • 我删除了 key={uniqueId()} 现在它可以工作了,嗯?,可能是因为在 TouchStart 之后它的重新渲染和更改密钥,谢谢大家
  • 太棒了!也许是因为每次都会生成新的 id。我更新了解决方案供其他人查看。
  • 好,但是要小心使用索引作为键,如果元素的顺序可能会改变,会影响性能,link现在澄清一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多