Gewusst wie: filtern von Daten im ListView Reagieren-native?
Ich versuche, meine filter array-Objekt-Liste und dann versucht, die Anzeige in der ListView mit neuer Datenquelle. Die Liste ist jedoch nicht immer gefiltert. Ich weiß, dass meine filter-Funktion ordnungsgemäß funktioniert. ( Ich habe es in die Konsole.log )
Bin ich mit Redux map, meinen Zustand zu stützen. Und dann versuchen zu filtern prop. Ist das der falsche Weg?
Hier ist mein code:
/*global fetch:false*/
import _ from 'lodash';
import React, { Component } from 'react';
import { ListView, Text as NText } from 'react-native';
import { connect } from 'react-redux';
import { Actions } from 'react-native-router-flux';
import {
Container, Header, Item,
Icon, Input, ListItem, Text,
Left, Right, Body, Button
} from 'native-base';
import Spinner from '../common/Spinner';
import HealthImage from '../misc/HealthImage';
import { assetsFetch } from '../../actions';
const ds = new ListView.DataSource({
rowHasChanged: (r1, r2) => r1 !== r2
});
class AssetsList extends Component {
componentWillMount() {
this.props.assetsFetch();
//Implementing the datasource for the list View
this.createDataSource(this.props.assets);
}
componentWillReceiveProps(nextProps) {
//Next props is the next set of props that this component will be rendered with.
//this.props is still equal to the old set of props.
this.createDataSource(nextProps.assets);
}
onSearchChange(text) {
const filteredAssets = this.props.assets.filter(
(asset) => {
return asset.name.indexOf(text) !== -1;
}
);
this.dataSource = ds.cloneWithRows(_.values(filteredAssets));
}
createDataSource(assets) {
this.dataSource = ds.cloneWithRows(assets);
}
renderRow(asset) {
return (
<ListItem thumbnail>
<Left>
<HealthImage health={asset.health} />
</Left>
<Body>
<Text>{asset.name}</Text>
<NText style={styles.nText}>
Location: {asset.location} |
Serial: {asset.serial_number}
</NText>
<NText>
Total Samples: {asset.total_samples}
</NText>
</Body>
<Right>
<Button transparent onPress={() => Actions.assetShow()}>
<Text>View</Text>
</Button>
</Right>
</ListItem>
);
}
render() {
return (
<Input
placeholder="Search"
onChangeText={this.onSearchChange.bind(this)}
/>
<ListView
enableEmptySections
dataSource={this.dataSource}
renderRow={this.renderRow}
/>
);
}
}
const mapStateToProps = state => {
return {
assets: _.values(state.assets.asset),
spinner: state.assets.asset_spinner
};
};
export default connect(mapStateToProps, { assetsFetch })(AssetsList);
Was mache ich hier falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein wenig schwer zu Folgen, was hier Los ist. Ich würde es vereinfacht werden, etwa so:
Ein paar Punkte:
assetFetch
, so sollten Sie sich vielleicht zurück incomponentDidMount
.componentWillMount
zucomponentDidMount
. Es ist zu empfehlen, async HolencomponentDidMount
. Dies kann die Sache, wenn Sie jemals tun, server-side-rendering.Eine Sache, ich habe eine kleine Sorge mit, ist das Muster von abrufen innerhalb einer Komponente, indem es in globalen Zustand, und dann unter Berufung auf diese Komponente zu reagieren, um den globalen Zustand zu ändern. Damit verändernden globalen Zustand wird ein Nebeneffekt der einfach betrachten etwas. Ich nehme an, Sie tun es, weil
assets
ist an anderer Stelle verwendet, und dies ist eine bequeme Punkt zu erfrischen diese von dem server, so dass Sie zeigen sich in anderen Komponenten, die nicht Sie zu Holen. Diese Muster können in der Folge schwer zu findende Fehler.Müssen Sie tun
setState
auslösen machen. Hier ist, wie ich es tun würde -onSearchChange
Recht?