如何在 React 中将 JSON 对象从子组件传递到父组件
介绍
在 React 中,组件之间传递数据是组件间通信的关键任务。状态和 props 是此任务中最广泛使用的技术。使用状态和 props,您可以传递多种数据类型,包括字符串、数组、数字和对象。
在本指南中,您将学习如何使用不同的方法(包括使用 props 和 state)将数据从父组件传递到子组件,反之亦然。
将数据从父组件传递到子组件
React 遵循基于组件的架构。每个屏幕或屏幕的一部分都可以由一个组件表示。
例如,静态值可以像这样传递给子组件:
import React, { Component } from "react";
import { render } from "react-dom";
import Demo1 from "./demo1";
class App extends Component {
constructor() {
super();
this.state = {
message: "This is dummy message",
};
}
render() {
const { message } = this.state;
return (
<div>
<div>Pass data from parent to child component</div>
<hr />
<Demo1
message={this.state.message}
/>
</div>
);
}
}
render(<App />, document.getElementById("root"));
在此应用组件中,我们创建了一个名为message的状态值,其中包含文本。要将相同的状态值传递给名为Demo1的子组件,请创建一个名为message的附加键。除了键之外,还要传递状态值,例如this.state.message,子组件可以将其作为 props 值使用,如下所示:
import React, { Component } from "react";
class Demo1 extends Component {
constructor() {
super();
this.state = {
name: "React"
};
}
render() {
const { message } = this.props;
return (
<div>
<p>Data coming from parent component</p>
<hr />
<table>
<tr>
<td>Message is : { message }</td>
</tr>
</table>
</div>
);
}
}
export default Demo1;
您已使用语句访问了 props 值。
const { message } = this.props;
如果您想在render()方法中使用它,请直接使用它的名称,就像这样。
<table>
<tr>
<td>Message is : { message }</td>
</tr>
</table>
现在,您已将值从父组件访问到子组件。同样,您还可以传递其他值,例如对象或数组,如下所述。
例如,如果有一个员工数组,并且您必须将所有员工详细信息显示到子组件中,则按如下方式传递完整数组:
import React, { Component } from "react";
import { render } from "react-dom";
import Demo1 from "./demo1";
class App extends Component {
constructor() {
super();
this.state = {
message: [],
employee: [
{
id: 1,
name: "Abc",
age: 25
},
{
id: 2,
name: "Def",
age: 28
},
{
id: 3,
name: "Ghi",
age: 30
}
]
};
this.onSubmitMessage = this.onSubmitMessage.bind(this);
}
onSubmitMessage(message) {
this.setState({ message: message });
}
render() {
const { employee, message } = this.state;
return (
<div>
<div>Pass data from parent to child component</div>
<hr />
<Demo1 employeeData={employee} />
</div>
);
}
}
render(<App />, document.getElementById("root"));
在此示例中,您已将一个数组 employee 传递到状态中。employee包含不同的对象,包括员工详细信息,并且根据记录,您需要将详细信息显示到子组件中,但作为一个 prop。
将状态值传递给子组件后,可以从子组件访问它们,如下所示:
render() {
const { employeeData } = this.props;
return (
<div>
<p>Data coming from parent component</p>
<hr />
<table border="2">
{employeeData.map((data, index) => {
return (
<>
<tr key={data.id}>
<td>id :</td>
<td>{data.id}</td>
</tr>
<tr key={index}>
<td>Name :</td>
<td>{data.name}</td>
</tr>
<tr key={index}>
<td>Age :</td>
<td>{data.age}</td>
</tr>
</>
);
})}
</table>
</div>
);
}
来自父组件作为 props 发送的每条记录都称为employeeData。这是将数据从父组件发送到子组件的主要方式之一。
将 JSON 对象从子组件传递到父组件
重要的是实现回调函数,以便一旦任何操作触发子组件,它就会转发给父组件。
让我们看一个实现简单表单的例子,该表单将消息作为由表单控件驱动的文本输入传递,如下所示:
import React, { Component } from "react";
class Demo2 extends Component {
constructor() {
super();
this.state = {
greetingMessag: "",
};
this.onMessageChange = this.onMessageChange.bind(this);
this.onSubmit = this.onSubmit.bind(this);
}
onMessageChange(event) {
let message = event.target.value;
this.setState({ greetingMessag: message });
}
// pass message to parent component using callback
onSubmit() {
this.props.onSubmitMessage(this.state.greetingMessag);
}
render() {
return (
<div>
<p>Pass data from child component to parent</p>
<tr />
<table border="2">
<tr>
<td colspan="2">Pass greeting message to parent component</td>
</tr>
<tr>
<td>Type greeting message :</td>
<td>
<input type="text" onChange={this.onMessageChange} />
</td>
</tr>
<tr>
<td colspan="2">
<button onClick={this.onSubmit}>Submit</button>
</td>
</tr>
</table>
</div>
);
}
}
export default Demo2;
让我解释一下这个例子。
- 我们有一个状态值,greetingMessage,一旦用户改变输入值它就会更新并将其发送给父组件。
- 然后,有两个不同的方法。一个是onMessageChange(),用于在用户更改输入值时更新状态值;另一个是onSubmit(),用于将更新的消息作为回调函数传递给父组件。
- 已实现一个表单,其中包含输入控件和按钮,当用户单击提交按钮时,该表单即提交。
主要部分是onSubmit()方法,该方法将方法作为 prop,并将更新的消息传递给父组件。
onSubmit() {
this.props.onSubmitMessage(this.state.greetingMessag);
}
因此,将更新后的消息传递给父组件后,将其消费到父组件中,如下所示:
import React, { Component } from "react";
import { render } from "react-dom";
import Demo2 from "./demo2";
class App extends Component {
constructor() {
super();
this.state = {
message: "",
};
this.onSubmitMessage = this.onSubmitMessage.bind(this);
}
onSubmitMessage(message) {
this.setState({ message: message });
}
render() {
const { employee, message } = this.state;
return (
<div>
<div>Pass data from parent to child component</div>
<div>
The message coming from the child component is : {message}
</div>
<hr />
<Demo2
// passing as callback function
onSubmitMessage={this.onSubmitMessage}
/>
</div>
);
}
}
render(<App />, document.getElementById("root"));
在上面的例子中,您已经实现了回调函数。
onSubmitMessage(message) {
this.setState({ message: message });
}
所以一旦用户从子组件点击提交按钮,页面就会重定向到父组件,您可以根据可行性使用它。
从函数onSubmitMessage获取来自子组件的消息作为参数后,将其配置到状态值中并像这样使用它:
render() {
const { employee, message } = this.state;
return (
<div>
<div>Pass data from parent to child component</div>
<div>
The message coming from the child component is : {message}
</div>
<hr />
<Demo2
// passing as callback function
onSubmitMessage={this.onSubmitMessage}
/>
</div>
);
}
以相同的方式,将 JSON 对象从子组件传递到父组件,就像传递文本、数字、数组、对象等普通值一样。
从父组件创建 JSON 数据到状态中,如下所示:
constructor() {
super();
this.state = {
jsonData: [
{
id: 1,
name:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~