Я создаю небольшое приложение с вкладками, в котором каждая вкладка отображает дочерний компонент.
Я хотел, чтобы на каждой вкладке отображалось различное содержимое, поэтому я создал объект contentTypes
за пределами render(){ .... }
для сопоставления каждой вкладки.к соответствующему дочернему компоненту.Дочерние компоненты получают обработчики и состояния через реквизиты.
class App extends Component {
state ={
contentType: "A",
title: "Overview",
searchContent: ""
}
tabHandler= (content,event)=>{
console.log("clicked");
this.setState({
title: event.target.name,
contentType: content
});
}
searchHandler = (event) => {
// this performs a search on a database and
//returns suggestions for the current input
this.setState({
searchContent: event.target.value
});
}
contentTypes = {
A: <A/>,
B: <B/>,
C: <C onchange={this.searchHandler.bind(this)} content={this.state.searchContent}/>
};
render() {
return (
<div className="row">
<ul>
<Tab click={this.tabHandler.bind(this)} id="A" name="A"/>
<Tab click={this.tabHandler.bind(this)} id="B" name="B"/>
<Tab click={this.tabHandler.bind(this)} id="C" name="C"/>
</ul>
<h1 id="title">{this.state.title}</h1>
{this.contentTypes[this.state.contentType]}
</div>
);
}
}
Дочерние компоненты не сохраняют состояния, определяются примерно так:
import React from 'react'
import Field from './form-builder/field';
const C = (props) => {
return(
// Field is another stateless component with formatted <input> tags
<Field type="text" name="search" content={props.content} onchange={props.onchange}/>
);
}
export default C;
Поле определяется следующим образом:
import React from 'react';
const field = (props) => {
<li className="field">
<input type="text" onChange={props.onchange} value={props.content} />
<label htmlFor={props.name}>{props.value}</label>
</li>
}
export default field;
Проблема в том, что когда я вызываю обработчик изнутри Field
для обновления состояния в родительском компоненте (тот, у которого render(){ .... }
), дочерние компоненты не обновляются с новым состоянием.
Есть идеи, как это исправить?