#reactjs #react-native #redux
#reactjs #react-native #redux
Вопрос:
Я использую react native с redux и хочу передать объект другому компоненту. Я не вижу, что я делаю не так, но я всегда получаю сообщение об ошибке: ‘Typeerror: _this.props.onPress не является функцией. (В ‘_this.props.onPress (item)’, ‘_this.props.onPress’ не определено). Вот мои два компонента.
import React,{Component} from 'react';
import {View,Text,TouchableOpacity} from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome';
export default class RestaurantMenu extends React.Component{
renderMenu = (menu)=>{
return menu.map((item,index)=>{
const dishNumber = index 1;
return(
<View style={{flexDirection:'row'}} key={index}>
<Text > {dishNumber} {item.name} {item.price}€ </Text>
<TouchableOpacity onPress={()=>this.props.onPress(item)}>
<Icon name='cart-plus'/>
</TouchableOpacity>
</View>
)
})
};
render(){
return(
<View>
{this.renderMenu(this.props.menu)}
</View>
)
}
}
Второй компонент:
import React, { useState } from "react";
import { StatusBar } from "expo-status-bar";
import { ImageBackground, StyleSheet, View, Text, TouchableOpacity, Image, ActivityIndicator } from "react-native";
import { connect } from 'react-redux';
import { RestaurantData } from '../../Data';
import RestaurantDetail from '../components/RestaurantDetail';
import RestaurantMenu from "../components/RestaurantMenu";
import RestaurantRating from "../components/RestaurantRating";
class RestaurantDetailTemplate extends React.Component {
restaurantId=this.props.restaurantId;
constructor(props){
super(props);
this.state={
toggleDetailsMenuRating: 'Details'
}
}
restaurantToggle=()=>{
return(
<View style={styles.toggleDetailsMenuRating}>
<TouchableOpacity
onPress={()=>this.setState({toggleDetailsMenuRating: 'Details'})}
>
<Text>Details </Text>
</TouchableOpacity>
<TouchableOpacity
onPress={()=>this.setState({toggleDetailsMenuRating: 'Menu'})}
>
<Text>Menu </Text>
</TouchableOpacity>
<TouchableOpacity
onPress={()=>this.setState({toggleDetailsMenuRating: 'Bewertung'})}
>
<Text>Bewertung</Text>
</TouchableOpacity>
</View>
)};
render() {
if(this.state.toggleDetailsMenuRating==='Details'){
return (
<View style={styles.Background}>
{this.restaurantToggle()}
<RestaurantDetail restaurant={RestaurantData[this.restaurantId]} onPress={this.props.addItemToCart}/>
</View>
)
}
if(this.state.toggleDetailsMenuRating==='Menu'){
return(
<View style={styles.Background}>
{this.restaurantToggle()}
<RestaurantMenu menu={RestaurantData[this.restaurantId].card}/>
</View>
)
}
if(this.state.toggleDetailsMenuRating==='Bewertung'){
return(
<View style={styles.Background}>
{this.restaurantToggle()}
<RestaurantRating rating={RestaurantData[this.restaurantId].rating}/>
</View>
)
}
}
}
function mapStateToProps(state) {
return {
restaurantId: state.restaurantId
}
}
function mapDispatchToProps(dispatch) {
return {
addItemToCart: (item) => dispatch({type: 'ADD_ITEM_TO_CART',payload:item})
}
}
export default connect(mapStateToProps, mapDispatchToProps)(RestaurantDetailTemplate);
Ответ №1:
Это потому, что вы не передаете onPress
реквизиты RestaurantMenu
компоненту. Ваш RestaurantMenu
вызов должен выглядеть примерно так,
<RestaurantMenu menu={RestaurantData[this.restaurantId].card} onPress={yourOnPressCallback}/>
Комментарии:
1. Это зависит от того, как вы объявили свою функцию обратного вызова. Если вы использовали
function callback () {}
, вам нужно привязать это. Если вы использовалиconst callback = () => {}
, вам не нужно привязывать это.2. Я попробовал <RestaurantDetail restaurant={RestaurantData} onPress={this.props.addItemToCart.bind(this)/> потому что addItemToCart — это функция из mapDispatchToProps . Я все еще получаю ту же ошибку в RestaurantMenu-component.
3. Вы все еще получаете ошибку, если передаете метод без
.bind(this)
?4. Хорошо, я нашел свою ошибку. Большое спасибо за вашу помощь.
5. Не могли бы вы добавить раздел обновления в свой вопрос и описать, в чем заключается ошибка, чтобы тот, кто придет следующим, также получил решение?