mpvue+vuex搭建小程序详细教程(完整步骤)
作者:卫夫子 发布时间:2024-05-02 17:09:20
本文介绍了mpvue+vuex搭建小程序详细教程(完整步骤),分享给大家,具体如下:
源码
mpvue-vuex-demo
构成
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钩子执行要早得多(小程序运行时)
来源:https://blog.csdn.net/qq_31393401/article/details/80728523


猜你喜欢
- 承上启下上一篇文章我们介绍了 RNN 相关的基础知识,现在我们介绍文本生成的基本原理,主要是为了能够灵活运用 RNN 的相关知识,真实的文本
- python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,
- 第一种:获取不带后缀的文件名,直接上代码:就是直接用basename()函数就可以返回路径中的文件名部分,其语法是“basename(pat
- BIT[(M)]位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。TINYINT[(M)] [UNSIGNED]
- 首先,我的索引结构是酱紫的。
- 前言虽然标题是全站,但目前只做了等级 top 100 直播间的全天弹幕收集。弹幕收集系统基于之前的B 站直播弹幕姬 Python 版修改而来
- 背景:python函数库scipy的quad、dblquad实现一维二维积分的范例。需要注意dblquad的积分顺序问题。代码:import
- 在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容
- <div id="outer" style="background:#099"> cli
- 关于 HTTP 协议HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信。HTTP 的
- 本文实例讲述了Django框架静态文件使用/中间件/禁用ip功能。分享给大家供大家参考,具体如下:静态文件一、静态文件的使用静态文件:网页中
- df.sort_index()实现按索引排序,默认以从小到大的升序方式排列,如希望按降序排列,传入ascending = Falseimpo
- 本文实例讲述了python中引用与复制用法。分享给大家供大家参考。具体分析如下:在python中,任何不可变对象是传值的,而可变对象是传引用
- 由于个人能力有限,文章中难免会出现错误或遗漏的地方,敬请谅解!同时欢迎你指出,以便我能及时修改,以免误导下一个看官。最后希望本文能给你带来一
- 本文实例讲述了JS实现针对给定时间的倒计时功能。分享给大家供大家参考,具体如下:有时候,网站需要一个倒计时的特效来庆祝某些特别的日子。自己也
- 本文实例讲述了C#使用ODBC与OLEDB连接数据库的方法。分享给大家供大家参考,具体如下:using System;using Syste
- 前言:大家都知道,只要进行数据交互,肯定就要去请求接口,数据请求的方式有vue-resource axios fetch
- 本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式。分享给大家供大家参考,具体如下:GIL(全局解释器锁)是C
- 前言以下述环境为例:python=3.7pytorch=1.7.1torchvision==0.8.2cudatoolkit=10.1pyt
- Etag是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Co