ในจาวาสคริปต์เก่าธรรมดาฉันมี DIV
<div class="movie" id="my_movie">
และรหัสจาวาสคริปต์ต่อไปนี้
var myMovie = document.getElementById('my_movie');
myMovie.addEventListener('nv-enter', function (event) {
console.log('change scope');
});
ตอนนี้ฉันมี React Component อยู่ในส่วนประกอบนี้ในวิธีการเรนเดอร์ฉันกำลังส่งคืน div ของฉัน ฉันจะเพิ่มตัวฟังเหตุการณ์สำหรับเหตุการณ์ที่กำหนดเองได้อย่างไร (ฉันใช้ไลบรารีนี้สำหรับแอพทีวี - การนำทาง )
import React, { Component } from 'react';
class MovieItem extends Component {
render() {
if(this.props.index === 0) {
return (
<div aria-nv-el aria-nv-el-current className="menu_item nv-default">
<div className="indicator selected"></div>
<div className="category">
<span className="title">{this.props.movieItem.caption.toUpperCase()}</span>
</div>
</div>
);
}
else {
return (
<div aria-nv-el className="menu_item nv-default">
<div className="indicator selected"></div>
<div className="category">
<span className="title">{this.props.movieItem.caption.toUpperCase()}</span>
</div>
</div>
);
}
}
}
export default MovieItem;
อัปเดต # 1:
ฉันใช้แนวคิดทั้งหมดที่ให้ไว้ในคำตอบ ฉันตั้งค่าไลบรารีการนำทางเป็นโหมดดีบักและฉันสามารถนำทางรายการเมนูของฉันได้โดยใช้แป้นพิมพ์เท่านั้น (ดังที่คุณเห็นในภาพหน้าจอฉันสามารถไปที่ภาพยนตร์ 4 ได้) แต่เมื่อฉันโฟกัสรายการในเมนูหรือ กด Enter ฉันไม่เห็นอะไรในคอนโซล
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
class MenuItem extends Component {
constructor(props) {
super(props);
// Pre-bind your event handler, or define it as a fat arrow in ES7/TS
this.handleNVFocus = this.handleNVFocus.bind(this);
this.handleNVEnter = this.handleNVEnter.bind(this);
this.handleNVRight = this.handleNVRight.bind(this);
}
handleNVFocus = event => {
console.log('Focused: ' + this.props.menuItem.caption.toUpperCase());
}
handleNVEnter = event => {
console.log('Enter: ' + this.props.menuItem.caption.toUpperCase());
}
handleNVRight = event => {
console.log('Right: ' + this.props.menuItem.caption.toUpperCase());
}
componentDidMount() {
ReactDOM.findDOMNode(this).addEventListener('nv-focus', this.handleNVFocus);
ReactDOM.findDOMNode(this).addEventListener('nv-enter', this.handleNVEnter);
ReactDOM.findDOMNode(this).addEventListener('nv-right', this.handleNVEnter);
//this.refs.nv.addEventListener('nv-focus', this.handleNVFocus);
//this.refs.nv.addEventListener('nv-enter', this.handleNVEnter);
//this.refs.nv.addEventListener('nv-right', this.handleNVEnter);
}
componentWillUnmount() {
ReactDOM.findDOMNode(this).removeEventListener('nv-focus', this.handleNVFocus);
ReactDOM.findDOMNode(this).removeEventListener('nv-enter', this.handleNVEnter);
ReactDOM.findDOMNode(this).removeEventListener('nv-right', this.handleNVRight);
//this.refs.nv.removeEventListener('nv-focus', this.handleNVFocus);
//this.refs.nv.removeEventListener('nv-enter', this.handleNVEnter);
//this.refs.nv.removeEventListener('nv-right', this.handleNVEnter);
}
render() {
var attrs = this.props.index === 0 ? {"aria-nv-el-current": true} : {};
return (
<div ref="nv" aria-nv-el {...attrs} className="menu_item nv-default">
<div className="indicator selected"></div>
<div className="category">
<span className="title">{this.props.menuItem.caption.toUpperCase()}</span>
</div>
</div>
)
}
}
export default MenuItem;
ฉันแสดงความคิดเห็นไว้บางบรรทัดเพราะในทั้งสองกรณีฉันไม่สามารถบันทึกบรรทัดคอนโซลได้
อัปเดต # 2: ไลบรารีการนำทางนี้ทำงานได้ไม่ดีกับ React กับแท็ก Html ดั้งเดิมดังนั้นฉันจึงต้องตั้งค่าตัวเลือกและเปลี่ยนชื่อแท็กให้ใช้ aria- * ดังนั้นจึงไม่ส่งผลกระทบต่อ React
navigation.setOption('prefix','aria-nv-el');
navigation.setOption('attrScope','aria-nv-scope');
navigation.setOption('attrScopeFOV','aria-nv-scope-fov');
navigation.setOption('attrScopeCurrent','aria-nv-scope-current');
navigation.setOption('attrElement','aria-nv-el');
navigation.setOption('attrElementFOV','aria-nv-el-fov');
navigation.setOption('attrElementCurrent','aria-nv-el-current');