问题
I am working on an app and I am using bottomTabNavigator
but in mean time I am getting this warning! ( Look like you're passing an inline function for 'Component' prop for the screen 'Feed' (e.g component={()=><SomeComponent/>)). Passing an inline function will cause the component state to be lost on re-render and cause perf issue since it's re-created every render. You can pass the function as children to 'Screen' instead to achieve the desired behaviour.
I know I am doing something wrong but I didn't figure out what's wrong with my code. I am new to React native, could someone please help me how to solve this warning .
Code
return (
<NavigationContainer>
<Tab.Navigator
initialRouteName="Home"
tabBarOptions={{
activeTintColor: "#e91e63"
}}
>
<Tab.Screen
name="Home"
component={props => (
<PharmacyHome
catId={this.props.navigation.state.params}
{...props}
/>
)}
options={{
tabBarLabel: "Home",
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons name="home" color={color} size={size} />
)
}}
/>
<Tab.Screen
name="Notifications"
component={Notifications}
options={{
tabBarLabel: "Updates",
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons name="bell" color={color} size={size} />
)
}}
/>
<Tab.Screen
name="Profile"
component={Profile}
options={{
tabBarLabel: "Profile",
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons
name="account"
color={color}
size={size}
/>
)
}}
/>
</Tab.Navigator>
</NavigationContainer>
);
回答1:
Move your component definition into a separate line of code
component={props => (
<PharmacyHome
catId={this.props.navigation.state.params}
{...props}
/>
)}
Instead
const YourComponent = props => (
<PharmacyHome catId={this.props.navigation.state.params} {...props} />
);
<Tab.Screen
name="Home"
component={YourComponent}
回答2:
If you need to pass a non-serializable props, such as a function, then you can do this instead:
<Stack.Screen name="Home">
{props => <PharmacyHome catId={this.props.navigation.state.params} {...props} />
</Stack.Screen>
回答3:
I made it work by passing what I wanted through params instead of props. For you, it would look like this:
<Tab.Screen
name="Home"
component={PharmacyHome}
initialParams={{ catId: this.props.navigation.state.params }}
/>
Hope this helps
回答4:
This worked for me, from the documentation:
Use a render callback for the screen instead of specifying a component prop:
<Stack.Screen name="Home">
{props => <HomeScreen {...props} extraData={someData} />}
</Stack.Screen>
See https://reactnavigation.org/docs/hello-react-navigation/#passing-additional-props
回答5:
The other answers do the job but these solutions have severe performance issues if your screen has a lot of components, in my case I had a Flatlist with elements ever increasing on scrolling.
So I figured out a solution. You can use the property 'children' to pass an element type jsx like instead of the property 'component'.
I'm using react navigation 5.x
<Tab.Screen
name="Home"
children={() => <PharmacyHome catId={this.props.navigation.state.params}/>}
.
.
.
/>
This had no performance issues compared to what I was getting when trying for other solutions.
来源:https://stackoverflow.com/questions/60586470/how-to-remove-warning-in-react-native