2017-01-25 2 views
1

Это мой вю код:Как изменить данные JSon после хранения в вю объекта данных

new Vue({ 
    el : '#root', 

    data : { 
     blog : [] 
    }, 

    created() { 
     this.$http.get('https://jsonplaceholder.typicode.com/posts') 
      .then(function(response) { 
       // console.log(response.data) 
       this.blog = response.data 
      }) 
      .catch(function (error) { 
       this.error = 'Error! Could not reach the API. ' + error 
     }) 
    } 

}); 

Мой HTML-код:

<div id="root" class="container"> 
     <ul v-for="post in blog"> 
      <li> {{ post.id }} </li> 
      <li>{{ post.userId }} </li> 
      <li>{{ post.title }} </li> 
     </ul> 

    </div> 

Теперь я могу показать имя каждого пользователя просто отлично, но я хочу изменить что-то вроде, если идентификатор пользователя равен 1, тогда имя пользователя будет изменено на «Смит». Я попробовал этот код:

mounted() { 
     if (this.blog[0].userId == 1) { 
       this.blog[0].userId = 'Smith' 
      } 
    } 

Но он показывает эту ошибку:

Uncaught TypeError: Cannot read property 'userId' of undefined

Если бы я использовал в метод с событием он работает просто отлично! Как это сделать?

После console.log (this.blog) enter image description here

Также после console.log (this.blog [0] .userId) я получаю: "1"

+0

Итак, ваша проблема заключается не в добавлении имени, а в связи с идентификатором? Потому что вы получаете ошибку, так как id attr не существует – samayo

+0

@samayo, когда я его пробовал, показывает эту ошибку: 'Uncaught TypeError: Не могу прочитать свойство 'name' of undefined' Но если я попробовал его с помощью какого-либо обработчика событий в метод, тогда он отлично работает! Точно я хочу изменить данные после сохранения массива! – Mohib

+0

вы можете сделать 'console.log (this.blog)'? – samayo

ответ

2

Проблема заключается в том, что ваш код в mounted() способ, сделанный до того, как вы нажмете response.data в блоге. Вот почему он не может читать какие-либо свойства.

Вы можете вызывать методы после выборки данных, в then() обратного вызова, чтобы убедиться, что у вас есть данные в массиве блога, и чем методы вызова для работы с блога:

methods: { 
    changeNames() { 
    if (this.blog[0].userId == 1) { 
      this.blog[0].userId = 'Smith' 
     } 
    }  
}, 
created() { 
    var self = this; 
    this.$http.get('https://jsonplaceholder.typicode.com/posts') 
    .then(function(response) { 
    self.blog = response.data 
    self.changeNames() // <----HERE 
    }) 
    .catch(function (error) { 
    console.log(error.statusText) 
    }) 
} 

Вот рабочий пример: jsFiddle

+0

Я только пробовал vue 1.x, и я потратил 20 минут на то, чтобы разобраться в решении, и я был почти уверен, что смонтированный будет выполнен до создания, поэтому это не сработало ... Я не знал, установлен() ', потому что это новая функция. Во всяком случае, хороший ответ +1 – samayo

+0

именно то, что я хотел, спасибо, так много! :) – Mohib

+0

Добро пожаловать. Дело в том, что ваш запрос является асинхронным, и вам нужно возвратить обещание, чтобы вы могли работать с успехом/отказывать обратные вызовы! –

Смежные вопросы