Добавление и удаление компонентов React

#reactjs #components

#reactjs #Компоненты

Вопрос:

Я создаю карточку продукта с помощью кнопки «Открыть форму». Что нужно сделать, так это когда я нажимаю на открытую форму, отображается форма, а когда я нажимаю на крест, она должна быть скрыта. Я делаю это с помощью компонентов.

Проблема — я нажимаю на открытую форму, отображается форма, затем я нажимаю на крест, затем он скрывается, но когда я снова нажимаю на кнопку, она не отображается. Я использовал переменные состояния для визуализации компонента, при отладке поддерживается обновленное состояние.

Код — (класс ProdCard)

 import React from 'react';
import ReactDOM from 'react-dom';
import FormLayout from '../Form/FormLayout';
import {Atag,Button, Container} from '../Elements/Elements';

class ProdCard extends React.Component {
    constructor(props){
        super(props);
        this.openForm = this.openForm.bind(this);
    }
    openForm(){
        ReactDOM.render(<FormLayout ctaClicked={true}/>, document.getElementById('forms'));
    }
    render() {
      return(
            <Container className="prodBox pdiBox pdiDf pdiFdc">
                <Container className="pdiPrd pdiDf">
                    <Atag href="" className="pdiImg pdiDf" children={<img alt={this.props.ProdName}/>}/>
                    <Container>
                        <h2><Atag href="" className="pdiDf pdiClr1" children={this.props.ProdName}/></h2>
                        <h3><Atag href="" className="pdiDf" children={this.props.ProdName}/></h3>
                        <Button className="gbp" id={this.props.id} onClick={this.openForm} children="Get Best Price"/>
                    </Container>
                </Container>
                <Container className="pdiDtls pdiFdc">
                    <p className="pdiTal">{this.props.Desc}</p>
                    <Atag href="#" children="View Details"/>
                 </Container>
            </Container>
      )
    }
}

export default ProdCard;
 

Code — (Класс FormLayout)

 import React from 'react';
import ReactDOM from 'react-dom';
import { Container } from '../Elements/Elements';
import FormLeft from '../Form/FormLeft';
import FormRight from '../Form/FormRight';

class FormLayout extends React.Component{
    constructor(props){
        super(props);
        this.state = {showForm : true, isCloseClicked : false}
        this.removeForm = this.removeForm.bind(this);
        this.showForm = this.showForm.bind(this);
    }
    removeForm(){
        this.setState({showForm : false, isCloseClicked : true})
    }
    render(){
        if(this.state.showForm === false) return <Container/>
        else
        return(
            <Container>
                <Container className="blck"></Container>
                <Container className="forms bcp bc">
                    <Container id="left" className="ls bcl"/>
                    <Container  className="rs">
                        <Container children="X" className="close" onClick={this.removeForm}/>
                        <Container id="right"/>
                    </Container>
                </Container>
            </Container>
             
        );
    }
    componentDidMount(){
        ReactDOM.render(<FormLeft/>, document.getElementById('left'));
        ReactDOM.render(<FormRight/>, document.getElementById('right'));
    }
}

export default FormLayout;
 

Когда именно я могу обновить состояние, чтобы достичь «пользователь нажимает на форму, она отображается, пользователь нажимает на крест, который он скрывает (и это может произойти миллион раз)»?

Новый для React, немного запутанный.

Комментарии:

1. Используйте React. Портал, почему вы используете ReactDOM.render в уже отрисованном приложении? Здесь это не используется, вы не должны использовать ReactDOM.render для динамических элементов, как в вашем примере, и если вы это сделаете, вы должны использовать ссылки, а не запрашивать DOM (createReference()).

Ответ №1:

Ваш код выглядит странно и ему не нравится способ React, пожалуйста, не используйте React.render напрямую, вы должны позволить ProdCard контролировать, отображать ли FormLayout

вы должны изменить свой код на это:

 class ProdCard extends React.Component {
    constructor(props){
        super(props);
        this.openForm = this.openForm.bind(this);
        this.state = { showForm: true }
    }
    openForm(){
        this.setState({ showForm: true })
    }
    closeForm() {
        this.setState({ showForm: false })
    }
    render() {
      return(
        <>
          <Container className="prodBox pdiBox pdiDf pdiFdc">
              <Container className="pdiPrd pdiDf">
                  <Atag href="" className="pdiImg pdiDf" children={<img alt={this.props.ProdName}/>}/>
                  <Container>
                      <h2><Atag href="" className="pdiDf pdiClr1" children={this.props.ProdName}/></h2>
                      <h3><Atag href="" className="pdiDf" children={this.props.ProdName}/></h3>
                      <Button className="gbp" id={this.props.id} onClick={this.openForm} children="Get Best Price"/>
                  </Container>
              </Container>
              <Container className="pdiDtls pdiFdc">
                  <p className="pdiTal">{this.props.Desc}</p>
                  <Atag href="#" children="View Details"/>
               </Container>
          </Container>
          <FormLayout visible={this.state.showForm} onClose={this.closeForm} />
        </>
      )
    }
}

class FormLayout extends React.Component{
    constructor(props){
        super(props);
    }
    render(){
        if(!this.props.visible) {
          return <Container/>
        }

        return(
            <Container>
                <Container className="blck"></Container>
                <Container className="forms bcp bc">
                    <Container id="left" className="ls bcl">
                      <FormLeft/>
                    </Container>
                    <Container  className="rs">
                        <Container children="X" className="close" onClick={this.props.closeForm}/>
                        <Container id="right">
                          <FormRight/>
                        </Container>
                    </Container>
                </Container>
            </Container>
        );
    }
}

 

Комментарии:

1. Хорошо, теперь я понял. Спасибо