Как передать данные от дочернего компонента к родительскому в ReactJS?
Я пытаюсь отправить данные из дочернего компонента к его родителю следующим образом:
const ParentComponent = React.createClass({
getInitialState() {
return {
language: '',
};
},
handleLanguageCode: function(langValue) {
this.setState({language: langValue});
},
render() {
return (
<div className="col-sm-9" >
<SelectLanguage onSelectLanguage={this.handleLanguage}/>
</div>
);
});
а вот и дочерний компонент:
export const SelectLanguage = React.createClass({
getInitialState: function(){
return{
selectedCode: '',
selectedLanguage: '',
};
},
handleLangChange: function (e) {
var lang = this.state.selectedLanguage;
var code = this.state.selectedCode;
this.props.onSelectLanguage({selectedLanguage: lang});
this.props.onSelectLanguage({selectedCode: code});
},
render() {
var json = require("json!../languages.json");
var jsonArray = json.languages;
return (
<div >
<DropdownList ref='dropdown'
data={jsonArray}
value={this.state.selectedLanguage}
caseSensitive={false}
minLength={3}
filter='contains'
onChange={this.handleLangChange} />
</div>
);
}
});
мне нужно получить выбранное значение Пользователем в Родительском компоненте. Я получаю эту ошибку:
Uncaught TypeError: this.props.onSelectLanguage is not a function
может ли кто-нибудь помочь мне найти проблему?
P.S. дочерний компонент создает выпадающий список из файла json, и мне нужен выпадающий список, чтобы показать оба элемента массива json рядом с друг друга(например:" ААА,английский " как первый выбор!)
{
"languages":[
[
"aaa",
"english"
],
[
"aab",
"swedish"
],
}
3 ответа:
это должно работать. При отправке prop обратно вы отправляете это как объект, а не отправляете это как значение или альтернативно используете его как объект в Родительском компоненте. Во-вторых, вам нужно отформатировать объект json, чтобы содержать пары значений имен и использовать
valueField
и наDropdownList
Короткий Ответ:
родители:
<div className="col-sm-9" > <SelectLanguage onSelectLanguage={this.handleLanguage}/> </div>
ребенок:
handleLangChange = () => { var lang = this.dropdown.value; this.props.onSelectLanguage(lang); }
характеристики:
EDIT:
Учитывая Реагировать.createClass устарел с v16. 0 и далее, лучше пойти дальше и создать компонент React, расширив
React.Component
. Передача данных от дочернего к родительскому компоненту с помощью этого синтаксиса будет выглядеть следующим образом какродитель
class ParentComponent extends React.Component{ state: { language: '' } handleLanguage = (langValue) => { this.setState({language: langValue}); } render() { return ( <div className="col-sm-9" > <SelectLanguage onSelectLanguage={this.handleLanguage}/> </div> ) } }
ребенок
var json = require("json!../languages.json"); var jsonArray = json.languages; export class SelectLanguage extends React.Component { state = { selectedCode: '', selectedLanguage: jsonArray[0], } handleLangChange = () => { var lang = this.dropdown.value; this.props.onSelectLanguage(lang); } render() { return ( <div > <DropdownList ref={(ref) => this.dropdown = ref} data={jsonArray} valueField='lang' textField='lang' caseSensitive={false} minLength={3} filter='contains' onChange={this.handleLangChange} /> </div> ); } }
используя
createClass
синтаксис, который ОП использовал в своем ответе родительconst ParentComponent = React.createClass({ getInitialState() { return { language: '', }; }, handleLanguage: function(langValue) { this.setState({language: langValue}); }, render() { return ( <div className="col-sm-9" > <SelectLanguage onSelectLanguage={this.handleLanguage}/> </div> ); });
ребенок
var json = require("json!../languages.json"); var jsonArray = json.languages; export const SelectLanguage = React.createClass({ getInitialState: function(){ return{ selectedCode: '', selectedLanguage: jsonArray[0], }; }, handleLangChange: function () { var lang = this.refs.dropdown.value; this.props.onSelectLanguage(lang); }, render() { return ( <div > <DropdownList ref='dropdown' data={jsonArray} valueField='lang' textField='lang' caseSensitive={false} minLength={3} filter='contains' onChange={this.handleLangChange} /> </div> ); } });
JSON:
{ "languages":[ { "code": "aaa", "lang": "english" }, { "code": "aab", "lang": "Swedish" }, ] }
для передачи данных от дочернего компонента к родительскому компоненту
В Родительском Компоненте:
getData(val){ // do not forget to bind getData in constructor console.log(val); } render(){ return(<Child sendData={this.getData}/>); }
В Дочернем Компоненте:
demoMethod(){ this.props.sendData(value); }
Я нашел подход, как получить данные из дочернего компонента в родителях, когда мне это нужно.
class ParentComponent extends Component{ onSubmit(data) { let mapPoint = this.getMapPoint(); } render(){ return ( <form onSubmit={this.onSubmit.bind(this)}> <ChildComponent getCurrentPoint={getMapPoint => {this.getMapPoint = getMapPoint}} /> <input type="submit" value="Submit" /> </form> ) } } class ChildComponent extends Component{ constructor(props){ super(props); if (props.getCurrentPoint){ props.getCurrentPoint(this.getMapPoint.bind(this)); } } getMapPoint(){ return this.Point; } }
в этом примере показано, как передать функцию от дочернего компонента к родительскому и использовать эту функцию для получения данных от дочернего компонента.