0

I hope someone can explain this to me..

I am using axios to fetch json from a webpage. I can get the data and output it to my html without issue, but when i try to access a single element I get an error "Cannot read properties of null (reading '0')"

Here is my JS code:

//app.js
const app = {
  data() {
    return {
      quotes: null,
    }
  },
  mounted() {
    axios
      .get('https://gist.githubusercontent.com/camperbot/5a022b72e96c4c9585c32bf6a75f62d9/raw/e3c6895ce42069f0ee7e991229064f167fe8ccdc/')
      .then(response => (this.quotes = response.data.quotes) )
  },
  methods: {
    test() {
      console.log(Object.keys(this.quotes))
      console.log(this.quotes)
    }
  }


}

Vue.createApp(app).mount('#app')

I can access my data fine like this:

<!--index.html-->
...
<div id="app">
    <div>
      {{ quotes }}
    </div>
  </div>
...

which outputs:

[ { "quote": "Life isn’t about getting and having, it’s about giving and being.", "author": "Kevin Kruse" }, ...]

But when I try:

<!--index.html-->
...
<div id="app">
  <div>
    {{ quotes[0] }}
  </div>
</div>
...

I get the error message:

Uncaught TypeError: Cannot read properties of null (reading '0')

Can anyone help me understand how I can access a single element within my quotes object?

2
  • 1
    It takes a while for the request to finish, and quotes is null before that. Your first attempt works fine because {{ null }} will simply render nothing, but you cannot access "the first element" of null. Use conditional rendering or something like {{ quotes && quotes[0] }} Commented Oct 14, 2021 at 13:54
  • This is also the case for Suspense. Commented Oct 14, 2021 at 14:18

1 Answer 1

2

You trying to access an object before initialization. Try:

<div id="app">
  <div v-if="quotes">
    {{ quotes[0] }}
  </div>
</div>

At the time when the first render happened your quotes === null. And it is not possible to do null[0]. After API call you assign an object to quotes and only after rerender you able to get quotes[0]

Sign up to request clarification or add additional context in comments.

1 Comment

thanks very much - It seems obvious now its been explained :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.