英文:
Navigate to another component on clicking FlatList in React
问题
以下是您要翻译的内容:
I am using FlatList
to display Image
and Text
side by side in a Component screen. I want to click on any row and open a new Component class[FoodItems] and passing just a simple string.
It says, "Cannot read properties of undefined (reading 'navigate')".
I have installed all required packages.
npm install react-navigation
npm install @react-navigation/native
I don't know what this.props
here is? I am not sending props from the previous screen. I just copy-paste it from some post.
Restaurants.js:
import { View, FlatList, Text, TouchableOpacity } from 'react-native';
import { useNavigation } from '@react-navigation/native';
import withRouter from './withRouter';
class Restaurants extends Component {
render() {
if (!this.state.restaurantsSet) {
this.setState({ restaurantsSet: true });
this settingRestaurants(this.props.location.state.station);
}
return (
<View>
<div className='header'></div>
<FlatList
ItemSeparatorComponent={this.FlatListItemSeparator}
ListHeaderComponent={this.FlatListHeader}
style={{ flex: 1 }}
data={this.state.restaurants}
renderItem={({ item }) =>
<TouchableOpacity
onPress={() =>
this.props.navigation.navigate(
'FoodItems',
{ message: 'my_message' }
)
}
>
<Row {...item} />
</TouchableOpacity>
}
/>
</View>
)
}
}
export default withRouter(Restaurants);
withRouter.js:
import { useLocation, useParams, useNavigation } from 'react-router-dom';
const withRouter = WrappedComponent => props => {
const location = useLocation();
const params = useParams();
const navigation = useNavigation();
return (
<WrappedComponent
{...{props, params}}
{...{ location, params,}}
{...{navigation, params}}
/>
);
};
export default withRouter;
英文:
I am using FlatList
to display Image
and Text
side by side in a Component screen. I want to click on any row and open a new Component class[FoodItems] and passing just a simple string.
It says, "Cannot read properties of undefined (reading 'navigate')".
I have installed all required packages.
npm install react-navigation
npm install @react-navigation/native
I don't know what this.props
here is? I am not sending props from previous screen. I just copy paste it from some post.
Restaurants.js:
import { View, FlatList, Text, TouchableOpacity } from 'react-native';
import { useNavigation } from '@react-navigation/native';
import withRouter from './withRouter';
class Restaurants extends Component {
render() {
if (!this.state.restaurantsSet) {
this.setState({ restaurantsSet: true });
this.settingRestaurants(this.props.location.state.station);
}
return (
<View>
<div className='header'></div>
<FlatList
ItemSeparatorComponent={this.FlatListItemSeparator}
ListHeaderComponent={this.FlatListHeader}
style={{ flex: 1 }}
data={this.state.restaurants}
renderItem={({ item }) =>
<TouchableOpacity
onPress={() =>
this.props.navigation.navigate(
'FoodItems',
{ message: 'my_message' }
)
}
>
<Row {...item} />
</TouchableOpacity>
}
/>
</View>
)
}
}
export default withRouter(Restaurants);
withRouter.js:
import { useLocation, useParams, useNavigation } from 'react-router-dom';
const withRouter = WrappedComponent => props => {
const location = useLocation();
const params = useParams();
const navigation = useNavigation();
return (
<WrappedComponent
{...{props, params}}
{...{ location, params,}}
{...{navigation, params}}
/>
);
};
export default withRouter;
答案1
得分: 1
The withRouter
HOC is implemented incorrectly. The useNavigation
hook is a RRDv6.4 Data router only hook. Emphasis mine.
This hook tells you everything you need to know about a page navigation to build pending navigation indicators and optimistic UI on data mutations. Things like:
- Global loading indicators
- Disabling forms while a mutation is happening
- Adding busy indicators to submit buttons
- Optimistically showing a new record while it's being created on the server
- Optimistically showing the new state of a record while it's being updated
Important
This feature only works if using a data router, see Picking a Router
import { useNavigation } from "react-router-dom";
function SomeComponent() {
const navigation = useNavigation();
navigation.state;
navigation.location;
navigation.formData;
navigation.formAction;
navigation.formMethod;
}
The useNavigation
hook isn't used to issue any imperative navigation actions. For this you should import and use the useNavigate
hook as this is the hook that returns the navigate
function.
import { useLocation, useParams, useNavigate } from 'react-router-dom';
const withRouter = WrappedComponent => props => {
const location = useLocation();
const params = useParams();
const navigate = useNavigate();
return (
<WrappedComponent
{...props}
{...{ location, params, navigate }}
/>
);
};
export default withRouter;
The in the React Class component access this.props.navigate
. Don't forget that data you want to pass in route state is passed in the option
object's state
property.
import { View, FlatList, Text, TouchableOpacity } from 'react-native';
import withRouter from './withRouter';
class Restaurants extends Component {
...
componentDidMount() {
if (!this.state.restaurantsSet) {
this.setState({ restaurantsSet: true });
this.settingRestaurants(this.props.location.state?.station);
}
}
...
render() {
return (
<View>
<div className='header'></div>
<FlatList
ItemSeparatorComponent={this.FlatListItemSeparator}
ListHeaderComponent={this.FlatListHeader}
style={{ flex: 1 }}
data={this.state.restaurants}
renderItem={({ item }) =>
<TouchableOpacity
onPress={() =>
this.props.navigate(
'FoodItems',
{ state: { message: 'my_message' }}
);
}
>
<Row {...item} />
</TouchableOpacity>
}
/>
</View>
)
}
}
export default withRouter(Restaurants);
英文:
The withRouter
HOC is implemented incorrectly. The useNavigation
hook is a RRDv6.4 Data router only hook. Emphasis mine.
> This hook tells you everything you need to know about a page
> navigation to build pending navigation indicators and optimistic UI on
> data mutations. Things like:
>
> * Global loading indicators
> * Disabling forms while a mutation is happening
> * Adding busy indicators to submit buttons
> * Optimistically showing a new record while it's being created on the server
> * Optimistically showing the new state of a record while it's being updated
>
> Important
>
> This feature only works if using a data router, see Picking a Router
>
> import { useNavigation } from "react-router-dom";
>
> function SomeComponent() {
> const navigation = useNavigation();
> navigation.state;
> navigation.location;
> navigation.formData;
> navigation.formAction;
> navigation.formMethod;
> }
The useNavigation
hook isn't used to issue any imperative navigation actions. For this you should import and use the useNavigate
hook as this is the hook that returns the navigate
function.
import { useLocation, useParams, useNavigate } from 'react-router-dom';
const withRouter = WrappedComponent => props => {
const location = useLocation();
const params = useParams();
const navigate = useNavigate();
return (
<WrappedComponent
{...props}
{...{ location, params, navigate }}
/>
);
};
export default withRouter;
The in the React Class component access this.props.navigate
. Don't forget that data you want to pass in route state is passed in the option
object's state
property.
import { View, FlatList, Text, TouchableOpacity } from 'react-native';
import withRouter from './withRouter';
class Restaurants extends Component {
...
componentDidMount() {
if (!this.state.restaurantsSet) {
this.setState({ restaurantsSet: true });
this.settingRestaurants(this.props.location.state?.station);
}
}
...
render() {
return (
<View>
<div className='header'></div>
<FlatList
ItemSeparatorComponent={this.FlatListItemSeparator}
ListHeaderComponent={this.FlatListHeader}
style={{ flex: 1 }}
data={this.state.restaurants}
renderItem={({ item }) =>
<TouchableOpacity
onPress={() =>
this.props.navigate(
'FoodItems',
{ state: { message: 'my_message' }}
);
}
>
<Row {...item} />
</TouchableOpacity>
}
/>
</View>
)
}
}
export default withRouter(Restaurants);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论