2017-02-02 4 views
1

Я использую цикл v-for с данными, извлеченными из файла JSON. Есть ли способ повторного рендеринга DOM и целых циклов v-for после загрузки нового файла JSON и замены старого? То, что я пытаюсь достичь, - это загрузка различных наборов продуктов при щелчке и обновлении DOM.Загрузите новые данные JSON и замените старый в VueJS

Vue.use(VueResource);  
var productsList = new Vue({ 
    el: '#vue', 
    data: function() { 
     return { 
      products: [] 
     }; 
    }, 
    ready: function() { 
     this.$http.get('data/data.json').then(function (response) { 
      this.products = response.data; 
     }); 
    }, 
    methods: { 
     loadProducts: function (url) { 
      this.$http.get(url).then(function (response) { 
       this.products = response.data; 
      }); 
     } 
    } 
}); 

ответ

2

Код, указанный выше, должен быть достаточным для автоматического обновления DOM. Однако есть 2 ошибки и 1 вещь, которую вы должны учитывать.

Анонимные функции имеют разные области применения в javascript. Это означает, что когда у вас есть анонимная функция function(response), вы теряете область действия vue instance this. Чтобы справиться с такими ситуациями, вам нужно либо использовать функции стрелок, если у вас есть поддержка для них в вашем проекте, либо сохранить this в другую переменную перед входом в анонимную функцию.

Vue.use(VueResource);  
var productsList = new Vue({ 
el: '#vue', 
data: function() { 
    return { 
     products: [] 
    }; 
}, 
ready: function() { 
    var self=this; 
    this.$http.get('data/data.json').then(function (response) { 
     self.products = response.data; 
    }); 
}, 
methods: { 
    loadProducts: function (url) { 
     var self=this; 
     this.$http.get(url).then(function (response) { 
      self.products = response.data; 
     }); 
    } 
} 
}); 

Также, если у вас есть этот точный код, вы должны были получить сообщение об ошибке в браузере с неопределенными продуктами.

+0

Спасибо за ответ. Возможно, мой вопрос был недостаточно ясен. Проблема в том, что когда я получаю новые «продукты» от JSON правильно, я вижу обновления в DOM, но я пытаюсь показать только продукты из новых данных и удалить старые из DOM. – Tomarz

+0

Ну, установив 'this.products = something' вы уже сказали Vue, что хотите разместить новые данные в массиве, и он повторно отобразит DOM для вас с этими данными. Не совсем получите то, что вы хотите, как визуальный эффект. –

+0

Да, это действительно работает. Вот что я имею в виду - исходный data1.json имеет 5 продуктов. Если я установил «this.products» в data2.json, у которого есть 3 продукта, DOM отображает все 8 продуктов, а не только 3, хотя на этой консоли отображаются только 3 объекта в массиве продуктов. – Tomarz

2

После того, как вы обновите данные products, оно автоматически изменит DOM как номинальные данные, так как данные vue являются реактивными. Одна ошибка, которую я вижу в вашем коде, может иметь неправильный this внутри блока this.$http. вместо использования function() синтаксиса, используйте arrow function, который не связывает его собственной this, arguments, super или new.target, как следующее:

Vue.use(VueResource);  
var productsList = new Vue({ 
    el: '#vue', 
    data: function() { 
     return { 
      products: [] 
     }; 
    }, 
    ready: function() { 
     this.$http.get('data/data.json').then((response) => { 
      this.products = response.data; 
     }); 
    }, 
    methods: { 
     loadProducts: function (url) { 
      this.$http.get(url).then((response) => { 
       this.products = response.data; 
      }); 
     } 
    } 
}); 
Смежные вопросы