在vue2项目中,组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的情况下(后台获取数据存入vuex,组件之间共享数据),那么就需要用vuex来管理这些。

整个的流程是在组件的created中提交dispatch,然后通过action调用一个封装好的axios,然后再触发mutation来提交状态改变state中的数据,然后在组件的计算属性中获取state的数据并渲染在页面上
首先新需要在项目中安装vuex:
运行命令:npm install vuex --save-dev
在项目的入口js文件main.js中:import store from './store/index'
并将store挂载到vue上:
new Vue({
el: '#app',
router,
store,
template: '<App/>',
render: (createElement) => createElement(App)
})
然后看下整个store的目录结构,modules文件夹用来将不同功能也面的状态分成模块,index.js文件夹是store的入口文件,types文件夹是定义常量mutation的。文件夹整个vuex的目录结构如下:
这里我新建了文件夹fetch用来编写所有的axios处理(这里是把axios封装了)并且在fetch文件夹下新建api.js文件:
import axios from 'axios'
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.baseURL = '后台接口公共前缀';
export function fetch(url, params) {
return new Promise((resolve, reject) => {
axios.post(url, params)
.then(response => {
resolve(response.data);
})
.catch((error) => {
reject(error);
})
})
}
export default {
// 获取我的页面的后台数据
mineBaseMsgApi() {
// alert('进入api.js')
return fetch('/api/getBoardList');
},
commonApi(url, params) {
return fetch(url, params)
}
}
在store的入口文件index.js中:
// 组装模块并导出 store 的文件
import Vue from 'vue'
import Vuex from 'vuex'
import mine from './modules/mine';
import club from './modules/club';
Vue.use(Vuex);
// 导出需要的模块
export default new Vuex.Store({
modules: {
club,
mine
}
});
一般在项目中,我们跟在交互的时候,无非是存数据和取数据。首先我们来看存数据:
1:在你需要请求后台数据并想使用vuex的组件中的created分发第一个dispatch:
created() {
// 保存ID到vuex,在购买页面使用
this.$store.dispatch('storeMovieID',this.$route.params.ID)——(“action名”,data);
api.commonApi('url','params')
.then(res => {
this.backMsg = res.data;
console.log(this.backMsg);
console.log('调用封装后的axios成功');
})
},
2:然后在store/modules下的对应模块js文件中,这里我使用的club.js文件中编写state、action和mutation(一般为了方便,我们会习惯的把action里面的名字以驼峰式命名,而mutation里面的命名,我们会采用全大写+下划线的命名方式)actions 用来触发mutations,action可以进行异步操作 ,在action里可以用commit提交mutations
const actions = {
// 保存ID storeMovieID为上面的"action名"
storeMovieID({ commit }, res) {
//此处是触发mutation的 STORE_MOVIE_ID为"mutation名"
commit(types.STORE_MOVIE_ID, res);
},
}
3:我们需要在type.js里面定义常量:
// ID 变量名(大写)=‘常量名(大写)' export const STORE_MOVIE_ID = 'STORE_MOVIE_ID';
4:通过mutation修改state中的数据:
//mutation名常量定义 并且需要在type.js文件下定义常量
const mutations = {
// 修改ID 中括号代表常量 [types.常量名]
[types.STORE_MOVIE_ID]( state, res) {
state.movieID = res; //state.数据名 = data
},
}
5:定义state数据:(数据名:初始值)
const state = { //采用 数据名:初始值的格式
contextPathSrc: '后台接口公共部分',
movieID: '',
}
最后所有的club.js完整内容如下:(当然getters是在取数据的时候用的,下面会讲)
import api from './../../fetch/api';
import * as types from './../types.js';
// state 是vuex 保存数据的,就相当于vue里的data
const state = {
contextPathSrc: '后台接口公共部分',
movieID: '',
}
const actions = {
// 保存ID storeMovieID为上面的"action名"
storeMovieID({ commit }, res) {
//此处是触发mutation的 STORE_MOVIE_ID为"mutation名"
commit(types.STORE_MOVIE_ID, res);
},
}
const getters = {
// 图片公共 src 的获取 getter函数:state=> state.数据名
getContextPathSrc: state => state.contextPathSrc,
// 获取ID
movieID: state => {
if(state.movieID == ''){
return localStorage.getItem('STORE_MOVIE_ID');
}else{
return state.movieID;
}
},
}
//mutation名常量定义 并且需要在type.js文件下定义常量 mutations 用来向state提交数据的,只能进行同步操作
const mutations = {
// 修改ID 中括号代表常量 我们可使用ES2015风格的计算属性命名功能来使用一个常量[types.STORE_MOVIE_ID]作为函数名
[types.STORE_MOVIE_ID]( state, res) {
state.movieID = res;
},
}
export default {
state,
actions,
getters,
mutations
}
下边我们要说的是取数据并且渲染到页面中,或者在页面函数中使用的方法:
1:组建中你需要导入如下:
import { mapGetters } from 'vuex';
在组件的计算属性中,如下:
computed: {
...mapGetters([//...函数名 使用对象展开运算符将此对象混入到外部对象中
'getContextPathSrc'
])
},
这里的getContextPathSrc函数,在页面中可直接使用,如果在函数中使用,需要this.getContextPathSrc
2:最后在store中写getters函数:
const getters = {
// 图片公共 src 的获取 getter函数:state=> state.数据名
getContextPathSrc: state => state.contextPathSrc,
}
最后在页面渲染就可以了。。这样就完成了交互。可能有人会留意到上面的getters里的movieID函数有个if判断,最后
return localStorage.getItem('STORE_MOVIE_ID')
有人会好奇为啥用localStorage……这个我们也不想用,只是如果你的页面如果用户强制刷新一下的话,会有个很奇怪的事发生,就是数据全部取不到,后来是没办法才加的。
最后,希望这些讲解,对于初学者来说有帮助……别被vuex的官网整的云里雾里(ps:我初学时也云里雾里整不明白偷笑)。好了,下班啦,更多的内容,会慢慢跟大家分享。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue2
# vuex
# axios
# 详解Vue 2.0封装axios笔记
# vue 里面使用axios 和封装的示例代码
# 浅谈在Vue-cli里基于axios封装复用请求
# vue axios 二次封装的示例代码
# vue 2.x 中axios 封装的get 和post方法
# 详解给Vue2路由导航钩子和axios拦截器做个封装
# Vue二次封装axios为插件使用详解
# Vue.js实战之使用Vuex + axios发送请求详解
# vue+vuex+axios+echarts画一个动态更新的中国地图的方法
# vue2.0学习之axios的封装与vuex介绍
# 是在
# 有个
# 人会
# 的是
# 雾里
# 云里
# 也不
# 好了
# 第一个
# 多个
# 可以用
# 下划线
# 不明白
# 没办法
# 并将
# 能有
# 然后再
# 将此
# 很奇怪
# 可直接
相关文章:
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
在线制作视频网站免费,都有哪些好的动漫网站?
建站之星收费标准详解:套餐费用及年费价格表一览
建站之星Pro快速搭建教程:模板选择与功能配置指南
香港网站服务器数量如何影响SEO优化效果?
动图在线制作网站有哪些,滑动动图图集怎么做?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
已有域名和空间如何搭建网站?
C#如何在一个XML文件中查找并替换文本内容
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何将凡科建站内容保存为本地文件?
如何选择高效稳定的ISP建站解决方案?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
哈尔滨网站建设策划,哈尔滨电工证查询网站?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何通过西部建站助手安装IIS服务器?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何获取PHP WAP自助建站系统源码?
微信推文制作网站有哪些,怎么做微信推文,急?
如何用PHP工具快速搭建高效网站?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站之星图片链接生成指南:自助建站与智能设计教程
济南企业网站制作公司,济南社保单位网上缴费步骤?
建站主机如何选?高性价比方案全解析
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
网站制作说明怎么写,简述网页设计的流程并说明原因?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
建站之星伪静态规则如何正确配置?
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何制作网站标识牌,动态网站如何制作(教程)?
内部网站制作流程,如何建立公司内部网站?
如何快速搭建高效服务器建站系统?
如何在服务器上三步完成建站并提升流量?
建站主机如何选?性能与价格怎样平衡?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
建站之星如何快速生成多端适配网站?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Swift开发中switch语句值绑定模式
如何获取上海专业网站定制建站电话?
已有域名如何快速搭建专属网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
建站之星2.7模板快速切换与批量管理功能操作指南
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。