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
누가 문제 찾는 것 좀 도와줄래요?
추신: 자 컴포넌트가 json 파일에서 드롭다운을 만들고 있으며, json 배열의 두 요소를 나란히 표시하기 위한 드롭다운 목록이 필요합니다(예: "aaa, English!").
{
"languages":[
[
"aaa",
"english"
],
[
"aab",
"swedish"
],
}
이거면 될 거야.프로펠을 반송할 때 오브젝트로 송신하는 것이 아니라 값으로 송신하거나 부모 컴포넌트의 오브젝트로 사용하는 것입니다.으로 이름값 하고 ", "json"을 사용해야 .valueField
★★★★★★★★★★★★★★★★★」textField
「」의 어트리뷰트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.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
OP가 그의 답변에 사용한 구문 부모
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);
}
React Function Components와 Hooks 사용이 최근 인기를 끌고 있는 것을 고려하여 데이터를 자녀에서 부모 컴포넌트로 전달하는 간단한 예를 제시하겠습니다.
Parent Function Component에는 다음과 같은 기능이 있습니다.
import React, { useState } from "react";
그리고나서
const [childData, setChildData] = useState("");
setChildData(이러한 작업을 수행하는 경우)를 전달합니다.setState in Class Components)를 Child로 설정
return( <ChildComponent passChildData={setChildData} /> )
Child Component에서는 먼저 수신 소품을 입수합니다.
function ChildComponent(props){ return (...) }
핸들러 기능을 사용하는 것처럼 데이터를 전달할 수 있습니다.
const functionHandler = (data) => {
props.passChildData(data);
}
React v16.8+
함수 컴포넌트에서는 부모 상태를 갱신할 수 있는 함수 상태를 작성한 후 이를 소품 속성으로 자녀에게 전달합니다.자녀 컴포넌트 내에서 부모 상태 함수를 트리거할 수 있는 작업 스니펫은 다음과 같습니다.
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>
하려면 Parent Component를 사용합니다.useState
하다.setIsParentData
아이 컴포넌트
ChildComponent에서 프로펠을 통해 수신된 함수를 사용하여 데이터를 업데이트하여 ParentComponent로 다시 전송합니다.
특히 Parent Component의 코드가 너무 길어질 때 이 기술을 사용하기 때문에 Parent Component에서 자녀 컴포넌트를 만듭니다.일반적으로는 1레벨만 내려가며 useContext 또는 redux를 사용하면 컴포넌트 간에 상태를 공유하기 위해 과잉으로 보입니다.
ParentComponent.js
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';
export function ParentComponent(){
const [isParentData, setIsParentData] = useState(True);
return (
<p>is this a parent data?: {isParentData}</p>
<ChildComponent toChild={isParentData} sendToParent={setIsParentData} />
);
}
ChildComponent.js
import React from 'react';
export function ChildComponent(props){
return (
<button onClick={() => {props.sendToParent(False)}}>Update</button>
<p>The state of isParentData is {props.toChild}</p>
);
};
부모의 자녀 구성 요소에서 필요할 때 데이터를 얻는 방법을 찾았습니다.
부모:
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;
}
}
이 예에서는 함수를 하위 구성 요소에서 상위 구성 요소로 전달하고 이 함수를 사용하여 하위 구성 요소에서 데이터를 가져오는 방법을 보여 줍니다.
다음과 같이 하위 구성요소에서 상위 구성요소로
부모 성분
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>
}
};
잘 됐으면 좋겠다
최근 입력으로 이 작업을 수행할 수 있는 편리하고 쉬운 방법을 찾았습니다.
기본적으로 State를 사용하고 나서 onChange를 자녀에 대한 버팀목으로 설정하면 "값"을 인수로 하여 useState "setVal" 붐에 넣을 수 있습니다.상태 변경 자녀는 매번 > 부모입니다.
const Parent = () => {
const [val, setVal] = useState("initial value")
return(
<>
<Child onChange={(value)=> setVal(value)}/>
<div>{val}</div>
</>
)
};
export default Parent;
const Child = (props) => {
return(
<button onClick={() => props.onChange("your value here") }>
)
}
여기서 간단하게 설명하겠습니다.자체 컴포넌트에서 부모 컴포넌트 카운터를 갱신하고 있습니다.
상위 컴포넌트(PropsApp.jsx)
import React, { useState } from 'react'
import Child from './Child'
export default function PropsApp(){
const [counter, setCounter] = useState(0)
const updateMyCounter = () => {
setCounter(counter + 1)
}
return(
<>
<hr></hr>
<h1>This is Parent</h1>
<h2>{counter}</h2>
<Child updateParent={updateMyCounter} />
</>
)
}
하위 컴포넌트(Child.jsx)
export default function Child(props){
return(
<>
<hr></hr>
<h1>This is Child</h1>
<button
onClick={props.updateParent}
>
Update Parent Component
</button>
</>
)
}
상위 컴포넌트 업데이트를 클릭하면 매직이 표시됩니다.
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>
);
}
};
아이디어는 콜백을 아이에게 보내는 것입니다. 콜백은 데이터를 돌려주기 위해 호출됩니다.
함수를 사용한 완전하고 최소한의 예:
Child를 됩니다.console.log
const Child = ({ handleRandom }) => {
handleRandom(Math.random())
return <span>child</span>
}
const App = () => <Child handleRandom={(num) => console.log(num)}/>
React에서 하위 구성 요소에서 상위 구성 요소로 데이터를 전달하려면:
- 값을 받는 부모로부터 자식에게 함수를 전달합니다.
- 하위 구성요소에서 값이 변경되면 업데이트된 값으로 함수를 호출합니다.
예.
const Parent = () => {
const handleChange = values => {
alert(JSON.stringify(values) );
//do something with the values
}
return (
<Child handleChange={handleChange} />
);
}
const Child = ({handleChange}) => {
return (
<button onClick={()=> handleChange('values you wish to pass') }}></button>
);
}
NB: 리액트 16에서는 거의 모든 경우에 기능 컴포넌트를 사용할 것을 권장합니다.
부모에서 직접 상태를 업데이트하지 않아도 됩니다.
부모 컴포넌트:
render(){
return(<Child sendData={ v => this.setState({item: v}) } />);
}
하위 구성 요소:
demoMethod(){
this.props.sendData(value);
}
콜백을 사용하여 데이터를 자식 컴포넌트에서 부모 컴포넌트로 전달
You need to pass from parent to child callback function, and then call it in the child.
부모 컴포넌트:-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}
/>
주의:- onSelectPusingTimeDiff={this.handleTimeValue}
필요한 경우 하위 구성 요소에서 소품 호출
componentDidMount():void{
// Todo use this as per your scenrio
this.props.onSelectPouringTimeDiff(pouringDiff);
}
자녀 컴포넌트에 잘못된 함수를 전달하고 있으며 부모 클래스에 다음 함수가 없습니다.handleLanguage
기능.대신 다음과 같이 전달할 수 있습니다.<SelectLanguage onSelectLanguage={this.handleLanguageChange}/>
클래스에 함수가 없는 경우 None이 될 수 있습니다.부모 컴포넌트는 다음과 같습니다.
render() {
return (
<div className="col-sm-9">
<SelectLanguage onSelectLanguage={this.handleLanguage} />
</div>
);
}
데이터를 하위 구성 요소에서 상위 구성 요소로 전달하는 가장 좋은 방법
자성분
handleLanguageCode=()=>(langValue) {
this.props.sendDatatoParent(langValue)
}
부모
<부모의 sendDatatoParent={데이터=>이것.setState({item: data}) } />;
import { useEffect, useState } from "react";
export default function App() {
const data = (data) => {
console.log("data", data);
};
const myData = {
name: "hi this is my data"
};
return <Form onSubmit={data} myDatasa={myData} />;
}
const Form = (props) => {
console.log("myData", props.myDatasa.name);
const [choreDesc, setChoreDesc] = useState();
const handleSubmit = (e) => {
e.preventDefault();
props.onSubmit(choreDesc);
};
const handlechange = (e) => {
setChoreDesc(e.target.value);
};
return (
<form
onSubmit={(e) => {
handleSubmit(e);
}}
>
<label>Chore description:</label>
<br />
<input
name="choreDesc"
type="text"
value={choreDesc}
onChange={handlechange}
/>
<br />
<input type="submit" value="Add Log" />
</form>
);
};
```
리액트 후크의 부모 컴포넌트와 자녀 컴포넌트 간에 데이터 전달
함수를 자녀에게 전달하고 부모의 함수를 호출하여 값을 자녀에게 전달하기를 기다립니다.
parent (../app.disples
import MyCOMP from "../component/MyCOMP"; //import child component
export default function MyMainPage() {
return(
<>
<MyCOMP
//pass function to child and wait child passback the changed value
// 1.Click child component passing function to child
ParentFunction={(x)=>{
console.log('Child Pass Back Value',x)
// 3. Parent received data
// after you get the value change you can ultilize another function, useEffect or useState
}}/>
</>
)
}
아이(../component/MyCOMP.js)
export default function MyCOMP({ParentFunction}){
return(
<>
<button onClick={()=>{
// 2. Child passing back value to parent
ParentFunction("Child reply ANSWER is ","fm 99.8");}}>Click Me</button>
</>
)
}
결과
버튼을 클릭하면 부모 클래스가 "fm 99.8" 스팅 값(자녀 값)을 표시합니다.
도움이 되시거나 다른 아이디어가 있으시면 아래에 코멘트를 남겨주세요.
언급URL : https://stackoverflow.com/questions/38394015/how-to-pass-data-from-child-component-to-its-parent-in-reactjs
'programing' 카테고리의 다른 글
허브 클래스 외부에서 SignalR 사용자 연결 ID를 가져오려면 어떻게 해야 합니까? (0) | 2023.03.11 |
---|---|
경고: mysqli_real_connect(): (HY000/2002)1452행의 /private/tmp/wordpress/wp-includes/wp-db.php에 이러한 파일 또는 디렉토리가 없습니다. (0) | 2023.03.11 |
angularjs의 배수는 $http입니다.요구를 받다 (0) | 2023.03.11 |
Reactjs에 setState()의 동기 대체가 있습니까? (0) | 2023.03.11 |
양식 입력 필드 지우기 및 재설정 (0) | 2023.03.11 |