@Cruper
web-падаван

Как безопасно размонтировать компонент в React?

По клику по кнопке в одном компоненте, удаляю компонент в родительском таким кодом:
// componentA.jsx
class ComponentA extends React.PureComponent {
  removeB() {
    this.setState({ mounted: false })
  }

  renderB() {
    if (!this.state.mounted) {
      return null
    }
    return <ComponentB />
  }

  render() {
    return <div>
      {this.renderB()}
      <ComponentC onClick={this.removeB} />
    </div>
  }
}

// componentB.jsx
class ComponentB extends React.PureComponent {
  render() {
    return // Какой-то контент
  }
}

// componentC.jsx
class ComponentC extends React.PureComponent {
  render() {
    return <Button onClick={this.props.onClick} />
  }
}

Получаю ошибку:
Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
  • Вопрос задан
  • 362 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
class ComponentA extends React.PureComponent {
  state = { isMounted: true };

  removeB = () => {
    this.setState({ isMounted: false });
  };

  render() {
    const { isMounted } = this.state;

    return (
      <div>
        {isMounted && <ComponentB />}
        <ComponentC onClick={this.removeB} />
      </div>
    );
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimakrsna
@dimakrsna
Front-end develorer
Правильнее это делать так:
// componentA.jsx
class ComponentA extends React.PureComponent {
    state = {
        mounted: false
    }

    removeB = () => {
        this.setState({ mounted: !this.state.mounted })
    }

    render() {
        let { mounted } = this.state
        return <div>
            {
                (mounted) ? <ComponentB /> : <ComponentC onClick={this.removeB} />
            }
        </div>
    }
}


// componentB.jsx
class ComponentB extends React.PureComponent {
    render() {
        return <div>ComponentB</div>
    }
}

// componentC.jsx
class ComponentC extends React.PureComponent {
    render() {
        return <button onClick={this.props.onClick}>ComponentC click me</button>
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы