#react-native #expo #react-navigation-v5
#реагировать на собственные #выставка #реагировать-навигация-v5
Вопрос:
Я немного новичок в React Native и пытаюсь создать простую игру с 3 категориями. Я использую Expo, и в моем проекте есть два основных файла для вызова файлов вопросов категории и для ввода самого теста, IndexQuiz.js и Quiz.js . Экран перед IndexQuiz в навигации — это просто меню, к которому я попадаю в эти категории.
IndexQuiz.js:
import React from "react";
import { ScrollView, StatusBar, TouchableOpacity, Text, Image, View, SafeAreaView} from "react-native";
import { AppStyles, DesafiosStyles } from "../AppStyles";
import questoes_arquitetura from "../questions/questoes_arquitetura";
import questoes_curiosidades from "../questions/questoes_curiosidades";
import questoes_historia from "../questions/questoes_historia";
export default ({ navigation }) => (
<ScrollView style={{backgroundColor:"rgb(32, 53, 70)"}}>
<StatusBar barStyle="light-content" />
<SafeAreaView style={{alignItems: "center", flexDirection: "column"}}>
<Text style={AppStyles.titleText}>Categorias</Text>
<TouchableOpacity onPress={() =>
navigation.navigate("Quiz", {
title: "Arquitetura",
questions: questoes_arquitetura,
color: "#36b1f0"
})}
style={DesafiosStyles.cardContainer}>
<Image style={DesafiosStyles.cardImage} source={require("../assets/tp_madre.jpg")}/>
<View style={DesafiosStyles.cardContent}>
<Text style={DesafiosStyles.cardTitle}>Arquitetura</Text>
</View>
</TouchableOpacity>
<TouchableOpacity onPress={() =>
navigation.navigate("Quiz", {
title: "Curiosidades",
questions: questoes_curiosidades,
color: "#36b1f0"
})}
style={DesafiosStyles.cardContainer}>
<Image style={DesafiosStyles.cardImage} source={require("../assets/tp_madre.jpg")}/>
<View style={DesafiosStyles.cardContent}>
<Text style={DesafiosStyles.cardTitle}>Curiosidades</Text>
</View>
</TouchableOpacity>
<TouchableOpacity onPress={() =>
navigation.navigate("Quiz", {
title: "História",
questions: questoes_historia,
color: "#36b1f0"
})}
style={DesafiosStyles.cardContainer}>
<Image style={DesafiosStyles.cardImage} source={require("../assets/tp_madre.jpg")}/>
<View style={DesafiosStyles.cardContent}>
<Text style={DesafiosStyles.cardTitle}>História</Text>
</View>
</TouchableOpacity>
</SafeAreaView>
);
Quiz.js:
import React from "react";
import { View, StyleSheet, StatusBar, Text, SafeAreaView } from "react-native";
import { Button, ButtonContainer } from "../components/Button";
import { Alert } from "../components/Alert";
const styles = StyleSheet.create({ ...
export default class Quiz extends React.Component {
constructor(props) {
super(props)
this.state = {
correctCount: 0,
totalCount: this.props.route.params("questions", []).length,
activeQuestionIndex: 0,
answered: false,
answerCorrect: false
}
}
answer = correct => {
this.setState(
state => {
const nextState = { answered: true };
if (correct) {
nextState.correctCount = state.correctCount 1;
nextState.answerCorrect = true;
} else {
nextState.answerCorrect = false;
}
return nextState;
},
() => {
setTimeout(() => this.nextQuestion(), 750);
}
);
};
nextQuestion = () => {
this.setState(state => {
const nextIndex = state.activeQuestionIndex 1;
if (nextIndex >= state.totalCount) {
return this.props.navigation.popToTop();
}
return {
activeQuestionIndex: nextIndex,
answered: false
};
});
};
render() {
const questions = this.props.route.params("questions", []);
const question = questions[this.state.activeQuestionIndex];
return (
<View
style={[
styles.container,
{ backgroundColor: this.props.route.params("color") }
]}
>
<StatusBar barStyle="light-content" />
<SafeAreaView style={styles.safearea}>
<View>
<Text style={styles.text}>{question.question}</Text>
<ButtonContainer>
{question.answers.map(answer => (
<Button
key={answer.id}
text={answer.text}
onPress={() => this.answer(answer.correct)}
/>
))}
</ButtonContainer>
</View>
<Text style={styles.text}>
{`${this.state.correctCount}/${this.state.totalCount}`}
</Text>
</SafeAreaView>
<Alert
correct={this.state.answerCorrect}
visible={this.state.answered}
/>
</View>
);
}
}
Затем, когда я пытаюсь продолжить и выбрать категорию: TypeError: _this.props.route.params is not a function. (In '_this.props.route.params("questions", [])', '_this.props.route.params' is an instance of Object)
Я что-то здесь упускаю, но что?
Комментарии:
1. параметры не являются функцией, как указано в сообщении об ошибке 🙂 вам следует обратиться к reactnavigation.org/docs/params чтобы узнать больше о параметрах маршрута
2. параметры не являются функцией, это объект, если вы хотите получать вопросы от параметров, используйте вместо этого props.route.params.questions …
Ответ №1:
Попробуйте получить доступ таким образом
constructor(props) {
super(props)
this.state = {
...
totalCount: props.route.params.questions.length,
.....
}