Vue Невозможно прочитать свойства неопределенного значения (чтение «0»)

Попытка динамически отображать информацию о погоде из API. Запрос API возвращает данные, которые я могу отобразить в журнале и на странице. Однако, когда я пытаюсь отобразить отдельные элементы в массивах ответов, веб-консоль сообщает, что не может прочитать свойства undef (чтение «0»). Вся страница прекратит рендеринг.

Код

<script>
import axios from 'axios'

export default{
  data() {
    return {
      weather: []
    };
  },
  async created(){
    try{
      const response = await axios.get('apilinkredacted');
      this.weather = response.data.daily;
      console.info(this.weather)
    } catch (error) {
      console.error(error);
    }
  }
}
</script>

<template>
  <main>
    <div v-for = "n in 4" class = "text-cliPurple border-t border-windowOutline pb-2 pl-2">

      <!-- weather.daily.temperature_2m_max[n-1] -->
      <p class = "underline">{{ weather.time[n-1] }}</p>

    <div class = "grid grid-cols-2">
      <div class = "">
        <pre>
     \   /
      .-.
   ― (   ) ―
      `-’
     /   \
        </pre>
      </div>
      <div class = "text-left">
        <p><span class = "text-cliOrange">Temp:</span> {{ weather.temperature_2m_max[n-1] }} C</p>
        <p><span class = "text-titleColor">Rain Chance:</span> {{ weather.precipitation_probability_max[n-1] }}%</p>
        <p><span class = "text-userColor">Rain Amount:</span> {{ weather.rain_sum[n-1] }}mm</p>
        <p><span class = "text-cliRed">UV:</span> {{ weather.uv_index_max[n-1] }}</p>

      </div>
    </div>
  </div>
  </main>
</template>

JSON-ответ

{
    "latitude": -35.25,
    "longitude": 149.125,
    "generationtime_ms": 0.06699562072753906,
    "utc_offset_seconds": 36000,
    "timezone": "Australia/Sydney",
    "timezone_abbreviation": "AEST",
    "elevation": 568,
    "daily_units": {
        "time": "iso8601",
        "temperature_2m_max": "°C",
        "apparent_temperature_max": "°C",
        "uv_index_max": "",
        "rain_sum": "mm",
        "precipitation_probability_max": "%"
    },
    "daily": {
        "time": [
            "2024-05-09",
            "2024-05-10",
            "2024-05-11",
            "2024-05-12",
            "2024-05-13",
            "2024-05-14",
            "2024-05-15"
        ],
        "temperature_2m_max": [
            16.5,
            14.9,
            13.1,
            13.4,
            17.5,
            15.9,
            14.7
        ],
        "apparent_temperature_max": [
            14.4,
            13.2,
            11.4,
            11.1,
            16,
            14.6,
            13.8
        ],
        "uv_index_max": [
            1.95,
            2.55,
            0.6,
            3.9,
            4.2,
            3.95,
            3.65
        ],
        "rain_sum": [
            0,
            5.1,
            26.5,
            3.7,
            0,
            0,
            0
        ],
        "precipitation_probability_max": [
            52,
            74,
            90,
            37,
            0,
            0,
            3
        ]
    }
}

Сначала я думал, что это потому, что этот элемент не был массивом, но когда я использовал console.info(this.weather.time[0]), я получаю правильные данные, напечатанные в веб-консоли. Если я не укажу конкретные элементы, я могу визуализировать весь ответ несколько раз, но когда я добавляю детали и перезагружаю, вся страница становится пустой.

Кроме того, когда я получаю запрос на сохранение отдельного массива this.weather = response.data.daily.time;, я могу обратиться к отдельным элементам с помощью weather[0], и это не вызывает никаких проблем.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы пытаетесь получить доступ к данным, которых еще нет. У вас есть два варианта

  1. использовать ? (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining)

    {{время?.время[n-1] }}

2), добавьте v-if в свой код

    <template>
      <main v-if = "Object.keys(weather).length>0">
        <div v-for=‘n in 4’ class=‘text-cliPurple border-t border-windowOutline pb-2 pl-2’>
    ...

С другой стороны, вы делаете некоторые ошибки. Во-первых, тип данных о погоде — [], но затем вы передаете {}, когда устанавливаете его в созданном методе. Во-вторых, вам следует избегать доступа к данным по индексу.

@rhys Да, вы также можете подумать, что async created(){ блокирует рендеринг до тех пор, пока не будет завершена выборка, но это не так. Действительно, лучший способ — использовать здесь v-if.

kissu 09.05.2024 12:21

Дэниел был прав: страница отображалась до того, как был выполнен запрос на получение. Изменил тип погоды на {} и добавил это вокруг v-for:

<div v-if = "weather.time">

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

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