ReactJS 从子类更改另一个类的状态

Posted

技术标签:

【中文标题】ReactJS 从子类更改另一个类的状态【英文标题】:ReactJS change state of another class from child 【发布时间】:2018-08-01 03:20:37 【问题描述】:

我试图理解 state.props 以帮助我将值从孩子传递给父母。我有一个header component(子),当单击链接时,它应该将值传递给App component(父)内的方法。然后,此方法设置用于其他事物的值的状态。我尝试在 App.js 文件中绑定该方法,但这不起作用。单击链接时出现错误:× TypeError: _this.changeSearchState is not a function

Header.js

import React,  Component  from "react";
import  Link  from 'react-router-dom';

class Header extends Component 

changeSearch = (e) => 
e.preventDefault();
   var type = this.value;
   this.changeSearchState(type);


render() 
return (
<header>
      <div className="float-right top-bar">
        <Link onClick=this.changeSearch value="users" to="/users">Users</Link>
        <Link onClick=this.changeSearch value="feedback" to="/feedback">Feedback</Link>
        ...
      </div>
</header>
)


export default Header;

App.js

class App extends Component 
constructor(props) 
super(props)
this.state = 
    isOpen: false,
    dataType: ''

this.changeSearchState = this.changeSearchState.bind(this);

changeSearchState = (dataType) => 
 this.setState(
  dataType: dataType
 );

...

【问题讨论】:

【参考方案1】:

我认为您想将changeSearchState 作为道具传递给Header 组件。

render() for App.js

<Header
    changeSearchState=this.changeSearchState
/>

然后从 Header.js 访问它:

changeSearch = (e) => 
    e.preventDefault();
    var type = this.value;
    this.props.changeSearchState(type)

您可以阅读有关组件和道具的更多信息here。

【讨论】:

【参考方案2】:

您应该只在 一个 位置更新状态。所以你应该在Parent 组件中更新它并将它传递给Child。您可以像普通道具一样访问从父级传递给子级的方法。像这样的:

App.js

class App extends Component 
constructor(props) 
super(props)
this.state = 
    isOpen: false,
    dataType: ''

this.changeSearchState = this.changeSearchState.bind(this);

changeSearchState = (dataType) => 
 this.setState(
  dataType: dataType
 );

render() 
  return (
    <Header changeSearchState=this.changeSearchState /> //this is what you want!!!
  )

Header.js

import React,  Component  from "react";
import  Link  from 'react-router-dom';

class Header extends Component 

changeSearch = (e) => 
e.preventDefault();
   var type = this.value;
   this.props.changeSearchState(type); // call it here with this.props!!


render() 
return (
<header>
      <div className="float-right top-bar">
        <Link onClick=this.changeSearch value="users" to="/users">Users</Link>
        <Link onClick=this.changeSearch value="feedback" to="/feedback">Feedback</Link>
        ...
      </div>
</header>
)


export default Header;

【讨论】:

谢谢,这解决了和其他问题一样的答案,尽管他早了 1 分钟 :)

以上是关于ReactJS 从子类更改另一个类的状态的主要内容,如果未能解决你的问题,请参考以下文章

React Js - Flux 中的状态管理

GraphQL 和 ReactJS 状态

从 React 状态对象中提取地理位置

ReactJs 保留多个react 值,刷新后不重置状态

Reactjs - 将状态值从一个组件传递到另一个组件

ReactJS Redux State(全局状态)+ React.Context(本地状态)