我如何从 ReactJs 中的另一个组件调用 setState
How do I call setState from another Component in ReactJs
我有两个 React 组件,我想调用 setState 在一个组件中设置状态,但在另一个组件中调用。
我该怎么做?
如果您使用功能组件,您可以使用像 useState
这样的钩子。不要忘记使用 useCallback
“保存”(记忆)你的处理程序的引用,它有助于 React 避免无用的重新渲染。
功能组件解决方案
// myContainer.js
import React, { useState } from 'react'
import MyChild from 'some/path/myChild'
function MyContainer() {
const [name, setName] = useState('foo')
return (
<MyChild name={name} onNameChange={setName} />
)
}
export default MyContainer
// myChild.js
import React, { useCallback } from 'react'
function MyChild({ name, onNameChange }) {
const handleInputChange = useCallback(event => {
onNameChange(event.target.value)
}, [onNameChange])
return (
<div>
<input type="text" onChange={handleInputChange} value={name} />
<div>The name is: {name}</div>
</div>
)
}
export default MyChild
在 class 中,您可以使用包含一些逻辑或函数调用的处理程序(方法)。它有助于保持代码的可维护性。
Class分量解
// myContainer.js
import React, { Component } from 'react'
import MyChild from 'some/path/myChild'
class MyContainer extends Component {
state = {
name: 'foo'
}
handleNameChange = name => {
this.setState({ name })
}
render() {
return (
<MyChild name={this.state.name} onNameChange={this.handleNameChange} />
)
}
}
export default MyContainer
// myChild.js
import React, { Component } from 'react'
class MyChild extends Component {
handleInputChange = event => {
this.props.onNameChange(event.target.value)
}
render() {
return (
<div>
<input type="text" onChange={this.handleInputChange} value={this.props.name} />
<div>The name is: {this.props.name}</div>
</div>
)
}
}
export default MyChild
您不能直接从子组件调用父组件 setState
,因为组件状态的更新仅限于当前组件。
要处理这个问题,只需将一个函数从父级传递给包含 setState
的子级即可。所以当你想更新父级的状态时,只需调用传递的函数即可。
一个最小的例子:
// Parent.jsx
import React, { Component } from 'react';
import Child from './Child';
class Parent extends Component {
constructor(props) {
super(props);
this.setChanged = this.setChanged.bind(this);
this.state = {
changed: false
}
}
// Function to set the parent's state
setChanged() {
this.setState({ changed: true });
}
render() {
return <Child setChanged={this.setChanged} />
}
}
// Child.js
import React from 'react';
function Child(props) {
return (
// When clicked, parent's setChanged function is called
<div onClick={() => props.setChanged()} />
)
}
我有两个 React 组件,我想调用 setState 在一个组件中设置状态,但在另一个组件中调用。 我该怎么做?
如果您使用功能组件,您可以使用像 useState
这样的钩子。不要忘记使用 useCallback
“保存”(记忆)你的处理程序的引用,它有助于 React 避免无用的重新渲染。
功能组件解决方案
// myContainer.js
import React, { useState } from 'react'
import MyChild from 'some/path/myChild'
function MyContainer() {
const [name, setName] = useState('foo')
return (
<MyChild name={name} onNameChange={setName} />
)
}
export default MyContainer
// myChild.js
import React, { useCallback } from 'react'
function MyChild({ name, onNameChange }) {
const handleInputChange = useCallback(event => {
onNameChange(event.target.value)
}, [onNameChange])
return (
<div>
<input type="text" onChange={handleInputChange} value={name} />
<div>The name is: {name}</div>
</div>
)
}
export default MyChild
在 class 中,您可以使用包含一些逻辑或函数调用的处理程序(方法)。它有助于保持代码的可维护性。
Class分量解
// myContainer.js
import React, { Component } from 'react'
import MyChild from 'some/path/myChild'
class MyContainer extends Component {
state = {
name: 'foo'
}
handleNameChange = name => {
this.setState({ name })
}
render() {
return (
<MyChild name={this.state.name} onNameChange={this.handleNameChange} />
)
}
}
export default MyContainer
// myChild.js
import React, { Component } from 'react'
class MyChild extends Component {
handleInputChange = event => {
this.props.onNameChange(event.target.value)
}
render() {
return (
<div>
<input type="text" onChange={this.handleInputChange} value={this.props.name} />
<div>The name is: {this.props.name}</div>
</div>
)
}
}
export default MyChild
您不能直接从子组件调用父组件 setState
,因为组件状态的更新仅限于当前组件。
要处理这个问题,只需将一个函数从父级传递给包含 setState
的子级即可。所以当你想更新父级的状态时,只需调用传递的函数即可。
一个最小的例子:
// Parent.jsx
import React, { Component } from 'react';
import Child from './Child';
class Parent extends Component {
constructor(props) {
super(props);
this.setChanged = this.setChanged.bind(this);
this.state = {
changed: false
}
}
// Function to set the parent's state
setChanged() {
this.setState({ changed: true });
}
render() {
return <Child setChanged={this.setChanged} />
}
}
// Child.js
import React from 'react';
function Child(props) {
return (
// When clicked, parent's setChanged function is called
<div onClick={() => props.setChanged()} />
)
}