【问题标题】:How do I call setState from another Component in ReactJs如何从 ReactJs 中的另一个组件调用 setState
【发布时间】:2019-07-28 10:36:21
【问题描述】:

我有两个反应组件,我想调用 setState 在一个组件中设置状态,但在另一个组件中调用。 我该怎么做?

【问题讨论】:

标签: reactjs components setstate


【解决方案1】:

如果您使用功能组件,您可以使用像 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

在一个类中,您可以使用包含一些逻辑或函数调用的处理程序(方法)。它有助于保持代码的可维护性。

类组件解决方案

// 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

【讨论】:

  • 嗨,我的情况正好相反。尝试通过单击父功能组件的按钮更改子功能组件中的状态。此外,还有多个子组件,每个子组件都有一个按钮。我如何确保只有其中一个更新?提前致谢!
  • @SanjivPradhanang 也许您可以打开一个问题线程,用代码示例公开您的问题。这样会更容易提出解决方案。
【解决方案2】:

您不能从子组件直接调用父组件上的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()} />
  )
}

【讨论】:

  • 感谢您的回复,尽管我选择了 Kornflexxs
  • TypeError: props.setChanged 不是函数
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2017-08-19
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多