Обновление родительского состояния от дочерних компонентов, не работающих в reactjs - PullRequest
0 голосов
/ 20 апреля 2020

Я проходил реакцию Официальная документация , когда я натолкнулся на пример, который обновляет родительский компонент с помощью обратных вызовов дочернего компонента. Я был в состоянии понять, как работает поток. Однако, когда я попытался оптимизировать код дальше, он не смог обновить компонент с помощью обратных вызовов.

Оригинальный код:

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')
);

1 Ответ

0 голосов
/ 20 апреля 2020

Хорошо, главная проблема здесь в том, что вы пытаетесь присвоить многим «это». React не отслеживает изменения и выполняет повторную визуализацию при изменении метода или свойств компонента. старайтесь избегать этого паттерна и напрямую использовать состояние и реквизит. Только изменения состояния или реквизита вызовут повторную визуализацию компонента. В вашей ситуации вы можете посмотреть на этот код:

   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')
);
...