gpt4 book ai didi

vuex - 使用 Vuex 进行异步调用

转载 作者:行者123 更新时间:2023-12-01 07:06:31 27 4
gpt4 key购买 nike

我刚开始在这里学习 Vuex。到目前为止,我一直将共享数据存储在 store.js 中。文件和导入store在每个模块中,但这越来越烦人,我担心会发生变异。

我正在努力解决的是如何使用 Vuex 从 firebase 导入数据。据我了解,只有 Action 可以进行异步调用,但只有突变可以更新状态?

现在我正在从我的突变对象调用firebase,它似乎工作正常。老实说,所有的上下文、提交、分派(dispatch)等似乎有点过载。我希望能够使用最少量的 Vuex 来提高工作效率。

在文档中,看起来我可以编写一些代码来更新突变对象中的状态,如下所示,将其导入到我的组件中 computed属性,然后使用 store.commit('increment') 触发状态更新.这似乎是使用 Vuex 所需的最低数量,但操作从何而来?困惑:(任何关于最佳方式或最佳实践的帮助将不胜感激!

const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})

我的代码如下

store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);

const db = firebase.database();
const auth = firebase.auth();

const store = new Vuex.Store({
state: {
userInfo: {},
users: {},
resources: [],
postKey: ''
},
mutations: {

// Get data from a firebase path & put in state object

getResources: function (state) {
var resourcesRef = db.ref('resources');
resourcesRef.on('value', snapshot => {
state.resources.push(snapshot.val());
})
},
getUsers: function (state) {
var usersRef = db.ref('users');
usersRef.on('value', snapshot => {
state.users = snapshot.val();
})
},
toggleSignIn: function (state) {
if (!auth.currentUser) {
console.log("Signing in...");
var provider = new firebase.auth.GoogleAuthProvider();
auth.signInWithPopup(provider).then( result => {
// This gives you a Google Access Token. You can use it to access the Google API.
var token = result.credential.accessToken;
// The signed-in user info.
var user = result.user;
// Set a user
var uid = user.uid;
db.ref('users/' + user.uid).set({
name: user.displayName,
email: user.email,
profilePicture : user.photoURL,
});

state.userInfo = user;
// ...
}).catch( error => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
} else {
console.log('Signing out...');
auth.signOut();
}
}
}
})

export default store

main.js

import Vue from 'vue'
import App from './App'
import store from './store'

new Vue({
el: '#app',
store, // Inject store into all child components
template: '<App/>',
components: { App }
})

应用程序.vue

<template>
<div id="app">
<button v-on:click="toggleSignIn">Click me</button>
</div>
</template>

<script>

import Hello from './components/Hello'


export default {
name: 'app',
components: {
Hello
},
created: function () {
this.$store.commit('getResources'); // Trigger state change
this.$store.commit('getUsers'); // Trigger state change
},
computed: {
state () {
return this.$store.state // Get Vuex state into my component
}
},
methods: {
toggleSignIn () {
this.$store.commit('toggleSignIn'); // Trigger state change
}
}
}

</script>

<style>

</style>

最佳答案

所有 AJAX 都应该采取行动而不是突变。因此,该过程将从调用您的操作开始

...将来自 ajax 回调的数据提交到突变

...负责更新 vuex 状态。

引用:http://vuex.vuejs.org/en/actions.html

这是一个例子:

// vuex store

state: {
savedData: null
},
mutations: {
updateSavedData (state, data) {
state.savedData = data
}
},
actions: {
fetchData ({ commit }) {
this.$http({
url: 'some-endpoint',
method: 'GET'
}).then(function (response) {
commit('updateSavedData', response.data)
}, function () {
console.log('error')
})
}
}

然后调用你的ajax,你现在必须通过这样做来调用 Action :

store.dispatch('fetchData')

在您的情况下,只需替换 this.$http({...}).then(...)使用您的 firebase ajax 并在回调中调用您的操作。

关于vuex - 使用 Vuex 进行异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40403657/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com