繁体   English   中英

从在 reactjs 中不起作用的子组件更新父 state

[英]Updating parent state from child components not working in reactjs

当我遇到一个通过子组件回调更新父组件的示例时,我正在浏览 react官方文档 我能够理解流程是如何工作的。 但是,当我尝试进一步优化代码时,它无法通过回调更新组件。

原始代码:

https://codepen.io/gaearon/pen/QKzAgB?editors=0010

我的代码更改:

    class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
    this.button = <MyButton message="Login" onClick={this.handleLoginClick} />;
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;
    if (isLoggedIn) {
      this.button = <MyButton message="Logout" onClick={this.handleLogoutClick} />;
    } else {
      this.button = <MyButton message="Login" onClick={this.handleLoginClick} />;
    }

    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />
        {this.button}
      </div>
    );
  }
}

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

class MyButton extends React.Component {
  constructor(props) {
    super(props);
    this.message=props.message;
    this.click=props.onClick;
  }
  render() {
    return (
    <button onClick={this.click}> 
        {this.message}
    </button>  
    );
  }
}

ReactDOM.render(
  <LoginControl />,
  document.getElementById('root')
);

好的,这里的主要问题是您试图将许多东西分配给“这个”。 当组件的方法或属性发生更改时,React 不会跟踪更改并重新渲染。 尽量避免这种模式并直接使用 state 和道具。 只有对 state 或道具的更改才会导致组件重新渲染。 在您的情况下,您可以查看以下代码:

   class LoginControl extends React.Component {


     state = {isLoggedIn : false}

  handleLoginClick = () => {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick = () => {
    this.setState({isLoggedIn: false});
  }

  button = () => {

    const message = this.state.isLoggedIn ? "Logout" : "Login";
    const onClick = this.state.isLoggedIn ? this.handleLogoutClick : this.handleLoginClick;
    return <MyButton message={message} onClick={onClick} />
  }

  render() {


    return (
      <div>
        <Greeting isLoggedIn={this.state.isLoggedIn} />
       {this.button()}
      </div>
    );
  }
}

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

class MyButton extends React.Component {
  constructor(props) {
    super(props);
    this.message=props.message;
    this.click=props.onClick;
  }
  render() {
    return (
    <button onClick={this.props.onClick}> 
        {this.props.message}
    </button>  
    );
  }
}

ReactDOM.render(
  <LoginControl />,
  document.getElementById('root')
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM