首先:一个简单的解决方案是为地图函数内的内容创建一个组件,并将值作为道具传递,当您从子组件调用该函数时,您可以将值传递给作为道具传递的函数。
家长
deleteTodo = (val) => {
console.log(val)
}
todos.map(el =>
<MyComponent val={el} onClick={this.deleteTodo}/>
)
我的组件
class MyComponent extends React.Component {
deleteTodo = () => {
this.props.onClick(this.props.val);
}
render() {
return <div onClick={this.deleteTodo}> {this.props.val} </div>
}
}
示例片段
class Parent extends React.Component {
_deleteTodo = (val) => {
console.log(val)
}
render() {
var todos = ['a', 'b', 'c'];
return (
<div>{todos.map(el =>
<MyComponent key={el} val={el} onClick={this._deleteTodo}/>
)}</div>
)
}
}
class MyComponent extends React.Component {
_deleteTodo = () => {
console.log('here'); this.props.onClick(this.props.val);
}
render() {
return <div onClick={this._deleteTodo}> {this.props.val} </div>
}
}
ReactDOM.render(<Parent/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
编辑:
第二:另一种方法是使用 memoize 并返回一个函数
constructor() {
super();
this._deleteTodoListener = _.memoize(
this._deleteTodo, (element) => {
return element.hashCode();
}
)
}
_deleteTodo = (element) => {
//delete handling here
}
并像使用它一样
todos.map(el => <div key={el} onClick={this._deleteTodoListener(el)}> {el} </div>)
PS 然而,这不是一个最佳解决方案,仍然会导致创建多个函数,但仍然比最初的情况有所改进。
第三:然而,一个更合适的解决方案是添加一个attribute
到最顶层的 div 并从event
like
_deleteTodo = (e) => {
console.log(e.currentTarget.getAttribute('data-value'));
}
todos.map(el => <div key={el} data-value={el} onClick={this._deleteTodo}> {el} </div>)
但是,在这种情况下,属性使用 toString 方法转换为字符串,因此对象将被转换为[Object Object]
和数组,["1" , "2", "3"]
如下所示"1, 2, 3"