我知道如何通过更改状态来添加和删除单个组件。但是,如果要删除多个组件,这种方式将无法工作。例如,假设我有3个视图。如何点击它们时如何删除它们。
示例代码:
class Example extends Component {
render(){
return (
<View>
<View>
<TouchAbleOpacity onPress={() => this.removeView()}>
<Text>Remove View 1</Text>
</TouchAbleOpacity>
</View>
<View>
<TouchAbleOpacity onPress={() => this.removeView()}>
<Text>Remove View 2</Text>
</TouchAbleOpacity>
</View>
<View>
<TouchAbleOpacity onPress={() => this.removeView()}>
<Text>Remove View 3</Text>
</TouchAbleOpacity>
</View>
</View>
)
}
removeView(){
}
}
另一个例子是我有一个带有按钮的ListView。这些是邀请用户的按钮。当我单击按钮时,我想隐藏ListView中该特定行的按钮。
有什么建议吗?
答案 0 :(得分:3)
感谢Giorgos,我为自己的问题找到了解决方案。我在组件内部创建了一个带隐藏功能的独立组件。现在我可以在视图或listView中的任何位置添加此组件,当我单击它时它将隐藏。请记住,这只隐藏组件而不会卸载它。
这只是一个例子,所以我创建了一个按钮组件。
我的按钮组件:
class ButtonComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
hide:false
}
}
render() {
return (
<View style={styles.container}>
{this.renderButtonComponent()}
</View>
);
}
renderButtonComponent(){
if(!this.state.hide){
return (
<TouchableOpacity onPress={this.hide.bind(this)}>
<Text>Button</Text>
</TouchableOpacity>
);
}
}
hide(){
this.setState({
hide:true
});
}
}
在我的视图中,我只渲染我的组件:
render() {
return (
<View style={styles.container}>
<ButtonComponent/>
<ButtonComponent/>
<ButtonComponent/>
</View>
);
}
答案 1 :(得分:2)
您必须使用组件的状态。每当您致电setState
时,组件的render()
功能将再次被触发。根据当前状态,您可以决定要显示什么,不显示什么。例如:
class Example extends Component {
constructor(props){
// initialize state
this.state = {
isView1Visible: true,
isView2Visible: true,
isView2Visible: true
}
}
render(){
return (
<View>
{ this.renderView1() }
{ this.renderView2() }
{ this.renderView3() }
</View>
)
}
renderView1(){
if(this.state.isView1Visible){
return (
<View>
<TouchAbleOpacity onPress={() => this.setState( {isView1Visible: false} )}>
<Text>Remove View 1</Text>
</TouchAbleOpacity>
</View>
)
}
renderView2(){
if(this.state.isView2Visible){
return (
...
)
}
renderView3(){
if(this.state.isView3Visible){
return (
...
)
}
}
在上面的示例中,您将根据当前状态呈现视图。单击该按钮时,您可以通过调用setState()
更新状态,就像我之前提到的那样,它会触发另一个render()
的调用。
使用ListView
方法是相同的但实现略有不同。您需要做的是保存组件状态下的项目列表,每当您想要添加/删除项目时,相应地更新列表,然后使用setState
更新状态。例如,类似于此:
constructor(props) {
super(props);
var list = [ ... ]
const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
this.state = {
dataSource: ds,
items: ds.cloneWithRows(list)
};
}
render() {
return (
<View>
<ListView
dataSource={this.state.items}
renderRow={(rowData) => this.renderRow(rowData) /> } />
</View>
)
}
renderRow(rowData) {
<View>
<TouchAbleOpacity onPress={() => this.updateList()}>
<Text>Remove View 1</Text>
</TouchAbleOpacity>
</View>
}
updateList() {
// do some changes to your list and update the state.
var newItems = ...
this.setState({
items: newItems
})
}
希望这有帮助。