Содержимое массива, похоже, исчезает

#reactjs

#reactjs

Вопрос:

Я работаю над разработкой игры, которая включает в себя отображение случайного набора карточек покемонов на экране с помощью React.

Я столкнулся с некоторыми трудностями при попытке создать список покемонов из-за того, что данные, хранящиеся в массиве, по-видимому, исчезают (я новичок в React, и поэтому я уверен, что я что-то упускаю).

В моем игровом компоненте у меня определено следующее состояние:

 const [score, setScore] = useState(0);
const [highScore, setHighScore] = useState(0);
const [level, setLevel] = useState(1);
const [cards, setCards] = useState(4);
const [gameActive, setGameActive] = useState(false);
const [pokemonArray, setPokemonArray] = useState([]);
const [activePokemon, setActivePokemon] = useState([]);
 

Мое приложение сначала генерирует целые числа массива, которые соответствуют типу Pokemon (их 151) для отображения:

     const generatePokemonArray = (cards) => {

        const generatedPokemonArray = [];
       
        for (let i = 0; i<cards; i  ) {
            generatedPokemonArray.push(Math.floor(Math.random() * (150 - 0)   0));
        }

        setPokemonArray({
            pokemonArray: generatedPokemonArray
        });
    }
 

После этого он использует ранее сгенерированный массив для определения имен связанных покемонов, а затем добавляет их в другой массив:

     const generateActivePokemon = (pokemonArray, listOfPokemon) => {
        const pokemonNames = [];

        for (let i=0; i<pokemonArray.length; i  ) {
            pokemonNames.push(listOfPokemon[pokemonArray[i]].name);
        }

        setActivePokemon({
            activePokemon: pokemonNames
        });
    }
 

Проблема, с которой я сталкиваюсь, связана с приведенным выше блоком кода, цикл for никогда не запускается. Если я введу некоторые журналы консоли, будет выведено следующее:

     const generateActivePokemon = (pokemonArray, listOfPokemon) => {
        const pokemonNames = [];

        console.log(pokemonArray);
        console.log(pokemonArray[0]);

        for (let i=0; i<pokemonArray.length; i  ) {
            pokemonNames.push(listOfPokemon[pokemonArray[i]].name);
        }

        setActivePokemon({
            activePokemon: pokemonNames
        });
    }
 

введите описание изображения здесь

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

Спасибо!

Ответ №1:

вы передаете объект pokemonArray , у которого есть pokemonArray ключ. Если вы сначала его разрушите, вы бы извлекли массив, и он должен работать:

 const generateActivePokemon = ({ pokemonArray }, listOfPokemon) => {
    const pokemonNames = [];

    for (let i=0; i<pokemonArray.length; i  ) {
        pokemonNames.push(listOfPokemon[pokemonArray[i]].name);
    }

    setActivePokemon({
        activePokemon: pokemonNames
    });
}
 

хотя причина, по которой у вас есть объект, заключается в том, что вы превращаете состояние массива в объект:

     setPokemonArray({
        pokemonArray: generatedPokemonArray
    });
 

где это должно быть похоже:

     setPokemonArray([generatedPokemonArray]);
 

и это тоже похоже на тот же случай activePokemon . Начальное состояние массива превратилось в объект.

в целом, правильный подход заключается в том, что вы должны исправить свой код, чтобы он работал, чтобы установить ваши состояния как массив:

 const generatePokemonArray = (cards) => {

    const generatedPokemonArray = [];
   
    for (let i = 0; i<cards; i  ) {
        generatedPokemonArray.push(Math.floor(Math.random() * (150 - 0)   0));
    }

    // pass an array
    setPokemonArray([generatedPokemonArray]);
}
 

 const generateActivePokemon = (pokemonArray, listOfPokemon) => {
    const pokemonNames = [];

    console.log(pokemonArray);
    console.log(pokemonArray[0]);

    for (let i=0; i<pokemonArray.length; i  ) {
        pokemonNames.push(listOfPokemon[pokemonArray[i]].name);
    }

    // pass an array
    setActivePokemon([pokemonNames]);
}
 

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

1. Аааа, я вижу — теперь я изменил его, и он работает — большое вам спасибо. Очень ценю вашу помощь! @buzatto