![](/img/trans.png)
[英]How to pass arguments to callback in React + Typescript without new function creation?
[英]React: how to pass arguments to the callback
我有一個反應組件內的元素列表,我希望它們是可點擊的。 點擊后,我調用一些外部函數在參數中傳遞項目ID:
render () {
return (
<ul>
{this.props.items.map(item => (
<li key={item.id} onClick={() => {doSomething(item.id)}></li>
))}
</ul>
)
}
此代碼有效,但它有一個很大的性能缺點:每次調用render
時都會創建許多新的匿名函數。
如何在仍然能夠提供item.id
同時將doSomething
函數作為參考item.id
給它?
您可以使用數據屬性 ,在使用相同功能時在每個項目上設置正確的ID:
function doSomethingFromEvent(event){
return doSomething(event.target.dataset.id);
}
render () {
return (
<ul>
{this.props.items.map(item => (
<li key={item.id} data-id={item.id} onClick={doSomethingFromEvent}></li>
))}
</ul>
)
}
在元素中設置data-*
屬性時,您可以使用散列的形式將dataset
取回。 例如,在doSomethingFromEvent
我有event.target.dataset = {id: *id*}
。 在MDN上查看更多信息
使用<li key={item.id} data-myattriute={myvalue} onClick={this.handleClick}></li>
更新哈希(例如狀態)時更加清晰,我可以簡單地定義handleClick
如:
handleClick(event){
// Here event.target.dataset = {myattribute: myvalue}
Object.assign(myObject, event.target.dataset);
// or
this.setState(event.target.dataset);
}
回到你的問題,這種方法的好處在於,如果你確保你的容器元素(ul)不能在數據屬性(li)的子項外部點擊,這是你的情況,你可以在其上聲明函數:
render () {
return (
<ul onClick={doSomethingFromEvent}>
{this.props.items.map(item => (
<li key={item.id} data-id={item.id}></li>
))}
</ul>
)
}
現在您的功能只創建一次,甚至不會在每個項目中重復。
您可以為數組中的每個項創建一個新組件並使用props, 如下所示 :
class Li extends React.Component {
render() {
return <li onClick={this.onClick}> {this.props.children} </li>;
}
onClick = () => {
console.log(this.props.item);
};
}
class App extends React.Component {
state = {
items: [
{id: 1, name: 'one'},
{id: 2, name: 'two'},
{id: 3, name: 'three'},
]
};
render() {
return <ul>
{this.state.items.map(i =>
<Li key={i.id} item={i}>{i.name}</Li>
)}
</ul>;
}
}
你可以做的是創建一個部分應用或更高階的函數來封閉item.id
並傳遞它。 那么讓我們來看看這個玩具的例子:
class App {
partiallyApplied = id => e => {
console.log(id,'this is passed in first')
console.log(e,'this is passed in second')
}
render(){
return (
<button onClick={this.partiallyApplied(1234)}>Click Me</button>
)
}
}
現在您可以訪問1234
以及您的event
對象
這是使用transform-class-properties
babel插件。 如果不使用或不能使用它,你可以做這樣的事情:
partiallyApplied(id){
return function(e){
console.log(id,'this is id')
console.log(e,'this is event')
}
}
但是你必須在通話期間綁定this
,我不喜歡到處都是這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.