5

在我的反應原生應用程序中,我試圖用複選框顯示我的應用程序聯繫人詳細信息以供選擇。 這裏是我的代碼:在React-native中,如何處理ListView中的複選框?

<ListView 
    dataSource={this.state.dataSource} 
    renderRow={(rowData,sectionID,rowID) => 
    <TouchableHighlight onPress={() => this.goRideDetails(rowData)}> 
     <Text style={styles.rideHeader}>{rowData.name} </Text> 
     <CheckBox checked={this.state.checked} onCheckBoxPressed={()=>this.setState({checked:!this.state.checked})}/> 
    </TouchableHighlight> 
}/> 

在我看來複選框被顯示在每一行,但不工作。

任何人都可以幫助我。提前感謝。

+0

您是否希望每一行都有自己的複選框狀態,以便可以單獨檢查/取消選中每個行框? 「......但不工作」是什麼意思......它在做什麼? – rmevans9

+0

感謝您的回覆,是的,我想要的,正是你所說的。複選框狀態不更新,並且當我按下複選框時,複選框未被選中/取消選中。 – neelima

回答

3

您可以使用組件分離輕鬆完成此操作。請看看這裏:

export default class ContactList extends Component { 

    static propTypes = { 
     contacts: React.PropTypes.array, 
    } 

    static defaultProps = { 
     contacts: [], 
    } 

    constructor(){ 
     super(); 
     this._renderRow = this._renderRow.bind(this); 
    } 

    _renderRow(rowData,sectionID,rowID) { 
     return <Contact info={ rowData } />; 
    } 

    render() { 
     return (
      <ListView 
       dataSource={ this.props.contacts } 
       renderRow={ this._renderRow } 
      /> 
     ); 
    } 
} 

export class ContactList extends Component { 
    static propTypes = { 
     info: React.PropTypes.object.isRequired, 
    } 

    constructor(){ 
     super(); 
     this.goRideDetails = this.goRideDetails.bind(this); 
     this.setChecked = this.setChecked.bind(this); 
    } 

    goRideDetails() { 
     //your logic here 
    } 

    setChecked() { 
     this.props.info.checked = !this.props.info.checked; //will be much better to do it with redux and action creators 
    } 

    render() { 
     return (
      <TouchableHighlight onPress={ this.goRideDetails }> 
       <Text style={ styles.rideHeader }>{this.props.info.name} </Text> 
       <CheckBox checked={ this.props.info.checked } onCheckBoxPressed={ this.setChecked } /> 
      </TouchableHighlight> 
     ); 
    } 
} 

之後,你可以簡單地調用:

<ContactList contacts={this.state.dataSource} /> 
在JSX瞧

重要說明:請勿在jsx代碼塊中使用數組函數。

重要說明2:嘗試開始使用redux或flux來存儲應用程序的狀態。它將提供更好的代碼設計。

希望,這將有所幫助。

+0

嗨亞歷克斯貝萊斯,感謝您的答案,但複選框沒有選中/ unchecked.I的意思是,當我給最初flase,複選框顯示未經檢查,當我按下/點擊它,複選框的值更改爲true,但仍復選框顯示未經檢查。 – neelima

+0

我在{this.setState({checked:!this.state.checked})中對setChecked方法做了一些更改。現在工作正常。非常感謝Alex – neelima

+0

嗨Neelima,你已經做了什麼更改來更新用於檢查/取消選中的UI。你能幫忙嗎?我非常堅持這一點。 – PK86