как получить данные из API в vuex с помощью axios?
У меня есть данные, взятые из API laravel, и вот мой код в состоянии.js
import axios from 'axios'
import {apiPostGet} from '../api/api'
export default {
data: axios({
method: 'GET',
url: apiPostGet('Kategori')
}).then(
response => {
return response.data.kategori
}
).catch(
error => {
return error.response
}
)
}
И это мой код в gteeters.js
export default {
datas: state => {
return state.data
}
}
И это мой код в индексе.js
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import getters from './getters'
Vue.use(Vuex)
export default new Vuex.Store({
state,
getters
})
1 ответ:
Data
крюк должен вернуться синхронно. Вы должны добавить загрузку вcreated
илиmounted
и просто добавить свойства к данным / состоянию, так что реактивность работает.Загрузка данных с помощью Axios должна быть вызвана действием, потому что это asynch. Мутации должны выполняться синхронно. Я добавил начальную загрузку в
created
. (mounted
также будет работать.)Я использовал помощник Vuex
Пожалуйста, взгляните на демо ниже или на эту скрипку .mapState
для отображения свойств состояния компонента. Использование геттеров также будет работать, ноmapState
легче писать.Также раскомментируйте код ниже версии Vuex в скрипке и прокомментируйте приложение выше, чтобы увидеть, как Axios работает без Vuex для лучшего понимания.
const URL = 'https://jsonplaceholder.typicode.com/posts'; const store = new Vuex.Store({ state: { posts: [], loading: true }, actions: { loadData({ commit }) { axios.get(URL).then((response) => { // console.log(response.data, this) commit('updatePosts', response.data) commit('changeLoadingState', false) }) } }, mutations: { updatePosts(state, posts) { state.posts = posts }, changeLoadingState(state, loading) { state.loading = loading } } }) new Vue({ el: '#app', computed: Vuex.mapState(['posts', 'loading']), store, created() { //console.log(this.$store) this.$store.dispatch('loadData') // dispatch loading } }) /* //example with-out vuex new Vue({ el: '#app', data() { return { loading: true, posts: [] // add posts here so reactivity is working, also undefined would be OK } }, created() { //this.loading = true --> not needed already set in data axios.get(URL).then((response) => { // console.log(response.data, this) this.posts = response.data this.loading = false }) } }) */
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.17.1/axios.js"></script> <div id="app"> <div v-if="loading"> loading... </div> <div v-else> <ul> <li v-for="post in posts"> <h1> {{post.title}} </h1> <p> {{post.body}} </p> </li> </ul> </div> </div>