Почему моя функция compareQA возвращает 0 или -1?

#react-native #random

#реагировать-родной #индекс

Вопрос:

Этот экран предназначен для упражнения на умножение, дается умножение, и вы должны ввести ответ в текстовый ввод и нажать кнопку ОК. Но проблема в том, что в моей функции compareQA qaindex возвращает 0 или -1.

 import React, { useState, useEffect } from "react"; import { StyleSheet, Text, View, Pressable, TextInput } from 'react-native'; import { StatusBar } from 'expo-status-bar'; import { NavigationContainer } from '@react-navigation/native'; import styles from '../Components/AppStyle'; import {LittleSpace05,LittleSpace1, LittleSpace4} from '../Components/LittleSpace'; import changeSize from '../Components/ChangeSize';  function RouletteExercice1 ({ route, navigation }){   const { multiplyArray, multBy} = route.params;   const [adaptTitleFontSize, setAdaptTitleFontSize] = useState({  fontSize: 16,  });  const [adaptButtonFontSize, setAdaptButtonFontSize] = useState({  fontSize: 16,  });   const getSize = (event, divide, thing) =gt; {  if (thing == 'title') {  setAdaptTitleFontSize(changeSize(event.nativeEvent.layout, divide))  } else {  setAdaptButtonFontSize(changeSize(event.nativeEvent.layout, divide))  }   };   const [questionsArray,setQuestionsArray] = useState([]);  const [answersArray,setAnswersArray] = useState([]);  const [mQuestion,setMQuestion] = useState();  const [qaIndex,setQAIndex] = useState(0);  const [textInputAnswer, setTextInputAnswer] = useState();   useEffect(() =gt; {  createQuestionsArray();  },[]);   function createQuestionsArray() {  let m = 0;  while (m lt; multiplyArray.length) {  let b = 1;  while (b lt; multBy 1) {  let quest = multiplyArray[m] 'x' b;  let rep = multiplyArray[m]*b;  setQuestionsArray((prev) =gt; [...prev, quest]);  setAnswersArray((prev) =gt; [...prev, rep]);  b    }  m    }  askQuestion();  }   function askQuestion(){  setMQuestion(questionsArray[Math.floor(Math.random()*questionsArray.length)]);   }   function compareQA(){  setQAIndex(questionsArray.indexOf(mQuestion));  if (answersArray[qaIndex]==textInputAnswer) {  questionsArray.splice(qaIndex,1);  answersArray.splice(qaIndex,1);  console.log(qaIndex);  askQuestion();  }  }   return(  lt;View style={{ flex: 1, flexDirection: 'column'}}gt;  lt;StatusBar style="auto" /gt;  lt;View style={{flex: 1}}gt;  lt;/Viewgt;  lt;View style={{flex: 4, alignItems: 'center', justifyContent: 'center'}}gt;  lt;LittleSpace1/gt;  lt;LittleSpace1/gt;  lt;View onLayout={(event) =gt; {getSize(event,2,'title')}} style={[styles.setViewRE1, {alignItems: 'center'}]}gt;  lt;Text style={[styles.textExercice, adaptTitleFontSize,{fontWeight: 'bold'}]}gt;{mQuestion}lt;/Textgt;  lt;/Viewgt;  lt;LittleSpace05/gt;  lt;View style={[styles.setViewRE1, {alignItems: 'center'}]}gt;  lt;Text style={[styles.textExercice, adaptTitleFontSize,{fontWeight: 'bold'}]}gt;=lt;/Textgt;  lt;/Viewgt;  lt;LittleSpace05 /gt;  lt;View onLayout={(event) =gt; {getSize(event, 3,'button')}} style={styles.setViewRE1}gt;  lt;LittleSpace4/gt;  lt;TextInput  onChangeText={text =gt; setTextInputAnswer(text.replace(/[^0-9]/g, ''))}  value={textInputAnswer}  placeholder=" perso"  textAlign={'center'}  keyboardType="numeric"  style={[ styles.inputRE1, adaptButtonFontSize]}  type='number'  /gt;  lt;LittleSpace1/gt;  lt;Pressable style={styles.buttonRE1} onPress={() =gt; {compareQA();}} gt;  lt;Text style={[styles.textExercice, adaptButtonFontSize]}gt;OKlt;/Textgt;  lt;/Pressablegt;  lt;LittleSpace1/gt;  lt;/Viewgt;  lt;LittleSpace1/gt;  lt;LittleSpace1/gt;  lt;LittleSpace4/gt;  lt;/Viewgt;  lt;View style={{flex: 1,}}gt;  lt;/Viewgt;  lt;/Viewgt;  )  }  export default RouletteExercice1;   

мультиплеЕрный массив = [35,17] мультби = 5

Функция createQuestionsArray создает список умножения [35×1,35×2,35×3,35×4,35×5,17×1,17×2,17×3,17×4,17×5].

Функция askQuestion должна выполнять случайное умножение из списка вопросов, но когда я сравниваю его с ответом, он не работает.

Может кто-нибудь сказать мне, что не так в моем коде? Пожалуйста.

Ответ №1:

Если вы не хотите createQuestionsArray запускать каждый рендеринг, это:

 useEffect(() =gt; {  createQuestionsArray(); });  

должно быть

 useEffect(() =gt; {  createQuestionsArray(); }, []);  

Это, вероятно, приведет к многочисленным повторным визуализациям, учитывая, что вы устанавливаете состояние внутри этой функции.

Комментарии:

1. Спасибо, это помогает, но у меня все еще есть проблемы с остальной частью моего кода ^^