reactjs - 使用 React Navigation 将道具从 StackNavigator 传递到屏幕
问题描述
我正在尝试使用 AsyncStorage 加载设置并将一些道具设置到下一个屏幕。我使用sortBy
值对数据库结果进行排序。
如果我从 App 传递道具,screenProps
它会导致更多渲染,因为sortBy
加载值需要时间。由于AuthLoadingScreen
决定了要渲染的内容,我想通过将道具直接传递给 MainList 来减少渲染的数量
AuthLoadingScreen.js
export default class AuthLoadingScreen extends Component {
constructor(props) {
super(props);
this._bootstrapAsync();
}
// Fetch the token from storage then navigate to our appropriate place
_bootstrapAsync = async () => {
const userToken = await AsyncStorage.getItem('token');
const sortValue = await AsyncStorage.getItem('sortBy');
if (userToken) {
this.props.navigation.navigate('App',{"sortBy":sortValue}); // I can't send this back to MainList of AppStack
} else {
this.props.navigation.navigate('Onboarding');
}
};
render() {
return (
<View>
<ActivityIndicator />
<StatusBar barStyle="default" />
</View>
);
}
}
应用程序.js
export default class App extends Component<Props> {
render() {
return (
<Root>
<AppContainer/>
</Root>
);
}
}
const AppStack = createStackNavigator(
{
MainList: {
screen: MainListScreen // how to pass props from AppStack to MainListScreen ?
},
Settings: {
screen: Settings,
}
},
{
initialRouteName:"MainList",
defaultNavigationOptions: () => ({
headerStyle: {
backgroundColor: '#2196f3'
},
headerTintColor: 'white'
})
}
);
const AppNavigator = createSwitchNavigator(
{
AuthLoading: AuthLoadingScreen,
Onboarding:Onboarding,
App: AppStack, //logged in users
},
{
initialRouteName: 'AuthLoading',
}
);
const AppContainer = createAppContainer(AppNavigator);
解决方案
你可以尝试这样的事情:
AuthLoadingScreen.js
_bootstrapAsync = async () => {
const userToken = await AsyncStorage.getItem('token');
const sortBy = await AsyncStorage.getItem('sortBy');
if (userToken) {
this.props.navigation.navigate('App', { sortBy })
} else {
this.props.navigation.navigate('Onboarding');
}
};
然后在 MainListScreen 文件中访问sortBy
如下:
MainListScreen.js
this.props.navigation.state.params.sortBy
推荐阅读
- javascript - React:如何组合 Material-UI 中标记的每个多个样式
- django - zappa 部署的 aws lambda 无法连接到远程数据库
- python - 使用 selenium 禁用网站中出现的叠加层
- audio - 使用视频编辑器加快视频播放速度
- debugging - 每次调用函数时如何访问函数的调用位置?
- javascript - 如何读入具有 href 的 id 元素
- docker - 无法使用“仅/除:更改”创建 CI 管道
- json - 如何在 Angular 应用程序渲染中将对象传递给 @Input 作为 StoryBook 中的故事
- ruby-on-rails - Rails 参数数量错误(给定 1,预期为 0)
- reactjs - 使用 React.createRef() 创建的子组件引用的所有属性在 componentDidMount 方法中未定义