【发布时间】:2021-03-14 05:00:21
【问题描述】:
我正在构建带有“打开表单”按钮的产品卡。想要做的是当我点击 Open Form 时,要显示一个表单,当我点击 cross 时,它应该被隐藏。我通过使用组件来做到这一点。
问题 - 我单击打开表单,显示表单,然后单击交叉,然后隐藏,但是当我再次单击按钮时,它没有显示。我已经使用状态变量来渲染组件,当我调试时,更新的状态保持不变。
代码 -(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;
代码 -(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,有点困惑。
【问题讨论】:
-
使用 React.Portal,为什么要在已经渲染的 App 上使用 ReactDOM.render?这不是这里的用例,你不应该像在你的例子中那样在动态元素上使用 ReactDOM.render,如果你这样做了,你应该使用引用而不是查询 DOM (createReference())。
标签: reactjs components