Как использовать функцию карты на ловушке реагирующего состояния - PullRequest
0 голосов
/ 01 декабря 2018

Может кто-нибудь объяснить, почему я не могу запустить функцию карты JavaScript на хуке состояния React?

const [sequenceNames, setSequenceNames] = useState(null);

useEffect(() => {
  fetch('/savedFiles')
    .then(response => response.json())
    .then(data => setSequenceNames(data));
}, []);

const table = sequenceNames.map(name => Sequence(name));

Это работает с циклом for in, но мой линтер запрещает использование for in.

const table = [];

for (const name in sequenceNames) {
  table.push(Sequence(sequenceNames[name]));
}

Когда я использую .map, я получаю следующую ошибку.

TypeError: Cannot read property 'map' of null
    at main.a21158832f7ed8c55e25.bundle.js:1
    at Bi (main.a21158832f7ed8c55e25.bundle.js:1)
    at main.a21158832f7ed8c55e25.bundle.js:1
    at f (main.a21158832f7ed8c55e25.bundle.js:1)
    at d (main.a21158832f7ed8c55e25.bundle.js:1)
    at main.a21158832f7ed8c55e25.bundle.js:1

, хотя мой массив sequenceNames не должен быть нулевым.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Проблема, с которой вы столкнулись, заключается в том, что вы устанавливаете начальное состояние sequenceNames null, поэтому вы попадаете в состояние гонки, когда при первой попытке запустить цикл над sequenceNames это null.Вы можете инициализировать sequenceNames пустым массивом [], но лучший способ выполнить то, что вы хотите сделать, это использовать хуки.

import React, { useMemo, useState } from 'react';
import { Sequence } from '.';

export interface DisplayNamesProps {
    id?: number;
}

export function DisplayNames(props: DisplayNamesProps) {
    const { id } = props;
    const [sequenceNames, setSequenceNames] = useState<Sequence[]>([]);

    // Use useEffect with the 2nd param, to guard against `fetch`
    // executing on each render. In this example I use `id` as
    // a var that should be unique for each `fetch` call.
    useEffect(() => {
        fetch(`/savedFiles/${id}`)
            .then(response => response.json())
            .then(data => setSequenceNames(data));
    }, [id]);

    // Create a memoized var `table` that updates when there
    // is a change to `sequenceNames`.
    const table = useMemo(() => {
        return sequenceNames.map(name => Sequence(name))
    }, [sequenceNames]);

    return <div>{table}</div>;
}
0 голосов
/ 01 декабря 2018

Изменить

    const table = sequenceNames.map(name => Sequence(name));

На

    const table = Array.isArray(sequenceNames) && sequenceNames.map(name => Sequence(name));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...