react native 在未呈现时运行组件代码
react native runs component code while it's not rendered
我有登录页面和用户页面。
当我使用 LoginPage 启动应用程序时,UserPage 运行s 上的代码也是如此。
我需要在用户页面输入时获取用户数据。
所以我在 UserPage 上的 componentWillMount 函数上调度 fetchUserData 操作。
componentWillMount(){
let props = this.props;
props.fetchUserData(props.navigation.state.params.userId);
}
众所周知,在登录之前我们永远不会"params.userId"处于导航状态。
但是当我启动应用程序时,UserPage 运行s 上的代码没有任何 userId。
我遇到了未定义的错误。
所以我在 UserPage
中做了类似的事情
componentWillMount(){
let props = this.props;
if(props.navigation.state.params)
props.fetchUserData(props.navigation.state.params.userId);
}
但我不明白为什么要这样做
通常情况下,如果您不导航到该页面,
页面上的代码不应该运行。
听说react native check code before starting an app,
这真的是因为那个吗?
问题已更新
好的,我会添加更多详细信息。
首先,这是我的导航器配置
//this is my auth navigator which contains login and sign up page
export default AuthNavigator = StackNavigator({
Login: {screen: LoginPage},
SignUp: {screen: ModalSignUp}
},{mode: "modal"});
//this is tab navigator configuration which will be shown after log in
const generalStacks = {
UserPage: {screen: UserPage}
};
const FeedStacks = StackNavigator({
FeedPage:{screen:FeedPage}, ...generalStacks
});
const MyPageStacks = StackNavigator({
...generalStacks
});
const Tabs = TabNavigator({
FeedTab : {
screen: FeedStacks
},
MyPageTab : {
screen: MyPageStacks,
}
}
});
const modals = {
ModalUserProfile: { screen: ModalManageUserProfile },
};
export default RootNavigator = StackNavigator({
Tabs: {screen: Tabs},
...modals
},{mode: "modal"});
// and I wrap AuthNavigator, RootNavigator in AppNavigator
const AppNavigator = StackNavigator({
AuthNavigator: {screen: AuthNavigator},
RootNavigator: {screen: RootNavigator}
});
实际上,我是在登录后遇到这个问题的。
当我进入 RootNavigator 中的 FeedTab 时。
FeedStacks 包含 FeedPage 和 UserPage。
所以问题是当我进入 FeedPage 时 UserPage 运行s 上的代码。
这就是我呈现用户页面的方式
class UserPage extends Component{
componentWillMount(){
let props = this.props;
if(props.navigation.state.params){
props.fetchUserBooks(props.navigation.state.params.id);
}
}
render(){
let props = this.props;
let userId, userPage;
if(props.navigation.state.params && props.userPages[props.navigation.state.params.id]){
userId = props.navigation.state.params.id;
userPage = props.userPages[userId];
return (
<View>
<UserData user={userPage.user}/>
</View>
)
}else{
return <View><Text>isFetching</Text></View>;
}
}
}
const mapStateToUserPageProps = (state) => {
return {
userPages : state.userPages
}
};
const mapDispatchToUserPageProps = (dispatch) => {
return {
fetchUserBooks: (userId) => {dispatch(fetchUserData(userId));}
}
};
export default connect(mapStateToUserPageProps, mapDispatchToUserPageProps)(UserPage);
默认情况下,TabNavigator 同时加载其所有子组件。
目前,有一个选项 lazy
可以告诉您是在需要时渲染每个组件,还是预先渲染每个组件。将 lazy
设置为 true 时,您可以在滑动时看到组件渲染。它在 docs.
我建议你试试:
const Tabs = TabNavigator(
{
FeedTab : {
screen: FeedStacks
},
MyPageTab : {
screen: MyPageStacks,
}
}
},
{
lazy: true
}
);
我有登录页面和用户页面。
当我使用 LoginPage 启动应用程序时,UserPage 运行s 上的代码也是如此。
我需要在用户页面输入时获取用户数据。
所以我在 UserPage 上的 componentWillMount 函数上调度 fetchUserData 操作。
componentWillMount(){
let props = this.props;
props.fetchUserData(props.navigation.state.params.userId);
}
众所周知,在登录之前我们永远不会"params.userId"处于导航状态。
但是当我启动应用程序时,UserPage 运行s 上的代码没有任何 userId。
我遇到了未定义的错误。
所以我在 UserPage
中做了类似的事情componentWillMount(){
let props = this.props;
if(props.navigation.state.params)
props.fetchUserData(props.navigation.state.params.userId);
}
但我不明白为什么要这样做
通常情况下,如果您不导航到该页面,
页面上的代码不应该运行。
听说react native check code before starting an app,
这真的是因为那个吗?
问题已更新
好的,我会添加更多详细信息。 首先,这是我的导航器配置
//this is my auth navigator which contains login and sign up page
export default AuthNavigator = StackNavigator({
Login: {screen: LoginPage},
SignUp: {screen: ModalSignUp}
},{mode: "modal"});
//this is tab navigator configuration which will be shown after log in
const generalStacks = {
UserPage: {screen: UserPage}
};
const FeedStacks = StackNavigator({
FeedPage:{screen:FeedPage}, ...generalStacks
});
const MyPageStacks = StackNavigator({
...generalStacks
});
const Tabs = TabNavigator({
FeedTab : {
screen: FeedStacks
},
MyPageTab : {
screen: MyPageStacks,
}
}
});
const modals = {
ModalUserProfile: { screen: ModalManageUserProfile },
};
export default RootNavigator = StackNavigator({
Tabs: {screen: Tabs},
...modals
},{mode: "modal"});
// and I wrap AuthNavigator, RootNavigator in AppNavigator
const AppNavigator = StackNavigator({
AuthNavigator: {screen: AuthNavigator},
RootNavigator: {screen: RootNavigator}
});
实际上,我是在登录后遇到这个问题的。
当我进入 RootNavigator 中的 FeedTab 时。
FeedStacks 包含 FeedPage 和 UserPage。
所以问题是当我进入 FeedPage 时 UserPage 运行s 上的代码。
这就是我呈现用户页面的方式
class UserPage extends Component{
componentWillMount(){
let props = this.props;
if(props.navigation.state.params){
props.fetchUserBooks(props.navigation.state.params.id);
}
}
render(){
let props = this.props;
let userId, userPage;
if(props.navigation.state.params && props.userPages[props.navigation.state.params.id]){
userId = props.navigation.state.params.id;
userPage = props.userPages[userId];
return (
<View>
<UserData user={userPage.user}/>
</View>
)
}else{
return <View><Text>isFetching</Text></View>;
}
}
}
const mapStateToUserPageProps = (state) => {
return {
userPages : state.userPages
}
};
const mapDispatchToUserPageProps = (dispatch) => {
return {
fetchUserBooks: (userId) => {dispatch(fetchUserData(userId));}
}
};
export default connect(mapStateToUserPageProps, mapDispatchToUserPageProps)(UserPage);
默认情况下,TabNavigator 同时加载其所有子组件。
目前,有一个选项 lazy
可以告诉您是在需要时渲染每个组件,还是预先渲染每个组件。将 lazy
设置为 true 时,您可以在滑动时看到组件渲染。它在 docs.
我建议你试试:
const Tabs = TabNavigator(
{
FeedTab : {
screen: FeedStacks
},
MyPageTab : {
screen: MyPageStacks,
}
}
},
{
lazy: true
}
);