我创建了一个父类,它包含两个子组件,其中一个子组件试图将数据传回父组件状态 . 当我运行代码时,我没有得到任何运行时错误,但是将数据发送回父级的子级根本没有渲染(甚至最初) . 所有组件都是大写的,因此不是问题 . 我认为它与OnClick函数中的语法或我将道具传递回父级的方法有关 . 我是React的新手,所以任何帮助都将不胜感激!
Parent Class
class DropdownParent extends React.Component {
constructor(props) {
super(props);
this.state = {propsForClassDropdown: []};
this.getClasses = this.getClasses.bind(this);
}
getClasses(subjectTitle){
var chosenSubject = Subjects.subjectTitle;
this.setState({propsForClassDropdown: {chosenSubject}.classes})
}
render(){
return(
<div className = "DropdownContainer">
<SubjectDropdown triggerListChange = {this.getClasses} />
<ClassDropdown /> //this one renders properly
</div>
)
}
}
Child component that is not rendering
class SubjectDropdown extends React.Component {
constructor(props) {
super(props);
this.state = { searchTerm: "", searchStarted: false };
this.searchUpdated = this.searchUpdated.bind(this);
}
searchUpdated (term) {
this.setState({searchTerm: term, searchStarted: true})
}
render(){
console.log("rendering");
const filteredSubjects = Subjects.filter(createFilter(this.state.searchTerm, KEYS_TO_FILTERS))
return(
<div>
<div className = "SubjectDropdownContainer">
<SearchInput className='search-input' onChange={this.searchUpdated} />
<div className = 'SubjectDropdown'>
{filteredSubjects.map(Subjects => {
return (
<div>
<Button className = "dropdownItem" key={Subjects.id} onClick={()=>this.props.triggerListChange(key)}>
{Subjects.subject.name}
</Button>
</div>
)
})}
</div>
</div>
</div>
)
}
}
2 回答
在
onClick
处理程序中,将key
传递给triggerListChange,但key
未在任何位置定义 .假设
Subjects
在父组件和子组件的范围内,并且Subject
是一个对象,那应该有效 .在回调映射函数时:
filteredSubjects.map(Subjects => {
Subject
s参数的名称与全局Subjects对象发生冲突 . 尝试将其更改为:filteredSubjects.map(subject=> {
并将subject.id传递给triggerListChange
. 即;onClick={() => this.props.triggerListChange(subject.id)
在你的getClasses函数中:
将
var chosenSubject = Subjects.subjectTitle
更改为通过括号[]
表示法访问该属性:Subjects[subjectTitle]
因为主题对象中的id
可能是字符串 .原来我在父组件中的导出语句不正确 . 不知道为什么其中一个组件仍在渲染 .