React Native — состояние возвращает значение null после установки состояния

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

{"data":[{"digit":300,"countsum":"52"},{"digit":301,"countsum":"102"},{"digit":302,"countsum":"27"},{"digit":303,"countsum":"201"},{"digit":500,"countsum":"101"}]}

Когда я попытался сопоставить эти данные, я столкнулся с некоторыми проблемами. Я сохранил ответ от API на состояние, и когда я попытался отобразить данные состояния с помощью функции map, он показывает, что значение состояния равно нулю. Этот код я пробовал до сих пор

const [listdata, setListData] = useState(null)
useEffect(() => {
    // Run! Like go get some data from an API.
    getListData();
}, []);

const getListData = async () => {
    const token = await AsyncStorage.getItem("@userToken")
    axios
        .get(constants.BASE_URL + "getlist?token = " +token)
        .then(response => setListData(response.data))
        .catch(error => {
          console.info(error);
        });
        listdata.map(item => <Text>{item.digit}</Text>)
  }

я не вижу, где вы храните данные в listData?

Sakshi 26.12.2020 15:03

@Sakshi setListData(ответ.данные)

sooraj s pillai 26.12.2020 15:04

Попробуйте console.info listdata на этом этапе, вы обнаружите, что он по-прежнему равен нулю, другими словами, значение обновленного значения listdata:useSate будет готово после выполнения рендеринга. Вы можете сделать другую функцию вне текущей. затем используйте useEffect со списком данных, чтобы обновить текстовые представления.

Ahmad hassan 26.12.2020 15:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
379
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вам нужно дождаться выполнения выборки, а затем выполнить карту списка.

// wait for it
await axios
   .get(constants.BASE_URL + "getlist?token = " +token)
   .then(response => setListData(response.data))
   .catch(error => {
     console.info(error);
   });
   listdata.map(item => <Text>{item.digit}</Text>)

Тем не менее он показывает Uncaught (в обещании) TypeError: listdata is null

sooraj s pillai 26.12.2020 15:09

Вы должны использовать его следующим образом: useState([]) // пустой массив

Felipe Malara 26.12.2020 15:11

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

return(
{listData?listdata.map(item => return <Text>{item.digit}</Text>):""}
);
Ответ принят как подходящий

Делай это так,

export default function ComponentName () {
const [listdata, setListData] = useState([])
useEffect(() => {
    // Run! Like go get some data from an API.
    getListData();
}, []);

const getListData = async () => {
    const token = await AsyncStorage.getItem("@userToken")
    axios
        .get(constants.BASE_URL + "getlist?token = " +token)
        .then(response => setListData(response.data))
        .catch(error => {
          console.info(error);
        });
}

return (<>
        listdata.map(item => <Text>{item.digit}</Text>)
</>
);
  }


Это образец значения в моем комментарии выше:

Попробуйте console.info listdata на этом этапе, вы обнаружите, что он все еще null, другими словами, значение обновленного значения listdata:useSate будет готов после рендеринга. Ты можешь сделать другую функцию вне текущей. затем используйте useEffect со списком данных для обновления ваших текстовых представлений

const [listdata, setListData] = useState(null)

useEffect(() => makeRemoteRequest(), [listdata])


makeRemoteRequest = () => {
    const url = `your-url-of-data-here`;
    fetch(url)
      .then(res => res.json())
      .then(res => {
        setListData(res.data);
      })
      .catch(error => {
       console.info(error)
      });
  };

Вы можете попробовать следующее:

const [listdata, setListData] = useState([])
useEffect(() => {
    // Run! Like go get some data from an API.
    getListData();
}, []);

const getListData = async () => {
    const token = await AsyncStorage.getItem("@userToken")
    try {
        const dataResponse = await axios.get(constants.BASE_URL + "getlist?token = " +token);
        setListData(dataResponse.data || [] );
    } catch(error) {
        console.info(error);
    }
}

return (<>
    listdata.map(item => <Text>{item.digit}</Text>)
</>);

Другие вопросы по теме