gpt4 book ai didi

javascript - Nuxt JS 如何正确使用 Vuex 模块模式?

转载 作者:行者123 更新时间:2023-11-30 19:57:29 25 4
gpt4 key购买 nike

大家好,我是 Nuxt JS 的新手。我正在尝试为我的 Nuxt 项目使用 Vuex 模块模式。

基本上我在我的 VueX 模块中使用 axios。我的代码如下:

store/modules/users.js

import axios from 'axios';

const state = () => ({
users: []
});

// Sets the values of data in states
const mutations = {
setUsers(state, users) {
state.users = users;
}
};

const actions = {
nuxtServerInit(vuexContext, context) {
return axios.get('https://sample-url.com/users')
.then((response) => {
vuexContext.commit('setUsers', response.data.data.results);
})
.catch((err) => {
context.error(err);
});
},

setUsers(vuexContext, users) {
vuexContext.commit('setUsers', users);
}
};

// retrieves the data from the state
const getters = {
getUsers(state) {
return state.users;
}
};

export default {
state,
mutations,
actions,
getters
};

然后我将这个模块包含在 store/index.js

import Vuex from 'vuex';
import Users from "~/store/modules/users";
const createStore = () => {
return new Vuex.Store({
state: {},
mutations: {},
modules: {
Users
}
})
}

export default createStore;

然后我将用户存储在我的一个页面中的 Vuex 中,例如:pages/index.vue

<script>
export default {
computed: {
loadedUsers() {
return this.$store.getters.getUsers;
}
}
}
</script>

我的问题是:

  • 我意识到每当我在不需要用户的其他页面上刷新页面时,它会再次向我的 api 发送 GET 请求以获取用户。我怎样才能只将模块用于我需要的页面,比如 pages/index.vue
  • 如果对于其他请求(如 GET 评论),我如何使用模块来使用 store/modules/comments.js 然后再次包含它 store.js

最佳答案

当你在你的 vuex 商店中设置模块时,它们只是你商店的一部分,这当然是全局性的,而且永远都是。因此,您不能仅将它应用于选择页面或组件。如果您想将 api 调用限制为仅那些使用返回数据的页面,您可以通过几种方式来实现。

首先,您可以将 api 调用完全从商店中取出,并使用 asyncData 将其放入您的页面中。所以像这样:

//users.vue
<script>
export default {
data: () => ({
users: []
}),
async asyncData({$axios}) {
let {data} = await $axios.$get('https://sample-url.com/users')
return {
users: data
}
}
}
</script>

否则如果您希望将 api 调用保留在存储中,您可以将其从 nuxtServerInit 中取出并像这样从页面中发送。

const actions = {
nuxtServerInit(vuexContext, context) {

},

setUsers(vuexContext, users) {
return axios.get('https://sample-url.com/users')
.then((response) => {
vuexContext.commit('setUsers', response.data.data.results);
})
.catch((err) => {
context.error(err);
});
}
};

然后像这样从您的页面发送 setUsers:

mounted: function () {
this.$nextTick(function () {
this.$store.dispatch('setUsers')
})
},
computed: {
loadedUsers() {
return this.$store.getters.getUsers;
}
}

至于你问题的第二部分,任何其他vuex模块都可以以同样的方式使用。

关于javascript - Nuxt JS 如何正确使用 Vuex 模块模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792085/

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