想将ListView与TabBar结合使用
用官网的demo,结果发现ListView不能加载
经过测试,发现应该是最外层的<div>
导致的,最外层的<div>
是让tabbar置于页面底部的
初学前端,求大神指点~ 谢谢~
代码如下:
const data = [
{
img: 'https://zos.alipayobjects.com/rmsportal/dKbkpPXKfvZzWCM.png',
title: 'Meet hotel',
des: '不是所有的兼职汪都需要风吹日晒',
},
{
img: 'https://zos.alipayobjects.com/rmsportal/XmwCzSeJiqpkuMB.png',
title: 'McDonald\'s invites you',
des: '不是所有的兼职汪都需要风吹日晒',
},
{
img: 'https://zos.alipayobjects.com/rmsportal/hfVtzEhPzTUewPm.png',
title: 'Eat the week',
des: '不是所有的兼职汪都需要风吹日晒',
},
];
const NUM_ROWS = 20;
let pageIndex = 0;
function genData(pIndex = 0) {
const dataBlob = {};
for (let i = 0; i < NUM_ROWS; i++) {
const ii = (pIndex * NUM_ROWS) + i;
dataBlob[`${ii}`] = `row - ${ii}`;
}
return dataBlob;
}
class Demo extends React.Component {
constructor(props) {
super(props);
const dataSource = new ListView.DataSource({
rowHasChanged: (row1, row2) => row1 !== row2,
});
this.state = {
dataSource,
isLoading: true,
};
}
componentDidMount() {
// you can scroll to the specified position
// setTimeout(() => this.lv.scrollTo(0, 120), 800);
// simulate initial Ajax
setTimeout(() => {
this.rData = genData();
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rData),
isLoading: false,
});
}, 600);
}
// If you use redux, the data maybe at props, you need use `componentWillReceiveProps`
// componentWillReceiveProps(nextProps) {
// if (nextProps.dataSource !== this.props.dataSource) {
// this.setState({
// dataSource: this.state.dataSource.cloneWithRows(nextProps.dataSource),
// });
// }
// }
onEndReached = (event) => {
// load new data
// hasMore: from backend data, indicates whether it is the last page, here is false
if (this.state.isLoading && !this.state.hasMore) {
return;
}
console.log('reach end', event);
this.setState({ isLoading: true });
setTimeout(() => {
this.rData = { ...this.rData, ...genData(++pageIndex) };
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.rData),
isLoading: false,
});
}, 1000);
}
render() {
const separator = (sectionID, rowID) => (
<div
key={`${sectionID}-${rowID}`}
style={{
backgroundColor: '#F5F5F9',
height: 8,
borderTop: '1px solid #ECECED',
borderBottom: '1px solid #ECECED',
}}
/>
);
let index = data.length - 1;
const row = (rowData, sectionID, rowID) => {
if (index < 0) {
index = data.length - 1;
}
const obj = data[index--];
return (
<div key={rowID} style={{ padding: '0 15px' }}>
<div
style={{
lineHeight: '50px',
color: '#888',
fontSize: 18,
borderBottom: '1px solid #F6F6F6',
}}
>{obj.title}</div>
<div style={{ display: '-webkit-box', display: 'flex', padding: '15px 0' }}>
<img style={{ height: '64px', marginRight: '15px' }} src={obj.img} alt="" />
<div style={{ lineHeight: 1 }}>
<div style={{ marginBottom: '8px', fontWeight: 'bold' }}>{obj.des}</div>
<div><span style={{ fontSize: '30px', color: '#FF6E27' }}>{rowID}</span>¥</div>
</div>
</div>
</div>
);
};
return (
<div style={{ position: 'fixed', height: '100%', width: '100%', top: 0 }}>
<TabBar
unselectedTintColor="#929292"
tintColor="#ff0000"
barTintColor="#f7f7f7"
>
<TabBar.Item
title="商城"
key="Home"
icon={
<i className="iconfont icon-5gouwudai2" />
}
selectedIcon={
<i className="iconfont icon-5gouwudai2" />
}
selected={this.state.selectedTab === 'homeTab'}
onPress={() => {
this.setState({
selectedTab: 'homeTab',
});
}}
>
<ListView
ref={el => this.lv = el}
dataSource={this.state.dataSource}
renderHeader={() => <span>header</span>}
renderFooter={() => (<div style={{ padding: 30, textAlign: 'center' }}>
{this.state.isLoading ? 'Loading...' : 'Loaded'}
</div>)}
renderRow={row}
renderSeparator={separator}
className="am-list"
pageSize={4}
useBodyScroll
onScroll={() => { console.log('scroll'); }}
scrollRenderAheadDistance={500}
onEndReached={this.onEndReached}
onEndReachedThreshold={10}
/>
</TabBar.Item>
<TabBar.Item
title="我的"
key="Mine"
icon={
<i className="iconfont icon-gerenzhongxin" />
}
selectedIcon={
<i className="iconfont icon-gerenzhongxin" />
}
selected={this.state.selectedTab === 'mineTab'}
onPress={() => {
this.setState({
selectedTab: 'mineTab',
});
}}
>
{/* 个人中心 */}
个人中心
</TabBar.Item>
</TabBar>
</div>
);
}
}
ReactDOM.render(<Demo />, document.getElementById('root'));
你把ref={el => this.lv = el}改成 ref={el => { this.lv = el; return this.lv }}试试,你如果放在TabBar里面,ListView要用自定义容器,不能使用body的。