ReactJS에서 자식 구성 요소에서 부모로 데이터를 전달하는 방법은 무엇입니까?


211

다음과 같이 자식 구성 요소에서 부모 구성 요소로 데이터를 보내려고합니다.

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

누구든지 문제를 찾도록 도와 줄 수 있습니까?

추신 : 하위 구성 요소가 json 파일에서 드롭 다운을 작성 중이며 json 배열의 두 요소를 서로 옆에 표시하려면 드롭 다운 목록이 필요합니다 (예 : "aaa, english"를 첫 번째 선택으로!)

{  
   "languages":[  
      [  
         "aaa",
         "english"
      ],
      [  
         "aab",
         "swedish"
      ],
}

3
<SelectLanguage onSelectLanguage={this.handleLanguage*Code*}/> 오타.
Yury Tarabanko

@YuryTarabanko 감사하지만 여전히 같은 오류가 발생합니다
Birish

@DavinTryon 어떻게 추가해야합니까? 나는 이렇게 시도했다 : handleLanguageCode: function(langValue) { this.setState({ language: langValue }).bind(this); },그러나 그것은 오류를 반환합니다 :ncaught TypeError: Cannot read property 'bind' of undefined
Birish

2
@DavinTryon은 createClass비 반응 방법을 자동 바인딩 합니다.
Yury Tarabanko

@OP 문제를 보여주는 바이올린을 만들 수 있습니까?
Yury Tarabanko

답변:


259

이 작동합니다. 소품을 다시 보내는 동안 객체로 보내거나 값으로 보내거나 부모 구성 요소에서 객체로 사용하십시오. 두 번째로 이름 값 쌍과 사용 valueFieldtextField속성 을 포함하도록 json 객체를 형식화해야합니다.DropdownList

짧은 답변

부모의:

<div className="col-sm-9">
     <SelectLanguage onSelectLanguage={this.handleLanguage} /> 
</div>

아이:

handleLangChange = () => {
    var lang = this.dropdown.value;
    this.props.onSelectLanguage(lang);            
}

상세한:

편집하다:

React.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" 
    }, 
  ] 
}

감사합니다 Shubham, 귀하의 답변으로 문제가 해결되었지만 드롭 다운 목록에 선택한 항목이 표시되지 않습니다. 그 후에는 비어있다 : /
Birish

@Sarah dropDownList를 작성하는 동안 해당 값을 this.state.selectedLanguage로 지정했으며 값이 초기화되지 않았습니다. 문제가 될 수 있습니다. 사용중인 DropdownList 구성 요소 내가 아는 경우 문제를 해결하기 위해 노력할 수 있습니다.
Shubham Khatri

네 말이 맞아 는 this.state.selectedLanguage항상 null 인 것 같습니다 : / / DropdownList fromreact-widgets
Birish

@Sarah 나는 초기 상태 값을 설정하는 onChange 함수와 anChange에 값을 바인딩하는 것을 포함하여 코드를 약간 변경했습니다. 당신을 위해 작동하는 경우에 저를이 시도하고 알
하기 Shubham 카트리에게

오류를 반환합니다 : Uncaught ReferenceError: value is not defined. 나는이 변경 : onChange={this.handleLangChange.bind(this, this.value)}오류가 반환되지 않지만 여전히 선택한 값을 표시하지 않습니다 :(
Birish

108

자식 구성 요소에서 부모 구성 요소로 데이터를 전달하려면

부모 구성 요소에서 :

getData(val){
    // do not forget to bind getData in constructor
    console.log(val);
}
render(){
 return(<Child sendData={this.getData}/>);
}

하위 구성 요소에서 :

demoMethod(){
   this.props.sendData(value);
 }

15
this.getData = this.getData.bind(this);getData에서 상태를 조작하려는 경우 this.setState는 함수가 아니므로 생성자를 잊지 마십시오 .
Miro J.

12

필요할 때 부모의 자식 구성 요소에서 데이터를 얻는 방법을 찾았습니다.

부모의:

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;
  }
}

이 예제는 하위 컴포넌트에서 상위로 함수를 전달하고이 함수를 사용하여 하위에서 데이터를 가져 오는 방법을 보여줍니다.


10

요즘 React 함수 구성 요소후크 사용 이 점점 더 대중화 되고 있음을 고려 하여 자식에서 부모 구성 요소로 데이터를 전달하는 방법에 대한 간단한 예를 제공합니다.

Parent Function Component에는 다음이 있습니다.

import React, { useState, useEffect } from "react";

그때

const [childData, setChildData] = useState("");

setChildData (클래스 컴포넌트의 this.setState와 비슷한 작업을 수행함)를 Child에 전달

return( <ChildComponent passChildData={setChildData} /> )

Child Component에서 먼저 수신 소품을 얻습니다.

function ChildComponent(props){ return (...) }

