在点击时渲染新元素
Render new elements onClick
我有一个名为 <ImageVoteItem/>
的 ReactJS 组件。我有一个名为 'Add Option'
的按钮。当我单击此按钮时,应该会出现 <ImageVoteItem/>
。当我再次单击该按钮时,应该会出现另一个 <ImageVoteItem/>
组件。
我已经使用状态完成了此操作。但是我只能渲染一个 <ImageVoteItem/>
组件。每当我单击 'Add Option'
按钮时,如何一遍又一遍地渲染相同的组件?
我的class
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
addOption: false,
}
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState({
addOption: true,
})
}
render() {
return (
<div className="padding5px margin_bottom10px">
<ImageVoteItem/>
<ImageVoteItem/>
{this.state.addOption ? <ImageVoteItem/> : null}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
不要使用 bool
,而是使用一个数值来存储 ImageVoteItem
的计数(您要渲染该组件的次数)。然后在该状态值上使用 map
来呈现 ImageVoteItem
组件。
像这样:
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
count: 1,
}
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState((prevState) => {
return {count: prevState.count + 1}
})
}
_renderComponent(){
let count = this.state.count, uiItems = [];
while(count--)
uiItems.push(<ImageVoteItem key={el}/>)
return UiItems;
}
render() {
return (
<div className="padding5px margin_bottom10px">
{this._renderComponent()}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
我为您添加另一个选项作为maxImage。如果您定义任何最大图像值,您可以向其添加更多图像组件。
在 return 渲染之前,您可以使用循环将图像列表定义为数组,您可以在渲染元素中使用它。
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
addOption: 0,
maxImage:10
}
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState((prevState)=>({
addOption: ++prevState.addOption,
})
}
render() {
let list = []
for(var i =0 ;i<=this.state.maxImage;i++){
list.push(<div>{this.state.addOption>i&&
<ImageVoteItem/>}</div>)
}
return (
<div className="padding5px margin_bottom10px">
{list}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
如果你不想要任何限制,你也可以使用这个:
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
imageList: []
}
this.addOption = this.addOption.bind(this);
}
addOption() {
let list = this.state.imageList;
list.push(<ImageVoteItem />);
this.setState({
imageList: list
})
}
render() {
return (
<div className="padding5px margin_bottom10px">
{list}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
试试这个...
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
images: []
}
}
_renderComponent(){
let images = this.state.images;
images.push(<ImageVoteItem key={images.length+1}/>);
this.setState({
images: images
});
}
render() {
return (
<div className="padding5px margin_bottom10px">
{this.state.images}
<div className="image_add_btn border" onClick={this._renderComponent()}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
我有一个名为 <ImageVoteItem/>
的 ReactJS 组件。我有一个名为 'Add Option'
的按钮。当我单击此按钮时,应该会出现 <ImageVoteItem/>
。当我再次单击该按钮时,应该会出现另一个 <ImageVoteItem/>
组件。
我已经使用状态完成了此操作。但是我只能渲染一个 <ImageVoteItem/>
组件。每当我单击 'Add Option'
按钮时,如何一遍又一遍地渲染相同的组件?
我的class
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
addOption: false,
}
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState({
addOption: true,
})
}
render() {
return (
<div className="padding5px margin_bottom10px">
<ImageVoteItem/>
<ImageVoteItem/>
{this.state.addOption ? <ImageVoteItem/> : null}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
不要使用 bool
,而是使用一个数值来存储 ImageVoteItem
的计数(您要渲染该组件的次数)。然后在该状态值上使用 map
来呈现 ImageVoteItem
组件。
像这样:
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
count: 1,
}
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState((prevState) => {
return {count: prevState.count + 1}
})
}
_renderComponent(){
let count = this.state.count, uiItems = [];
while(count--)
uiItems.push(<ImageVoteItem key={el}/>)
return UiItems;
}
render() {
return (
<div className="padding5px margin_bottom10px">
{this._renderComponent()}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
我为您添加另一个选项作为maxImage。如果您定义任何最大图像值,您可以向其添加更多图像组件。 在 return 渲染之前,您可以使用循环将图像列表定义为数组,您可以在渲染元素中使用它。
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
addOption: 0,
maxImage:10
}
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState((prevState)=>({
addOption: ++prevState.addOption,
})
}
render() {
let list = []
for(var i =0 ;i<=this.state.maxImage;i++){
list.push(<div>{this.state.addOption>i&&
<ImageVoteItem/>}</div>)
}
return (
<div className="padding5px margin_bottom10px">
{list}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
如果你不想要任何限制,你也可以使用这个:
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
imageList: []
}
this.addOption = this.addOption.bind(this);
}
addOption() {
let list = this.state.imageList;
list.push(<ImageVoteItem />);
this.setState({
imageList: list
})
}
render() {
return (
<div className="padding5px margin_bottom10px">
{list}
<div className="image_add_btn border" onClick={this.addOption}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}
试试这个...
class ImageVotePost extends Component {
constructor() {
super();
this.state = {
images: []
}
}
_renderComponent(){
let images = this.state.images;
images.push(<ImageVoteItem key={images.length+1}/>);
this.setState({
images: images
});
}
render() {
return (
<div className="padding5px margin_bottom10px">
{this.state.images}
<div className="image_add_btn border" onClick={this._renderComponent()}>
<div className="width_100 relative_position">
<img src={plus} className="plus_icon"/>
<a className="add_opt_text">Add Option</a>
</div>
<input type="file" id="src" className="filetype2"/>
</div>
</div>
)
}
}