
因为我之前的项目工程化程度很高,所以在刚开始用的时候因为惯性思维遇到了一些问题。
在 kbone + vue 的项目中可以使用 vue-router,但是web用一个router文件,小程序的 router 要另写。
我们在官方给出的 vue 项目模版的基础上做了一些目录调整:
现在我们要新增一个页面,文章详情页面, /article/:id ,首先我们需要在 src/article/mp/main.mp.js 中添加路由:
这里要注意:
tabbar 的配置主要写在 miniprogram.config.js 中的 generate 属性里:
这里要注意:
所有 tabbar 的页面在注册路由时,需要有一个 / 路径,比如,我洞卜们把 article 页面作为一个 tab 页,那么我们需要改写一下注册的路由写法:
因为在微信小程序中不能直接使用 axios ,需要用 wx.request ,而 web 端不能用 wx.request ,所以我们需要找一个在 web 端和小程序上都能进行正常网络请求的方案。这里我们采用了 axios + adapter ,即 axios-miniprogram-adapter 。
使用的时候注意做一下环境判断:
微信小程序和qq小程序都可以用官方推荐的 rpx 做适配,我们要做的是对 web 端做一下兼容。
我们可纳友穗以在 webpack 中的 sass-loader 里写一个全局变量 $isMini 做环境的区分,然后我们就可以写一个转换设计稿尺寸的方法,在这个方法里借助前面注册的变量进行尺寸转换(假设设计稿是 750px 宽的):
这里要注意的是 rpx 和 px 的转换关系,以 iphone6 为例: 750rpx = 375px。
微信小程序也支持 rem,设置的时候需要在 miniprogram.config.js 的 global 字段中配置:
因为我们用的是 sass,而官方模版用的是 less,这里就顺便提一下,如果要用 sass,记得要在 build 目录下的各个 webpack 文件中进行对应的 loader 配置哦。
这个库可以在小程序和 web 端都能正常使用。
要注意的是使用的时候,不要忘记引入样式文件哦:
刚接触小程序的朋友还可以看一下微信原生组件的使用,因为 kbone-ui 的文档写的不是很详细,有些还是结合原生组件的文档好理解一点。
包括内置组件的使用,也可以结合原生组件的文档使用。
微信小程序现在支持单页面自定义导航,但是 kbone 如果要自定义导航,所有页面的导航都需要自己写。
导航条分为两部分,statusbar(显示时间的部分)和 titlebar (标题栏)。
statusbar 的高度:
titlebar 的高度:
导航条的高度告指:
如果是用在微信小程序上,那么现在这两个 api 的使用时机不需要特别注意,但如果是同时要用在qq小程序上,就需要注意使用的时机啦,如果直接在计算属性或者 created 中使用会出现报错,取不到内容的情况。
我是在created 中用了 settimeout 延迟使用这两个 api来解决这个问题的。
getMenuBarRect 这个方法是参考了网上找到的一个作者的方法,做了点修改,修改后可以正常使用,但是有个问题,因为 systeminfo 一开始取不到值,会用默认值,后来取到正确值时自定义头部的高度会有个突变,就是会跳一下。这个还没有优化。
比如,自定义分享内容的path要写全;
appid在微信小程序里叫appid,在qq小程序配置里叫qqappid;
微信小程序图片可以只设置宽度不设置高度,这样不会变形;
qq小程序图片只设置宽度不设置高度,图片会显示不出来,需要加属性 mode="widthFix" ;
页面的下拉刷新、加载中提示、上拉加载更多等配置需要在miniprogram.config.js 里配置;
全局滚动事件也需要先配置,才能用 window.addEventListener('scroll', () =>{...})
而且要取到 scrolltop 要用 document.body.$$getBoundingClientRect ;
总而言之呢就是多看文档、仔细看文档啦。
window.open相当于 navigateTo,页面打开方式为 open;
window.location.href相当于redirectTo,页面打开方式为 jump;
不可否认它确实有很多方便的地方,但是在样式方面和组件支持方面简直令人抓狂。另外,编译速度和开发者工具都很慢。真的是一言难尽。今天又是修bug的一天,修到吐。
在uniapp中,使用axios进行请求时,uniapp无法使用axios的适租岁袜配器,需要基于uni.request来定义适配器。安装完成axios后在项目utils目录下雀慧建一个axios文件夹
文中根目录代表utils中的axios文件夹
在根目录新建一个axios.js文件,在该文件弊激中配置一个新的axios
npm install axios --save
npm install qs
import 'amfe-flexible'
import store from './store/store.js'
// 在http.js中引入axios
import axios from 'axios'// 引入axios
import { Message } from "element-ui"
import QS from 'qs'// 引入qs模块,用来序列化post类型的数据,后面会提到
import store from '../store/store'
import base from './base'
import { bus } from './api'
// 通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新指隐等。
// post请求的时候,我们需要加上一个请求头,所以可以在这里进行一个默认的设置,即设置post的请求头为application/x-www-form-urlencodedcharset=UTF-8
const instance = axios.create({
baseURL: base.sq,
timeout: 1000,
headers: {'Content-Type': 'application/x-www-form-urlencodedcharset=UTF-8'}
})
// 请求拦截器
// 每次发送请求信模之前判断vuex中是否存在token
// 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
instance .interceptors.request.use(
config =>{
const token = sessionStorage.getItem("token")
token &&(config.headers.Authorization = token)
// const token = store.state.token
// console.log(store.state.token)
// token &&(config.headers.Authorization = token)
store.state.loading = true
return config
},
error =>{
console.log('请求超时,请稍后重试!')
return Promise.error(error)
}
)
// 添加一个响应拦截器
instance .interceptors.response.use(
// 请求成功
res =>{
store.state.loading = false
// 返回的状态码
// console.log(res.data , res.data.status)
if (res.data &&res.data.status) {
if (parseInt(res.data.status) === 401) {
//未登滑逗缓录
Message({
showClose: true,
message: "请登录...",
type: "error",
duration: 2000
})
setTimeout(function(){
bus.$emit('goto', '/login')
},2000)
}else if (parseInt(res.data.status) === 402){
Message({
showClose: true,
message: res.data.err,
type: "error",
duration: 2000
})
}
}
return res
// res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
},
// 请求失败
error =>{
const {
response
} = error
if (response) {
// 请求已发出,但是不在2xx的范围
if (error.response.status == '400' || error.response.status == '404') {
Message({
showClose: true,
message: "请求方式出错",
type: "error",
duration: 2000
})
} else if (error.response.status == '403') {
Message({
showClose: true,
message: '您没有此权限',
type: "error",
duration: 2000
})
} else if (error.response.status == '402') {
Message({
showClose: true,
message: '登录失败,请检查账号密码!',
type: "error",
duration: 2000
})
}
store.state.loading = false
// Do something with response error
return Promise.reject(error)
} else {
// 处理断网的情况
// eg:请求超时或断网时,更新state的network状态
// network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
// 关于断网组件中的刷新重新获取数据,会在断网组件中说明
Message({
showClose: true,
message: '断网了,请检查网络链接',
type: "error",
duration: 2000
})
}
}
)
/**
* 封装get方法
* @param url
* @param params
* @returns {Promise}
*/
export function get(url, params) {
return new Promise((resolve, reject) =>{
instance.axios.get(`${url}`, {
params: params
})
.then(res =>{
resolve(res)
})
.catch(err =>{
reject(err)
})
})
}
/**
* 封装post请求
* @param url
* @param params
* @returns {Promise}
*/
export function post(url, params) {
return new Promise((resolve, reject) =>{
instance.axios.post(`${url}`, QS.stringify(params))
.then(res =>{
resolve(res)
}, err =>{
reject(err)
})
})
}
/**
* 封装patch请求
* @param url
* @param params
* @returns {Promise}
*/
export function patch(url, params) {
return new Promise((resolve, reject) =>{
instance.axios.patch(`${url}`, QS.stringify(params))
.then(res =>{
resolve(res)
}, err =>{
reject(err)
})
})
}
/**
* 封装put请求
* @param url
* @param params
* @returns {Promise}
*/
export function put(url, params) {
return new Promise((resolve, reject) =>{
instance.axios.put(`${url}`, QS.stringify(params))
.then(res =>{
resolve(res)
}, err =>{
reject(err)
})
})
}
import Vue from 'vue'
import axios from 'axios'
import {get,post,fetch,patch,put} from './http'
//定义全局变量
Vue.prototype.$get=get
Vue.prototype.$post=post
Vue.prototype.$patch=patch
Vue.prototype.$put=put
/**
* api接口统一管理
*/
// 获取token跳转页面
export const bus = new Vue()
//bus是判断无token情况下请求数据,会跳转登录页面方法在http.js下面的$emit,$on设置在index.vue或者app.vue里面都可以
//$on
created(){
bus.$on('goto', (url) =>{
if (url === "/login") {
sessionStorage.removeItem('token')
}
this.$router.push(url)
})
},
// get
export const tTable = data =>get('/table', data)
// post
export const Terrar = data =>post('/errar', data)
/**
* 接口域名的管理
*/
const base = {
sq: 'https://www.xxxxx.com/api ',
}
export default base
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)