2016-10-18 95 views
0

多個組件我知道如何通過更改狀態來添加和刪除單個組件。但如果你有多個組件要刪除,這種方式不會工作。例如,讓我說我有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中特定行的按鈕。

有什麼建議嗎?

回答

1

感謝Giorgos,我爲自己的問題找到了解決方案。我在組件內創建了一個帶有隱藏功能的獨立組件。現在我可以在視圖或列表視圖中的任何位置添加此組件,當我點擊它時,它將隱藏。請記住,這隻會隱藏組件並且不會卸載組件。

這只是一個例子,所以我創建了一個按鈕組件。

我的按鈕組件:

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> 
    ); 
    } 
+0

這是一個很好的方法 - 允許您在沒有額外代碼的情況下重用按鈕。我很高興我幫了忙。 – George

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

希望這會有所幫助。

+0

謝謝回答。但如果我渲染100個視圖呢? (我不會創建100這是例如目的)這是否意味着我需要創建100個狀態對象來處理所有100個?假設我沒有使用視圖。如果我創建一個按鈕組件,並且當我點擊它時想移除按鈕組件,該怎麼辦?我會做那樣的事嗎? –

+0

如果你渲染100個視圖,那麼我假定你在一個ListView中渲染它們,所以我給出的第二個例子應該是你的指南。關於按鈕,是的,它也是相同的邏輯。請記住,在React Native中,與原生Android和iOS不同,您不能簡單地隱藏和顯示視圖。你必須呈現或不呈現。觸發一個新的'render()'的方法是使用'setState()'。如果您還有其他問題,請告訴我。 – George

+0

ListView方式不會以我需要的方式工作。但是我發現我想達到的目標。我發佈了我的答案。我仍然獎勵你的賞金,但只能在18小時內完成。謝謝您的幫助。 –