mpvue+vuex搭建小程序详细教程(完整步骤)
程序员文章站
2022-04-10 22:10:03
本文介绍了mpvue+vuex搭建小程序详细教程(完整步骤),分享给大家,具体如下:
源码
构成
1、采用mpvue 官方脚手架搭建项目底层结构
2、采...
本文介绍了mpvue+vuex搭建小程序详细教程(完整步骤),分享给大家,具体如下:
源码
构成
1、采用mpvue 官方脚手架搭建项目底层结构
2、采用fly.js 作为http请求库
3、引入mpvue-router-patach,以便在mpvue小程序中能使用vue-router的写法
目录结构
├── src // 我们的项目的源码编写文件 │ ├── components // 组件目录 │ ├── common //静态资源 │ │ └── font // iconfont图标 │ │ └── img // 图片 │ │ └── js // js │ │ │└── mixins.js // js │ │ │└── tips.js // js │ │ │└── utils.js // js │ │ └── scss // scss样式 │ │ │└── base.scss // 自定义样式 │ │ │└── icon.scss // iconfont图标 │ │ │└── index.scss // 基础汇总 │ │ │└── mixin.scss // 混合等工具样式 │ │ │└── reset.scss // 初始化样式 │ │ │└── variable.scss // 全局主题色样式 │ ├── http //http请求配置文件 │ │ └── api // 接口调用文件 │ │ └── config //fly 配置文件 │ ├── pages //项目页面目录 │ ├── components //项目复用组件目录 │ ├── store //状态管理 vuex配置目录 │ │ └── actions.js //actions异步修改状态 │ │ └── getters.js //getters计算过滤操作 │ │ └── mutation-types.js //mutations 类型 │ │ └── mutations.js //修改状态 │ │ └── index.js //我们组装模块并导出 store 的地方 │ │ └── state.js //数据源定义 │ ├── untils //工具函数目录 │ │ └── index.js │ ├── app.vue // app入口文件 │ ├── main.js // 主配置文件 │ ├── config.js // host等配置
快速创建一个mpvue项目
# 全局安装 vue-cli $ npm install -g vue-cli # 创建一个基于 mpvue-quickstart 模板的新项目,记得选择安装vuex $ vue init mpvue/mpvue-quickstart mpvue-demo # 安装fly $ npm i flyio --save # 安装依赖 $ cd mpvue-demo $ npm i # 启动构建 $ npm run dev
配置fly
1、配置公共设置
src/http/config.js
/* fly配置文件 by:david 2018.6.14 */ //引入 fly var fly = require("flyio/dist/npm/wx") var fly = new fly; import config from '@/config' //配置请求基地址 // //定义公共headers // fly.config.headers={xx:5,bb:6,dd:7} // //设置超时 fly.config.timeout = 20000; // //设置请求基地址 fly.config.baseurl = config.host //添加请求拦截器 fly.interceptors.request.use((request) => { //给所有请求添加自定义header request.headers["x-tag"] = "flyio"; //打印出请求体 // console.log(request.body) //终止请求 //var err=new error("xxx") //err.request=request //return promise.reject(new error("")) //可以显式返回request, 也可以不返回,没有返回值时拦截器中默认返回request return request; }) //添加响应拦截器,响应拦截器会在then/catch处理之前执行 fly.interceptors.response.use( (response) => { //只将请求结果的data字段返回 return response.data }, (err) => { //发生网络错误后会走到这里 //return promise.resolve("ssss") } ) // vue.prototype.$http=fly //将fly实例挂在vue原型上 export default fly
2、配置个性设置
src/http/api.js
import fly from './config' import qs from 'qs' import config from '../config' const host = config.host; const appkey = config.appkey; const appid = config.appid; /** * 接口模版====post * * export const test = params => {return fly.post(`${root}/xx/xx`, qs.stringify(params))}; * * 接口模版====get * * export const test1 = function(){return fly.get(`${root}/api/getnewslist`)} * * * 用法: * 在 页面用引入 test * import {test} from '../../http/api.js' * * test(params).then(res=>{ console.log(res) }) */ // 通用的get请求 export const get = (params) => { return fly.get(`${host}${params.url}`, qs.stringify(params.data)) }; // 通用的post请求 export const post = (params) => { return fly.post(`${host}${params.url}`, qs.stringify(params.data)) }; // 封装的登录请求,根据后台接收方式选择是否加qs.stringify export const login = params => { return fly.post('/login', params) };
host配置
config.js
const host = 'http://xxx.xxx'; const appid = ''; const appkey = ''; const config = { host, appid, appkey, } export default config
配置vuex
1、目录结构
│ ├── store //状态管理 vuex配置目录 │ │ └── actions.js //actions异步修改状态 │ │ └── getters.js //getters计算过滤操作 │ │ └── mutation-types.js //mutations 类型 │ │ └── mutations.js //修改状态 │ │ └── index.js //我们组装模块并导出 store 的地方 │ │ └── state.js //数据源定义
2、main.js中引入store, 并绑定到vue构造函数的原型上,这样在每个vue的组件都可以通过this.$store访问store对象。
import store from './store/index' vue.prototype.$store=store;
3、定义初始变量store/state.js
const state={ openid: '', } export default state
4、mutation类型
方便检测错误和书写,一般写方法
export const set_open_id = 'set_open_id'
5、store/mutations.js
写处理方法
import * as types from './mutation-types' const matations={ /** * state:当前状态树 * v: 提交matations时传的参数 */ [types.set_open_id] (state, v) { state.openid = v; }, } export default matations
6、store/index.js
汇总配置
import vue from 'vue'; import vuex from 'vuex'; import state from './state' import mutations from './mutations' vue.use(vuex); export default new vuex.store({ state, mutations, })
使用vuex
ps:没有用到复杂计算,因此没有引入getters.js和actions.js
栗子:app.vue
<script> import { login } from '@/http/api' import { mapstate, mapmutations } from 'vuex' import { set_open_id } from './store/mutation-types' const app = getapp(); export default { data: { globaldata: {} }, computed: { ...mapstate([ 'openid' ]) }, methods: { ...mapmutations({ setopenid: 'set_open_id' }), // 使用了async+await的语法,用同步的方式写异步脚本 async login(code) { let _this = this; try { const resdata = await login({ code: code }); if (resdata.returncode == 200) { _this.setopenid(resdata.data.accountid) } } catch (err) { console.error(err); } }, // 拆分wx.login,结构更清晰 _login() { let _this = this; wx.login({ success(res) { if (res.code) { console.log('wx.login成功,code:', res.code); let code = res.code; _this.login(code) } else { _this.$tips.toast('微信登录失败') } } }); } }, onlaunch() { this._login() } } </script>
使用vuex-persistedstate,使vuex状态持久化(缓存到本地)
store/index.hs的export default中添加配置:
// 引入vuex-persistedstate,将vuex的数据持久化到本地 export default new vuex.store({ state, mutations, getters, actions, plugins: [ createpersistedstate({ storage: { getitem: key => wx.getstoragesync(key), setitem: (key, value) => wx.setstoragesync(key, value), removeitem: key => {} } }) ] })
tips
- 遇到安装依赖后,运行项目,但dist下没有app.js等入口文件的,将package.json里的mpvue-loader的版本前的^去掉,删除依赖,重新安装即可
- 在onload周期内执行获取数据等初始化操作,因为mpvue的created钩子执行要早得多(小程序运行时)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 把我小鸡打了一顿
下一篇: 面向切面编程(AOP)