在我从组件的脚本中获取电影细节之前 . 该功能首先检查商店的电影ID是否与路线的参数电影ID相同 . 如果相同则不从服务器API获取电影,否则从服务器API获取电影 .
它工作正常 . 但现在我正试图从商店的变异中获取电影细节 . 但是我收到了错误
未捕获的TypeError:无法读取未定义的属性'$ route'
如何使用vue-router ($route)
访问params和vue-resource ($http)
从vuex store中的服务器API获取?
store.js:
export default new Vuex.Store({
state: {
movieDetail: {},
},
mutations: {
checkMovieStore(state) {
const routerMovieId = this.$route.params.movieId;
const storeMovieId = state.movieDetail.movie_id;
if (routerMovieId != storeMovieId) {
let url = "http://dev.site.com/api/movies/movie-list/" + routerMovieId + "/";
this.$http.get(url)
.then((response) => {
state.movieDetail = response.data;
})
.catch((response) => {
console.log(response)
});
}
},
},
});
组件脚本:
export default {
computed: {
movie() {
return this.$store.state.movieDetail;
}
},
created: function () {
this.$store.commit('checkMovieStore');
},
}
2 回答
要在vuex存储中使用
$http
或$router
,您需要使用主vue实例 . 虽然我在回答实际问题后不会添加我推荐的内容 .在
main.js
或您创建vue实例的任何地方,例如:或类似的东西,你也可能也添加了
vue-router
和vue-resource
插件 .对此做一点修改:
我现在可以在vuex商店中导入它,如下所示:
并且作为Austio的答案,这个方法应该是
action
,因为mutations
不是为处理异步而设计的 .现在开始采用推荐的方式 .
component
可以访问route params
并将其提供给action
.action
然后通过抽象的API服务文件(read plugins)进行调用actions
执行了一些异步作业并将结果提供给mutation
.Mutations
应该是唯一修改state
的人 .Example 包含 endpoints 列表的文件,如果您具有不同的api endpoints ,例如:test,staging,production等,则可能需要它们 .
以及实现
Vue.http
作为服务的主文件:queryAdder在重要的情况下,我使用它来将params添加到url .
所以有一些东西,$ store和$ route是Vue实例的属性,这就是为什么在Vuex实例中访问它们不起作用的原因 . 此外,突变是同步的,你需要的是行动
Mutations =>给定状态和一些参数的函数会改变状态
Action =>执行像http调用之类的异步操作,然后将结果提交到突变
因此,创建一个调度http的动作 . 请记住,这是伪代码 .
现在,您创建的函数使用id调用checkMovieStore操作,该id执行http调用,一旦完成,它将使用值更新存储 .