如何在ReactJS中从子组件设置父组件的状态
在ReactJS中,我们可以通过将值作为子组件的prop来设置子组件的状态。有时候,我们需要从子组件将状态设置到父组件中。
我们可以在父组件中创建一个状态处理函数,并将其作为子组件的prop传递。然后,我们可以使用子组件函数来设置父组件的状态。通过这种方式,我们可以从子组件管理父组件的状态。
从函数组件中的子组件设置父状态
在函数组件中,我们可以通过将状态处理函数作为子组件的prop来从子组件设置父状态。
无论我们将任何函数作为组件prop传递,我们都可以从子组件执行该函数,即使该函数在父组件中定义。
语法
用户可以采用以下语法来处理React函数组件中从子组件设置父组件的状态。
// in the parent component
<Child change = {handleState} />
// in the child component
<button onClick = {() => change()}> Change Value from child </button>
在以上的语法中,我们将handleState()函数作为子组件的一个prop进行了传递。在子组件中,我们调用change()函数,该函数执行父组件的handleState()函数。
示例
在 App.js 文件中,我们使用hooks创建了状态变量。同时,我们创建了handleState()变量,用于改变状态变量的值。
另外,我们导入了子组件并将handleState()函数作为子组件的一个prop进行了传递。
文件名:- App.js
import React, { useState } from "react";
import Child from "./Child";
export default function App() {
let [state, setState] = useState("Initial");
function handleState() {
setState("state Changed from child component!");
}
return (
<div className = "App">
<h2>
{" "}
Handling the <i> parent state from child component </i> in ReactJS.{" "}
</h2>
<div> The input value is {state}. </div>
<Child change = {handleState} />
</div>
);
}
文件名: Child.js
import React, { useState } from "react";
function Child({ change }) {
return (
<div>
<button onClick = {() => change()}> Change Value from child </button>
</div>
);
}
export default Child;
输出
它将产生以下输出-

在上面的输出中,用户可以观察到点击按钮时它改变了父组件的状态。
示例
在第一个示例中,我们通过将函数作为子组件的 prop 传递来改变父组件的状态,但是我们为父组件的状态设置了硬编码的值。
在下面的示例中,我们还将从子组件传递值给父组件,并使用从子组件获取的新值更新父组件的状态。
文件名:App.js
import React, { useState } from "react";
import Child from "./Child";
export default function App() {
let [state, setState] = useState("Initial");
function handleState(newValue) {
setState(newValue);
}
return (
<div className = "App">
<h2>
{" "}
Handling the <i> parent state from child component </i> in ReactJS.{" "}
</h2>
<div>
The input value in child state accessing from parent state is {state}.
</div>
<br></br>
{/* pass handleState function as a prop of child component */}
<Child change = {handleState} />
</div>
);
}
文件名:Child.js
import React, { useState } from "react";
// accessing the change function from the prop.
function Child({ change }) {
const [value, setNewValue] = useState("");
function handleChange(event) {
let value = event.target.value;
setNewValue(value);
change(value);
}
return (
<div>
<input
placeholder = "Enter some texts."
value = {value}
onChange = {handleChange}
/>
</div>
);
}
export default Child;
输出

当您输入一些文字 –

在上面的输出中,用户可以观察到输入元素位于子组件内部。无论我们在输入字段中写什么,在父组件中都会反映出来。
在类组件中从子组件设置父组件状态
我们还可以将方法作为子组件的props传递给类组件,以便从子组件处理父组件的状态。
语法
用户可以按照以下语法从子组件处理父组件的状态,以在类组件中处理父组件的状态。
<Child changeState = {this.changeState} />
<button onClick = {this.changeState}> Change parent's state </button>
在上面的语法中,我们使用’this’关键字来访问函数并将其作为子组件的属性传递。用户可以看到我们如何从子组件中调用changeState()函数。
示例
在App.js文件中,我们在构造函数中定义了状态。此外,我们还定义了changeState()方法,用于设置状态值。changeState()方法接受更新的值作为参数,我们将其用于更新状态的值。
文件名:App.js
import React, { useState } from "react";
import Child from "./Child";
class App extends React.Component {
constructor(props) {
super(props);
this.changeState.bind(this);
this.state = { value: "Empty" };
}
changeState = (newValue) => {
this.setState({ value: newValue });
};
render() {
return (
<div>
<h2>
{" "}
Handling the <i> parent state from child component </i> in class components
</h2>
<h3> The value of state variable is {this.state.value}.</h3>
<Child changeState = {this.changeState} />
</div>
);
}
}
export default App;
在Child.js文件中,我们在按钮点击时执行handleChange()函数。handleChange()方法调用传递新值作为参数的prop的changeState()方法。
文件名:Child.js
import React from "react";
import { Component } from "react";
// accessing the change function from the prop.
class Child extends Component {
constructor(props) {
super(props);
this.handleChange.bind(this);
}
handleChange = () => {
this.props.changeState("This is value set up from child component!");
};
render() {
return (
<div>
<h3> This is a child component! </h3>
<button onClick = {this.handleChange}> Change parent's state </button>
</div>
);
}
}
export default Child;
输出

在本教程中,我们学习了如何从子组件设置父组件的状态。实现这个目标的一般方式是将状态处理函数作为子组件的属性传递,并在子组件中通过将新的状态值作为参数传递来执行处理函数。
极客笔记