【发布时间】:2015-06-10 22:44:58
【问题描述】:
我有以下组件:
由于我的按钮组件是通用的,它的事件也是通用的,我的无序列表也是如此;它是设置事件的下拉菜单。以下是两者的相关代码:
按钮组件:
render(){
return(
{/* whenClicked is a dropdown property /*}
<button onClick={this.props.whenClicked} type="button">
.....
</button>
)
无序列表组件:
constructor(props) {
super(props);
this.state = {
open:false
}
}
render(){
return(
{/* toggle between show and hide /*}
<ul className={"dropdown-menu " + (this.state.open ? 'show' : '')}>
{this.props.dropItems.map(function(item){
......
})}
</ul>
)
}
由于按钮组件是通用的,它的点击事件取决于下拉组件的whenClicked属性。
下拉组件:
'use strict';
var React = require('react'),
Button = require('./button'),
UnorderedList = require('./unordered-list');
class Dropdown extends React.Component{
constructor(props) {
super(props);
this.state = {
open:false
}
// added this as an update to my question per ssorallen
this.handleClick = this.handleClick.bind(this)
}
handleClick(){
this.setState({open : !this.state.open});
}
render(){
return(
<div className="dropdown">
{/* whenClicked is a property not an event, per se. */}
<Button whenClicked={this.handleClick} />
......
{/* // prop.items comes from app.jsx */}
<UnorderedList dropItems={this.props.items} />
</div>
)
} }
module.exports = Dropdown;
App.jsx:
....
var selectItems = {
title : "Choose a Fruit",
items : [
"Cantaloupe",
.........
]
}
<Dropdown items={selectItems.items} multiSelect={true} title={selectItems.title} />
....
这张照片发生了什么:
App.jsx 将水果项传递给 下拉组件。
下拉列表依次将这些项目传递到无序列表。
按钮组件连接到下拉列表的 whenClicked 属性。
-
unorderlist 组件的初始状态 open 根据其属性设置为 false:
className={"dropdown-menu " + (this.state.open ? 'show' : '')}
所有这些都有效。
我的问题:
单击按钮时,下拉菜单的 whenClicked 事件会触发并切换打开状态。
假设该事件会触发无序列表以在 true 和 false 之间切换其 打开状态,从而在其“下拉菜单”类中添加/删除 show。
当 state.open 改变时,有人可以为我解释一下如何让下拉组件与无序列表通信吗?
我得到的错误是:
未捕获的类型错误:无法读取未定义的属性“setState”
【问题讨论】:
-
如果他们解决了你的问题,你真的应该接受两个答案之一(我相信他们做到了)。就我个人而言,我认为 ssorallens 的回答最好地回答了您最初的问题。伙计们花时间回复,你欠他们那么多..!
标签: reactjs