Как правильно забрать данные с сервера используя Vue, Vuex?

172
01 февраля 2019, 10:00

Учусь писать на vuejs. Есть компонент c кнопкой, при клике хочу получить данные и записать их в store. Как правильно это реализовать? Нашел 2 решения, какое из них правильное или может оба не правильные? И почему?

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

Вариант 1

<!-- STORE --> 
export default new Vuex.Store({ 
  state: { 
    items: [] 
  }, 
  getters: { 
    getItems(state) { 
      return state.items 
    } 
  }, 
  mutations: { 
    updateItems(state, data) { 
      state.items = data 
    } 
  }, 
  actions: { 
    loadItems({commit}) { 
      Vue.http.get(url).then(res => { 
        commit('updateItems', 
          res.body) 
      }) 
    } 
  } 
})
<!-- КОМПОНЕНТ --> 
<template> 
	<div>  
		<button @click="search">Click</button> 
		{{items}} 
	</div> 
</template> 
 
<script> 
  export default { 
    computed: { 
      items() { 
        return this.$store.getters.getItems 
      } 
    }, 
    methods: { 
      search() { 
        this.$store.dispatch('loadItems'); 
      } 
    } 
  } 
</script>

Вариант 2

<!--Store как в первом варианте--> 
<!--КОМПОНЕНТ--> 
<template> 
	<div> 
		<button @click="search">Click</button> 
		{{items}} 
	</div> 
</template> 
 
<script> 
export default { 
  computed: { 
    items() { 
      return this.$store.getters.getItems 
    } 
  }, 
  methods: { 
    search() { 
      this.$http.get(url) 
        .then(response => { 
          const items = response.body; 
          this.$store.commit('updateItems', items); 
        }) 
    } 
  } 
} 
</script>

Answer 1

Правильный вариант номер 1.

Во vuex для изменения состояния store из компонентов нужно использовать actions. Потому что мутации должны быть синхронными, для actions таких ограничений нет, внутри actions можно выполнять асинхронные операции.

READ ALSO
Круговые диаграммы для объектов в ObjectManager

Круговые диаграммы для объектов в ObjectManager

Какой должен быть формат json для ObjectManager

132
Свернуть/развернуть блок при клике

Свернуть/развернуть блок при клике

Есть задача - увеличивать блок по нажатию "читать подробнее"Так же есть кнопка "свернуть", которая соответственно уменьшает этот блок

168
Laravel не отдаёт изображения (спрайты)

Laravel не отдаёт изображения (спрайты)

Есть простенькие скрипты на JS, которые работают со спрайтами (jpg)Дебажил их отдельно от laravel, всё работает прекрасно

168
Как осуществить отправку файла через blob

Как осуществить отправку файла через blob

Для отправки данных использую плагин vue-upload-file Из данных о файле есть только blobМожно ли из него как то получить информацию

129