将 navigation.navigate 传递给子组件 [英] Pass navigation.navigate to Child Component
问题描述
使用 react-navigation 构建应用程序.我有一个从 firebase 中提取并在列表视图中呈现数据的父组件.列表视图渲染组件ListName"有一个 onRowPress 函数,但是 this.props.navigation.navigate 出现未定义,因为导航不在该子组件的状态.
Building an app using react-navigation. I have a parent component that pulls from firebase and renders data in a listview. The listview render component 'ListName' has an onRowPress function but this.props.navigation.navigate comes up undefined because navigation is not in that child component's state.
我尝试了多种方法将导航道具传递给孩子,并从孩子的反应导航中导入导航.没有任何效果.
Ive tried multiple ways of passing in navigation prop to the child and also importing navigation from react-navigation within the child. Nothing works.
谢谢!
这是我的 rootStackNavigator:
Here is my rootStackNavigator:
const RootStackNavigator = StackNavigator(
{
Login: { screen: LoginScreen },
Main: { screen: MainTabNavigator },
Feedback: { screen: ProvideInstanceScreen }
},
{
navigationOptions: () => ({
//headerTitleStyle: {
//fontWeight: 'normal',
tabBarVisible: false,
header: null
//},
}),
}
);
这是我的父组件(其状态为 navigation.navigate)
Here is my Parent Component (which has navigation.navigate in its state)
import React from 'react';
import { ListView, StyleSheet, Text, Image } from 'react-native';
import { connect } from 'react-redux';
import _ from 'lodash';
import { MainButton, GenSection } from '../components/common';
import { namesFetch } from '../actions';
import ListName from '../components/ListName.js';
class ProvideScreen extends React.Component {
static navigationOptions = {
header: null,
};
componentWillMount() {
//console.log('HOME HOME HOME PRINT', this.props)
this.props.namesFetch();
this.createDataSource(this.props);
}
componentDidMount() {
console.log('PROVIDE PROPS PRINT', this.props)
this.createDataSource(this.props);
}
componentWillReceiveProps(nextProps) {
//nextProps are next set of props component is rendered with and this.props is still old props
console.log('NEXT PROPS', nextProps)
this.createDataSource(nextProps);
}
createDataSource({ names }) {
var namesArray = names.map(function(a) {return [a.name, a.uid];});
//console.log('NAMES ARRAY PRINT', namesArray)
const ds = new ListView.DataSource({
rowHasChanged: (r1, r2) => r1 !== r2
});
this.dataSource = ds.cloneWithRows(namesArray);
}
renderRow(user) {
return <ListName name={user[0]} />;
}
render() {
return (
<Image
source={require('../components/images/mainBG.png')}
style={styles.containerStyle}>
<Text style={styles.textStyle}>
Provide Feedback
</Text>
<GenSection style={{paddingTop: 8}} />
<ListView
enableEmptySections
dataSource={this.dataSource}
renderRow={this.renderRow}
removeClippedSubviews={false}
/>
</Image>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 15,
backgroundColor: '#fff',
},
containerStyle: {
flex: 1,
width: undefined,
height: undefined,
backgroundColor:'transparent'
},
textStyle:
{
paddingTop: 20,
paddingLeft: 12,
fontSize: 32,
fontWeight: '200',
color: '#597abc'
}
});
const mapStateToProps = state => {
//console.log('STATE PRINT', state.feedbackInput)
const names = _.map(state.feedbackInput, (val) => {
return { ...val};
});
//console.log('NAMES PRINT', names)
return { names };
}; //this is lodash .map iterates over key value pairs and run function which assigns data to groups array
export default connect(mapStateToProps, { namesFetch })(ProvideScreen);
这是我的子组件(状态中没有 navigation.navigate):
Here is my child component (which does not have navigation.navigate in state):
import React, { Component } from 'react';
import { Text, TouchableWithoutFeedback, View } from 'react-native';
import { connect } from 'react-redux';
import { ListButton } from './common';
class ListName extends Component {
onRowPress() {
console.log('ON ROW PRESS PRINT', this.props)
this.props.navigation.navigate('Feedback', this.props);
}
componentDidMount() {
//console.log('LIST NAME LIST NAME PRINT', this.props)
}
render() {
const name = this.props.name;
//console.log('LISTNAME PRINT', name)
return (
<TouchableWithoutFeedback onPress={this.onRowPress.bind(this)}>
<View>
<ListButton>
<Text style={styles.titleStyle}>
{name}
</Text>
</ListButton>
</View>
</TouchableWithoutFeedback>
);
}
}
const styles = {
titleStyle: {
alignSelf: 'center',
color: '#fff',
fontSize: 16,
fontWeight: '600',
}
};
const mapStateToProps = state => {
//console.log('NAMES PRINT', names)
return state
}; //this is lodash .map iterates over key value pairs and run function which assigns data to groups array
export default connect(mapStateToProps)(ListName);
推荐答案
基于 React Navigation:https://reactnavigation.org/docs/en/connecting-navigation-prop.html
Base on React Navigation: https://reactnavigation.org/docs/en/connecting-navigation-prop.html
您只需要将 withNavigation 导入到子组件中即可.
You just need to import withNavigation into child component only.
import { withNavigation } from 'react-navigation';
然后导出:
export default withNavigation(<YourChildComponent>);
这篇关于将 navigation.navigate 传递给子组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!