我正在制作一个反应列表,其项目应触发更新状态的操作。 然而,触发和状态更新都会发生, onClick方法每次都使用相同的参数调用操作。这不应该发生。传递给操作的参数必须取决于单击列表的项目。
我无法找到导致此错误的错误。
这是我的下拉类,其中呈现列表。
class DropDownMenu extends React.Component {
constructor(props){
super(props)
}
render(){
let content = []
var categories = this.props.categories
for (var i=0; i < categories.length; i++) {
var catName = categories[i]
var line = (
<li
key ={i}
onClick = {() => {this.props.onClick(catName)}}
>
<p>{catName}</p>
</li>
)
content.push(line)
}
return (
<div>
<Dropdown ref="dropdown">
<DropdownTrigger>Categories</DropdownTrigger>
<DropdownContent>
<ul>
{ content }
</ul>
</DropdownContent>
</Dropdown>
</div>
)
}
}
这是管理状态并调用上述类
的容器
class MenuContainer extends React.Component {
constructor(props) {
super(props)
}
render(){
return (
<div>
<div>
<a onClick = {() => {this.props.changeView("main")}}>back</a>
<a onClick = {() => {this.props.changeView("shoppingCart ")}}>my cart</a>
</div>
<div>
<DropDownMenu
categories = {this.props.categories}
onClick = {(catName) => {this.props.selectCategory(catName)}}
/>
<ItemList
items = {this.props.items}
/>
</div>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
categories: getCategories(state),
items: getItems(state)
}
}
const mapDispathToProps = (dispatch) => {
return {
changeView: (view) => {
dispatch(setView(view))
},
selectCategory: (catName) => {
dispatch(setCategory(catName))
}
}
}
export default connect(mapStateToProps, mapDispathToProps)(MenuContainer)
I reducer the error to the line:
for (var i=0; i < categories.length; i++) {
var catName = categories[i]
var line = (
<li
key ={i}
onClick = {() => {this.props.onClick(catName)}}
>
<p>{catName}</p>
我用catName的控制台日志替换了this.props.onClick,它总是记录相同的内容,但是它正确地显示了
标记中的项目。
答案 0 :(得分:6)
您的for
循环不会形成closure
。更好地使用像这样的地图功能
let content = categories.map((catName, i) => {
return (
<li
key ={i}
onClick = {() => {this.props.onClick(catName)}}
>
<p>{catName}</p>
</li>
)
});