weex-nuke
Version:
基于 Rax 、Weex 的高性能组件体系 ~~
172 lines (160 loc) • 3.72 kB
Markdown
# ListView 基本使用
- order: 0
- title_en: ListView usage
---
```js
<NukePlayGround>
<ListView
renderHeader={func}
renderFooter={func}
renderRow={func}
dataSource={[dataArray]}
style={style}
onEndReached={LoadMore func}
/>
</NukePlayGround>
```
---
```js
/** @jsx createElement */
import { createElement, PureComponent, Component, render } from 'rax';
import View from 'nuke-view';
import Text from 'nuke-text';
import RefreshControl from 'nuke-refresh-control';
import Touchable from 'nuke-touchable';
import ListView from 'nuke-list-view';
const originalData = [];
for (let i = 0; i < 20; i++) {
originalData.push({ id: i, text: '列表项' });
}
class ListItem extends PureComponent {
render() {
const { id, text, onPress } = this.props;
return (
<Touchable
id={`cell_${id}`}
style={styles.cellItem}
onPress={() => {
onPress(id);
}}>
<Text style={styles.itemTextList}>
{text}-{id}
</Text>
</Touchable>
);
}
}
class ListViewDemo extends Component {
constructor() {
super();
this.state = {
data: [...originalData],
isRefreshing: false,
showLoading: true,
refreshText: '↓ 下拉刷新'
};
this.onRefresh = this.onRefresh.bind(this);
this.renderItem = this.renderItem.bind(this);
this.onLoadMore = this.onLoadMore.bind(this);
this.renderHeader = this.renderHeader.bind(this);
this.renderFooter = this.renderFooter.bind(this);
}
onItemPress(index) {
console.log(`clicked ${index}`);
}
onRefresh(e) {
this.setState({
isRefreshing: true,
refreshText: '加载中'
});
setTimeout(() => {
this.setState({
isRefreshing: false,
data: [...originalData],
refreshText: '↓ 下拉刷新'
});
}, 1000);
}
onLoadMore() {
// 模拟网络加载
setTimeout(() => {
this.state.data.push({
id: 'b100',
text: '新数据'
});
this.setState({
data: this.state.data
});
}, 300);
}
renderHeader() {
return (
<RefreshControl style={styles.refresh} refreshing={this.state.isRefreshing} onRefresh={this.onRefresh}>
<Text style={styles.loadingText}>{this.state.refreshText}</Text>
</RefreshControl>
);
}
renderItem(item, index) {
return <ListItem id={item.id} text={item.text} onPress={this.onItemPress} />;
}
renderFooter() {
this.state.showLoading ? (
<View style={[styles.loading]}>
<Text style={styles.loadingText}>加载中...</Text>
</View>
) : null;
}
render() {
const { data } = this.state;
return (
<ListView
renderHeader={this.renderHeader}
renderFooter={this.renderFooter}
renderRow={this.renderItem}
dataSource={data}
style={styles.listContainer}
onEndReached={this.onLoadMore}
/>
);
}
}
const styles = {
listContainer: {
flex: 1
},
cellItem: {
backgroundColor: '#ffffff',
'backgroundColor:active': '#f2f3f7',
height: 160,
flex: 1,
alignItems: 'center',
justifyContent: 'center',
borderBottomWidth: 1,
borderBottomStyle: 'solid',
borderBottomColor: '#e6e7eb'
},
itemTextList: {
fontSize: 32,
color: '#5F646E'
},
refresh: {
height: 80,
width: 750,
backgroundColor: '#cccccc',
justifyContent: 'center',
alignItems: 'center'
},
loading: {
height: 80,
width: 750,
flexDirection: 'row',
backgroundColor: '#cccccc',
alignItems: 'center',
justifyContent: 'center'
},
loadingText: {
color: '#666666'
}
};
render(<ListViewDemo />);
```