Javascript 将参数传递给react中的函数,而不使用onClick处理程序中的arrow函数
我正在映射一组像这样的对象Javascript 将参数传递给react中的函数,而不使用onClick处理程序中的arrow函数,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我正在映射一组像这样的对象 events = [ { id: 1, name: 'Real vs Barcelona' }, { id: 2, name: 'Celtic vs Rangers' } ]; 然后我想将id传递给更新相关事件的函数。这项工作,我是用一个箭头函数来实现的 onClick={()=>this.props.updateEvent(event.id)} }由于事件传递您单击的相关DOM元素,因此您可以读取该元
events = [
{
id: 1,
name: 'Real vs Barcelona'
},
{
id: 2,
name: 'Celtic vs Rangers'
}
];
然后我想将id传递给更新相关事件的函数。这项工作,我是用一个箭头函数来实现的
onClick={()=>this.props.updateEvent(event.id)}
}由于事件传递您单击的相关DOM元素,因此您可以读取该元素具有的任何属性。因此,你可以做一些类似于你在文章末尾建议的事情: MyApp类扩展了React.Component{ render(){ 让updateEvent=(e)=>{ log(e.target.dataset.name); } 返回( {[{id:0,名称:“foo”},{id:1,名称:“bar”}].map(事件=>{ return
{event.name}
})} ); } } ReactDOM.render(,document.getElementById(“app”)代码>由于事件传递您单击的相关DOM元素,因此您可以读取该元素具有的任何属性。因此,你可以做一些类似于你在文章末尾建议的事情: MyApp类扩展了React.Component{ render(){ 让updateEvent=(e)=>{ log(e.target.dataset.name); } 返回( {[{id:0,名称:“foo”},{id:1,名称:“bar”}].map(事件=>{ return
{event.name}
})} ); } } ReactDOM.render(,document.getElementById(“app”)代码>如果要传递的值是可序列化的,则可以将其指定为属性,如Chris在回答中所述 更通用的解决方案是创建新组件并将数据作为道具传递:
class Event extends React.Component {
_onClick = () => this.props.onClick(this.props.event.id);
render() {
return (
<p onClick={this._onClick}>{ this.props.event.name }</p>
);
}
}
类事件扩展React.Component{
_onClick=()=>this.props.onClick(this.props.event.id);
render(){
返回(
{this.props.event.name}
);
}
}
在呼叫者中:
<div>
{this.props.events.map(event => {
return <Event key={event.id} event={event} onClick={this.props.updateEvent} />
});
</div>
{this.props.events.map(event=>{
返回
});
如果要传递的值是可序列化的,则可以将其指定为属性,如Chris在回答中所述
更通用的解决方案是创建新组件并将数据作为道具传递:
class Event extends React.Component {
_onClick = () => this.props.onClick(this.props.event.id);
render() {
return (
<p onClick={this._onClick}>{ this.props.event.name }</p>
);
}
}
类事件扩展React.Component{
_onClick=()=>this.props.onClick(this.props.event.id);
render(){
返回(
{this.props.event.name}
);
}
}
在呼叫者中:
<div>
{this.props.events.map(event => {
return <Event key={event.id} event={event} onClick={this.props.updateEvent} />
});
</div>
{this.props.events.map(event=>{
返回
});
我确实找到了我想找的东西
render() {
return (
<div>
{this.props.events.map(event => {
let updateEventHelper = () => {
this.props.updateEvent(event.id);
};
return <p key={event.id} onClick={updateEventHelper}>{ event.name }</p>
});
</div>
)
}
render(){
返回(
{this.props.events.map(event=>{
让updateEventHelper=()=>{
this.props.updateEvent(event.id);
};
return{event.name}
});
)
}
我确实找到了我想找的东西
render() {
return (
<div>
{this.props.events.map(event => {
let updateEventHelper = () => {
this.props.updateEvent(event.id);
};
return <p key={event.id} onClick={updateEventHelper}>{ event.name }</p>
});
</div>
)
}
render(){
返回(
{this.props.events.map(event=>{
让updateEventHelper=()=>{
this.props.updateEvent(event.id);
};
return{event.name}
});
)
}
如果不想使用arrow函数,可以执行onClick={function(){this.props.updateEvent(event.id)}
这只在性能问题时才重要。它将在每个渲染中为每个项目创建一个新函数。您可以在ComponentWillReceiveProps上创建函数映射并将其存储在组件上,然后在循环中说this.eventFuncs[event.id]
但我从未将其视为性能问题..如果不想使用arrow函数,可以执行onClick={function(){this.props.updateEvent(event.id)}
这只在性能问题时才重要。它将在每个渲染中为每个项目创建一个新函数。您可以在ComponentWillReceiveProps上创建函数映射并将其存储在组件上,然后在循环中说this.eventFuncs[event.id]
但我从未将其视为性能问题..我认为e.target.name
不起作用。
元素没有这样的属性。您可能希望使用数据-*
属性。请不要使用这种方法。它会满足您的要求,但您很难扩展“事件”对象,因为您还需要更新DOM。@尝试改进,“扩展事件”是什么意思?@Chris谢谢你的回答。我可以接受你或Felix的答案,但我想的是我下面的答案。你能评论一下这个答案中的方法,以及它是否比其他答案更好/相同/更差solutions@Chris我正在考虑向对象添加新的值/属性。然后它还需要更新DOM。我不这么认为认为e.target.name
会起作用。
元素没有这样的属性。您可能想使用数据-*
属性。请不要使用这种方法。它会满足您的要求,但您很难扩展“事件”对象,因为您还需要更新DOM。@尝试改进,“扩展事件”是什么意思?@Chris谢谢你的回答。我可以接受你或Felix的答案,但我想的是我下面的答案。你能评论一下这个答案中的方法,以及它是否比其他答案更好/相同/更差solutions@Chris我正在考虑向对象添加新的值/属性。然后它还需要更新DOM。啊,你呢击败我吧。我想在我的帖子中添加这个选项;)我不久前做了一个类似上面的例子:@FelixKling谢谢你的回答。我可以接受你的或Chris的答案,但我是什么