折腾:
【已解决】Reactjs中尝试使用touch事件实现长按效果
期间,参考:
React.js学习笔记之事件系统 – 早点儿睡 – SegmentFault
去试试onMouseDown,用代码:
| export default class EstrusManagement extends Component {   constructor(props) {     super(props);     autoBind(this);     this.onItemMouseDown = this.onItemMouseDown.bind(this);     this.onItemMouseUp = this.onItemMouseUp.bind(this);   }   onItemMouseDown(){     console.log("onItemMouseDown");   }   onItemMouseUp(){     console.log("onItemMouseUp");   } } function EstrusPendingItem({ data, active, show, hide }) {   return (       <div class={style.item} onMouseDown={this.onItemMouseDown} onMouseUp={this.onItemMouseUp}> } | 
结果onMouseDown没有被调用

reactjs onMouseDown not called
javascript – React Chartist component onTouchMove Events not firing – Stack Overflow
OnMouseDown not firing? – Unity Answers
reactjs onMouseDown
reactjs – How to listen for click events that are outside of a component – Stack Overflow
react jsx – ReactJS: onClick handler not firing when placed on a child component – Stack Overflow
javascript – Reactjs, Rxjs and mouse events – Stack Overflow
React.js终探(五) – GalenYip – 博客园
“touch event
碰觸事件,預設為關閉的。
要打開的話就要宣告
React.initializeTouchEvents(true)”
React js initializeTouchEvents
“React.initializeTouchEvents is no longer necessary and has been removed completely. Touch events now work automatically.”
这里是preact 8.1.0 应该是属于最新的react,所以:已经废弃initializeTouchEvents,无需使用。
javascript – Touch Events Broken with ReactJS Upgrade in Chrome Mobile Emulator – Stack Overflow
“If you just want to capture a tap event use onClick. The events onTouchStart, onTouchEnd ect. are drag and drop events. For swipes you will need a third party library like react-hammerjs.”
说是:onTouchStart, onTouchEnd都属于 拖放之类的事件
zilverline/react-tap-event-plugin: Instant TapEvents for React
然后后来,把上面的几个事件加到,其父级元素中:
|   renderPending() { 。。。     return (      。。。         <ul class={style.nn_a_list}           onMouseDown={this.onItemMouseDown}           onMouseUp={this.onItemMouseUp}           onTouchStart={this.onItemTouchStart}           onTouchEnd={this.onItemTouchEnd}         >           {             pendingList.map(item => {               const fn = () => this.setActiveItem(item);               return (                 <EstrusPendingItem                   data={item}                   active={activeItem === item}                   show={fn}                   hide={this.hideActiveItem}                 /> | 
然后就可以看到具体的事件了:
但是会出错:
| index.js?7c1b:62 Uncaught TypeError: Cannot read property ‘bind’ of undefined     at new EstrusManagement (eval at 376 (0.093ff47….hot-update.js:7), <anonymous>:96:52)     at createComponent (eval at <anonymous> (bundle.js:759), <anonymous>:212:20)     at renderComponent (eval at <anonymous> (bundle.js:759), <anonymous>:271:55)     at setComponentProps (eval at <anonymous> (bundle.js:759), <anonymous>:244:103)     at renderComponent (eval at <anonymous> (bundle.js:759), <anonymous>:269:100)     at rerender (eval at <anonymous> (bundle.js:759), <anonymous>:38:43) | 
然后给对应的函数加上event参数:
|   onItemMouseDown(e){     console.log("onItemMouseDown");     console.log(e);   }   onItemMouseUp(e){     console.log("onItemMouseUp");     console.log(e);   }   onItemTouchStart(e){     console.log("onItemTouchStart");     console.log(e);   }   onItemTouchEnd(e){     console.log("onItemTouchEnd");     console.log(e);   } | 
即可正常工作,看到对应的事件了:

-》
所以,此处的错误主要是:
此处给html中的div元素,添加:
|       <div class={style.item}         onMouseDown={this.onItemMouseDown}         onMouseUp={this.onItemMouseUp}         onTouchStart={this.onItemTouchStart}         onTouchEnd={this.onItemTouchEnd}       > | 
时,之所以没有生效,是因为:
此处的this,是在Component之外的一个函数中的:
| export default class EstrusManagement extends Component { …   renderPending() { …     return ( …         <ul class={style.nn_a_list}>           {             pendingList.map(item => {               const fn = () => this.setActiveItem(item);               return (                 <EstrusPendingItem                   data={item}                   active={activeItem === item}                   show={fn}                   hide={this.hideActiveItem}                 />   } } function EstrusPendingItem({ data, active, show, hide }) { …   return (       <div class={style.item}         onMouseDown={this.onItemMouseDown}         onMouseUp={this.onItemMouseUp}         onTouchStart={this.onItemTouchStart}         onTouchEnd={this.onItemTouchEnd}       > } | 
解决办法就是:
确保上面的this传递进去到Component之外的函数里了,然后对应的函数才可以生效:
然后用代码:
| export default class EstrusManagement extends Component {   onItemMouseDown(e){     console.log("onItemMouseDown");     console.log(e);   }   onItemMouseUp(e){     console.log("onItemMouseUp");     console.log(e);   }   onItemTouchStart(e){     console.log("onItemTouchStart");     console.log(e);   }   onItemTouchEnd(e){     console.log("onItemTouchEnd");     console.log(e);   }   renderPending() {     …     return (       …        …               return (                 <EstrusPendingItem                   data={item}                   active={activeItem === item}                   show={fn}                   hide={this.hideActiveItem}                   thisObj={this}                 />               );             })           }         </ul>       </div>     );   } } function EstrusPendingItem({ data, active, show, hide, thisObj }) {   console.log("EstrusPendingItem");   console.log(thisObj);   console.log(this);   return (       <div class={style.item}         onMouseDown={thisObj.onItemMouseDown}         onMouseUp={thisObj.onItemMouseUp}         onTouchStart={thisObj.onItemTouchStart}         onTouchEnd={thisObj.onItemTouchEnd}       >       </div>   ); } | 
即可生效:

对应的log输出是:

传入的thisObj是个EstrusPendingItem

本身对象之外的函数中的this是Component:

转载请注明:在路上 » 【已解决】ReactJS中onMouseDown不起效果没有被调用