그런 다음 핸들러 함수를 사용하는 것처럼 데이터를 전달할 수 있습니다

const functionHandler = (data) => {

props.passChildData(data);

}

3

React.createClass 메소드는 React의 새로운 버전에서 더 이상 사용되지 않습니다. 상태를 유지하기 위해 하나의 기능적 구성 요소와 다른 클래스 구성 요소를 만드는 방법은 매우 간단합니다.

부모의:

const ParentComp = () => {
  
  getLanguage = (language) => {
    console.log('Language in Parent Component: ', language);
  }
  
  <ChildComp onGetLanguage={getLanguage}
};

아이:

class ChildComp extends React.Component {
    state = {
      selectedLanguage: ''
    }
    
    handleLangChange = e => {
        const language = e.target.value;
        thi.setState({
          selectedLanguage = language;
        });
        this.props.onGetLanguage({language}); 
    }

    render() {
        const json = require("json!../languages.json");
        const jsonArray = json.languages;
        const selectedLanguage = this.state;
        return (
            <div >
                <DropdownList ref='dropdown'
                    data={jsonArray} 
                    value={tselectedLanguage}
                    caseSensitive={false} 
                    minLength={3}
                    filter='contains'
                    onChange={this.handleLangChange} />
            </div>            
        );
    }
};


3
참고 사항 ... 나중에이 답변을 증명하기 위해 "새 버전"대신 특정 버전의 React를 참조해야합니다.
steve-o

3

아래와 같이 자식 구성 요소에서 부모 구성 요소로

부모 구성 요소

class Parent extends React.Component {
   state = { message: "parent message" }
   callbackFunction = (childData) => {
       this.setState({message: childData})
   },
   render() {
        return (
            <div>
                 <Child parentCallback = {this.callbackFunction}/>
                 <p> {this.state.message} </p>
            </div>
        );
   }
}

자식 구성 요소

class Child extends React.Component{
    sendBackData = () => {
         this.props.parentCallback("child message");
    },
    render() { 
       <button onClick={sendBackData}>click me to send back</button>
    }
};

나는이 일을 희망한다


2

React v16.8+기능 구성 요소, 사용할 수있는 useState()그런 다음, 부모의 상태를 업데이트 한 후 하위 구성 요소 내에서 상위 상태 기능을 실행할 수하는 소품 속성으로 아이에게 전달할 수있는 기능 상태를 만들려면 다음은 작업 조각이다 :

const { useState , useEffect } = React;

function Timer({ setParentCounter }) {
  const [counter, setCounter] = React.useState(0);

  useEffect(() => {
    let countersystem;
    countersystem = setTimeout(() => setCounter(counter + 1), 1000);

    return () => {
      clearTimeout(countersystem);
    };
  }, [counter]);

  return (
    <div className="App">
      <button
        onClick={() => {
          setParentCounter(counter);
        }}
      >
        Set parent counter value
      </button>
      <hr />
      <div>Child Counter: {counter}</div>
    </div>
  );
}

function App() {
  const [parentCounter, setParentCounter] = useState(0);

  return (
    <div className="App">
      Parent Counter: {parentCounter}
      <hr />
      <Timer setParentCounter={setParentCounter} />
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById('react-root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react-root"></div>


1

부모가 상태를 직접 업데이트하는 기능을 피할 수도 있습니다.

부모 구성 요소에서 :

render(){
 return(<Child sendData={ v => this.setState({item: v}) } />);
}

하위 구성 요소에서 :

demoMethod(){
   this.props.sendData(value);
}

0

아이디어는 데이터를 돌려주기 위해 호출되는 자식에게 콜백을 보내는 것입니다.

함수를 사용하는 완전하고 최소한의 예 :

앱은 임의의 숫자를 계산하여 부모에게 직접 전송하는 Child를 생성 console.log하여 결과를 얻습니다.

const Child = ({ handleRandom }) => {
  handleRandom(Math.random())

  return <span>child</span>
}
const App = () => <Child handleRandom={(num) => console.log(num)}/>

0

부모 구성 요소 : -TimeModal

  handleTimeValue = (timeValue) => {
      this.setState({pouringDiff: timeValue});
  }

  <TimeSelection 
        prePourPreHours={prePourPreHours}
        setPourTime={this.setPourTime}
        isPrePour={isPrePour}
        isResident={isResident}
        isMilitaryFormatTime={isMilitaryFormatTime}
        communityDateTime={moment(communityDT).format("MM/DD/YYYY hh:mm A")}
        onSelectPouringTimeDiff={this.handleTimeValue}
     />

참고 :-onSelectPouringTimeDiff = {this.handleTimeValue}

필요한 경우 하위 컴포넌트 호출 소품에서

 componentDidMount():void{
      // Todo use this as per your scenrio
       this.props.onSelectPouringTimeDiff(pouringDiff);  
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.