2015-11-12 22 views
10

Chế độ xem danh sách gốc phản hồi: Hàng không hiển thị lại sau khi trạng thái nguồn dữ liệu đã thay đổi.Hàng ListView gốc phản hồi không hiển thị lại sau khi thay đổi trạng thái

Đây là một phiên bản đơn giản của mã của tôi:

render(): { 
    return <ListView 
    dataSource={this.state.DS} 
    renderRow={this.renderRow}/> 
} 

renderRow(item): { 
    return <TouchableOpacity onPress={() => this.handlePress(item)}> 
    {this.renderButton(item.prop1)} 
    </TouchableOpacity> 
} 

renderButton(prop1): { 
    if (prop1 == true) { 
    return <Text> Active </Text> 
    } else { 
    return <Text> Inactive </Text> 
    } 
} 

handlePress(item): { 
    **Change the prop1 of *item* in an array (clone of dataSource), then** 
    this.setState({ 
    DS: this.state.DS.cloneWithRows(arrayFromAbove) 
    }) 
} 

Theo ví dụ của Facebook, ListView được coi rerender mọi nguồn dữ liệu thời gian được thay đổi. Có phải vì tôi chỉ thay đổi thuộc tính của một mục trong nguồn dữ liệu? Có vẻ như hàm renderRow không hiển thị lại, nhưng hàm render() là từ thay đổi nguồn dữ liệu.

Cảm ơn bạn.

Trả lời

1

Trước tiên, bạn cần đặt datasource trong hàm getInitialState. Sau đó, thay đổi nguồn dữ liệu bằng cách gọi this.setState({}) và chuyển qua nguồn dữ liệu mới. Dường như bạn có thể đã đi đúng hướng ở trên, nhưng tôi đã thiết lập một ví dụ làm việc của thay đổi các ListView nguồn dữ liệu here. Tôi hy vọng điều này sẽ giúp

https://rnplay.org/apps/r3bzOQ

+1

Cảm ơn đã gợi ý/example! Tôi chắc chắn đã làm như vậy trong dự án của mình. Tôi tin rằng vấn đề là ListView không tái render một hàng khi nguồn dữ liệu là một mảng các đối tượng và chỉ là một thuộc tính của một đối tượng được thay đổi. Giao diện điều khiển cho tôi biết rằng thuộc tính của một đối tượng trong nguồn dữ liệu đã thực sự thay đổi, nhưng ListView không nhận ra nó và không định lại hàng đã thay đổi. Bạn có cách giải quyết có thể cho việc này không? – skleest

+0

Nó sẽ trở lại nếu bạn gọi this.setState. Bạn có thể sao chép vấn đề ở đây không: https://rnplay.org/apps/Dw08-g. –

+0

Chắc chắn, nó được nhân đôi ở đây (https://rnplay.org/apps/1-sNcQ). Có vẻ như nguồn dữ liệu đang thay đổi nhưng hàm renderRow không chạy. Cảm ơn bạn. – skleest

6

phản ứng là đủ thông minh để phát hiện những thay đổi trong nguồn dữ liệu và nếu danh sách cần được tái tạo hình. Nếu bạn muốn cập nhật listView, hãy tạo các đối tượng mới thay vì cập nhật các thuộc tính của các đối tượng hiện có. Mã này sẽ giống như thế này:

let newArray = this._rows.slice(); 
newArray[rowID] = { 
    ...this._rows[rowID], 
    newPropState: true, 
}; 
this._rows = newArray; 

let newDataSource = this.ds.cloneWithRows(newArray); 
this.setState({ 
    dataSource: newDataSource 
}); 

Bạn có thể đọc thêm về tương tự issue on Github

Các vấn đề liên quan