简而言之,我正在尝试学习如何使用redux。顾名思义,我正在尝试将redux存储连接到组件,以便它可以用标记(我已经在服务器上获取)填充地图。
我知道我在加载componentWillMount()时已经连接了它。但是这样做会返回对象数组,这不是我真正想要的。
我不知道我说的是否正确,但是如何使它返回可在./Component中使用的状态/道具,以填充地图上的标记?
[EDIT1:我已将更改内容包括在建议的Pritish中]
谢谢。
./屏幕
class FindOnMapScreen extends Component {
constructor(props) {
super(props);
this.state = {
userLocation: null,
plots: []
};
}
getUserLocationHandler = () => {
navigator.geolocation.getCurrentPosition(position => {
this.setState({
userLocation: {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: 0.0622,
longitudeDelta: 0.0421,
}
});
}, err => console.log(err));
};
componentDidMount() {
this.props.onLoadPlacesToMap();
}
render() {
console.warn("props", this.props)
return (
<View style={styles.container}>
<FetchLocation onGetLocation={this.getUserLocationHandler} />
<UsersMap
userLocation={this.state.userLocation}
props={this.props.plots}
/>
</View>
)
}
};
const mapStateToProps = state => {
return {
plots: state.mapPlaces.plots
};
};
const mapDispatchToProps = dispatch => {
return {
onLoadPlacesToMap: () => dispatch(getPlacesOnMap())
};
};
export default connect(mapStateToProps, mapDispatchToProps)(FindOnMapScreen);
./ Component
const usersMap = props => {
let userLocationMarker = null;
if (props.userLocation) {
userLocationMarker = <MapView.Marker coordinate={props.userLocation} />;
}
const plots = props.plots.map(plots => //.. tried to access here
<MapView.Marker
coordinate={plots}
key={plots.id}
/>
);
return (
<View style={styles.mapContainer}>
<MapView
initialRegion={{
latitude: 37.78825,
longitude: -122.4324,
latitudeDelta: 0.0622,
longitudeDelta: 0.0421,
}}
region={props.userLocation}
style={styles.map}
>
{userLocationMarker}
</MapView>
</View>
);
};
./ Store / Actions
export const getPlacesOnMap = () => {
return dispatch => {
dispatch(authGetToken())
.then(token => {
return fetch("myAppURL/file.json?auth=" + token);
})
.catch(() => {
alert("No valid token found!");
})
.then(res => {
if (res.ok) {
return res.json();
} else {
throw(new Error());
}
})
.then(parsedRes => {
const plots = [];
for (let key in parsedRes) {
plots.push({
latitude: parsedRes[key].location.latitude,
longitude: parsedRes[key].location.longitude,
id: key
});
} console.log(plots)
dispatch(mapPlaces(plots));
})
.catch(err => {
alert("Oops! Something went wrong, sorry! :/");
console.log(err);
});
};
};
export const mapPlaces = plots => {
return {
type: MAP_PLACES,
plots: plots
};
};
./ Store / Reducer
const initialState ={
plots: []
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case MAP_PLACES:
return {
...state,
places: action.plots
};
default:
return state;
}
};
./ ConfigureStore
const rootReducer = combineReducers({
mapPlaces: mapPlacesReducer
});
答案 0 :(得分:0)
由于您的组件是无状态组件,因此您可以直接从{{1}向其传递图 props
},并使用this.props
绑定到商店的状态。
mapStateToProps
并在您的组件中,您可以通过componentDidMount {
this.props.onLoadPlacesToMap() // ... Call your prop bound dispatcher func here
}
<UsersMap
userLocation={this.state.userLocation}
plots={this.props.plots}
/>
在化简器中,您需要将props.plots
更改为places
或在父类中类似地映射和映射它们。
plots