【发布时间】:2016-12-30 02:57:16
【问题描述】:
我的 Navigator 有问题...我有 2 个场景,主场景包含一个 ListView,第二个场景包含一个选择列表,允许我过滤主场景的 ListView 的元素...问题是当我从第二个场景返回时,未绘制 ListView 的过滤元素......行显示但它们是空的
我知道它们被显示是因为我用不同的颜色设置了行的样式并且颜色显示正确,我是否必须以某种方式强制渲染 ListView 组件?如果是,我应该怎么做?
这是代码的一些部分(我已经删除了不相关的部分):
class App extends Component {
renderScene(route, navigator) {
switch (route.id) {
case 'Main':
return (<Main navigator={navigator} />);
case 'FilterByBrand':
return (<FilterByBrand navigator={navigator} brands={route.brands} callback={route.callback}/>);
}
}
render () {
return (
<Navigator
initialRoute={{id: 'Main'}}
renderScene={this.renderScene}
/>
);
}
}
--
class Main extends Component {
// code removed (irrelevant)
updateBrands(brands) {
var filter = {};
// code to generate filter to be used not shown, is working ok
this.setState({ brandFilter: filter });
}
render () {
return (
<Container>
<Header>
<Button>
<Icon name='md-pricetags'
onPress={()=>this.props.navigator.push({
id: 'FilterByBrand',
brands: this.state.brands,
callback: this.updateBrands}
)}
/>
</Button>
</Header>
<Content>
<ProdList
item={this.state.items}
brandFilter={this.state.brandFilter}
/>
</Content>
</Container>
);
}
}
--
class ProdList extends Component {
constructor(props) {
super(props);
this.dataSource = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this._filter = this._filter.bind(this);
this._genRow = this._genRow.bind(this);
}
_genRow(item) {
// code not shown (irrelevant)
}
_filter() {
let output = this.props.items;
// filtering code not shown, working ok
return output;
}
render() {
var dataSource = this.dataSource.cloneWithRows(this._filter());
return (
<ListView
style={styles.container}
dataSource={dataSource}
renderRow={this._genRow}
enableEmptySections={true}
/>
);
}
}
--
class FilterByBrand extends Component {
selectBrand(id) {
brands = // save here the selected brands
// callback
this.props.callback(brands);
this.setState({brands: brands});
}
render () {
return (
<Container>
<Header>
<Button transparent onPress={()=>this.props.navigator.pop()}>
<Icon name='ios-arrow-back' />
</Button>
<Title>Select brand(s)</Title>
</Header>
<Content>
<List
dataArray={this.state.brands}
renderRow={ (brand) =>
<ListItem onPress={() => this.selectBrand(brand.id)}>
<Text>{brand.name}</Text>
</ListItem>
}
/>
</Content>
</Container>
);
}
}
【问题讨论】:
-
我认为可能与未正确定义
_genRow函数参数有关。根据here 所述的文档,参数为(rowData, sectionID, rowID, highlightRow)。 -
你在哪里将 paints 属性传递给 ProdList 组件?还是您没有显示该代码?我只看到brandFilter 被传递给ProdList
-
coder hacker:我已经编辑了代码来解决这个问题(我在删除部分代码发布到这里时出错了,但是函数_filter工作得很好)
-
max23: 我不明白为什么 _genRow 参数是错误的......主 ListView 的行最初显示正确......它只在应用过滤器后才会中断......你介意吗告诉我怎么了?
-
对不起,
item参数等于rowData参数。如果您不使用其他 3 个参数(例如sectionID等),我认为应该没问题。对了,能不能把_genRow函数里的代码显示一下?
标签: listview react-native navigator