以本机方式删除多个组件

时间:2016-10-18 10:57:43

标签: android ios reactjs react-native

我知道如何通过更改状态来添加和删除单个组件。但是,如果要删除多个组件,这种方式将无法工作。例如,假设我有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中该特定行的按钮。

有什么建议吗?

2 个答案:

答案 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
    })
  }

希望这有帮助。