小程序有些图片无法作为背景使用,在css里面写提示“本地资源图片无法通过wxss获取”,有些小一些的又可以,图稍微大一些就不行
background:url('../static/image.png')
解决方法:
1、在<view>
上40k以上的图片虽然本地可以显示,但发布后还是空白的。40k以上的还是得用cdn
2、用cdn网图
3、base64图
uni-app,api的地址为: https://uniapp.dcloud.io/api/
下载图片
uni.downloadFile(object)
uniapp上的文档地址
wx.downloadFile({
url: object.url,
header: {
"X-Requested-With": "XMLHttpRequest",
Accept: "audio/mp3",
Authorization: "Bearer " + object.accessToken
},
success(res){
object.url = res.tempFilePath;
},
fail(e){
console.log("downloadFile failed", e);
}
});
上传图片,选择图片
uni.uploadFile(object),chooseImage(object)
uniapp上的文档地址
// 上传前先获取权限
upload(){
uni.authorize({
scope: 'scope.camera',
success:(res)=> {
if (res.errMsg == 'authorize:ok') {
console.log('选择上传');
this.uploadImg();
}
},
fail:(err)=> {
uni.showToast({
icon: 'none',
title: "请先允许小程序获取相机访问权限"
})
}
})
},
uploadImg() {
uni.chooseImage({
count: 1, //数量默认9
sizeType: ['original', 'compressed'],
sourceType: ['album','camera'],
success: (chooseImageRes) => {
const tempFilePaths = chooseImageRes.tempFilePaths;
console.log(tempFilePaths);
// 假设上传成功
uni.showLoading({
title:'上传中...'
})
uni.uploadFile({
url: this.uploadParams.url,
filePath: tempFilePaths[0],
name: 'userAvatar',
formData: {
policy: this.uploadParams.policy,
Signature: this.uploadParams.Signature
},
success:res=> {
console.log(res);
let data = JSON.parse(res.data)
console.log(data.data);
if (data.status === 'OK') {
let url = data.data.location + data.data.filepath
this.imgList = [{url:url}]
this.submitFlag= true
uni.hideLoading()
} else {
uni.showToast({
title: res.message,
icon: "none",
duration: 2000
})
}
},
fail:(err)=> {
console.log(err);
},
})
}
});
},
保存图片到本地手机设备
saveImageToPhotosAlbum(object)
saveImg(url){
const that = this
uni.downloadFile({
url,
success: res => {
if(res.code == '100') {
filePath: res.tempFilePath,
success: function() {
uni.showToast({
title: res.message,
icon: "none",
duration: 2000
})
},
fail: function() {}
}
}
})
}
小程序图片放大预览功能
wx.previewImage(object)
uni.previewImage(object)
uniapp官方文档
previewImg() {
let urls = []
urls.push(this.url)
uni.previewImage({
current: 0,
urls: urls //urls必须是个数组
})
},
扫码功能
uni.scanCode(object)
uniapp官方文档
uni.scanCode({
onlyFromCamera: false, //是否只能从相机扫码,不允许相册选择图片,非必填,默认false
scanType: [], // 扫码类型,非必传,值:二维码:qrCode,一维码:barCode,DataMatrix商品矩阵条码:datamartrix,高密度高信息含量二维码pdf417:pdf417
successs: function(res) {
console.log('条码类型:', res.scanType)
console.log('条码内容:', res.result)
console.log('扫码得出的字符集:', res.charSet)
console.log('结果为合法应用的路径信息:', res.path)
},
fail: function(res) {
console.log('接口调用失败(识别失败、用户取消等情况触发)')
},
complete: function(res) {
console.log('接口调用结束,无论成功失败都会执行')
}
})
模态窗,增加自定义内容
自定义组件使用模态窗,content里要添加代码的话,必须使用html的语法,并且在标签上写css,不然v-html(支持小程序,app和h5)在小程序里(仅小程序)解析成rich-text,不解析view标签之类的代码,且不支持rpx像素单位(结构就当是最基础的html4即可)
一般支持的标签有
rich-text 支持的标签列表
调用uni-app组件库里的 uni-popup-dialog
this.$refs['model'].showModel({
title: `标题`,
content: '<div style="width:220px; padding:5px 0">内容</div>',
success: ()=>{
}
})
canvas图层 层级问题,每次canvas都最高层显示,盖住了模态窗,解决方案
用canvas画了个圆环的百分比 比例对比图,类似echar里的环形进度条,画完页面别的fixed/model/tips/porp窗口都盖不住canvas,
试过官方的<cover-view>
,微信小程序开发工具里可以显示,放到手机里,这个标签就无了,解决方式不太靠谱
//扯犊子说明,不好使
微信小程序文档中有提供cover-view组件,能覆盖canvas,map,video,camera等原生组件。但是也有一定的限制。比如:cover-view中只支持嵌套cover-view、cover-image,button。弊端是不可以使用input组件。
最终,通过canvas转image,解决
<canvas v-if="list[0].redarImg== ''" class="canvas" canvas-id="myCanvas1"></canvas>
<image v-else :src="list[0].redarImg" style="width: 100px; height: 100px;" />
data(){
return{
list: [
{
sum: 100,
val: 30,
val1: 40,
valArr: 10,
canvas: "myCanvas2",
title: "模拟测试",
redarImg: ''
},
],
}
}
Progressbar(canvas) {
//根据后台获取到的数据计算比例
let sum = canvas.sum == 0 ? 1 : canvas.sum; // 总计
let val = parseFloat(((canvas.val / sum) * 2).toFixed(2)); //实际1
let val1 = parseFloat(((canvas.val1 / sum) * 2).toFixed(2)); //实际2
let valArr = parseFloat(((canvas.valArr / sum) * 2).toFixed(2)); //实际3
const ctx = uni.createCanvasContext('myCanvas1'); //拿到canvas对象(自己的定义的canvas-id)
// 开始绘制第一条路径 总数 红色
ctx.beginPath(); // 开始绘制路径
ctx.arc(50, 50, 45, 0, 2 * Math.PI); // arc画圆
ctx.setStrokeStyle("#f2f2f2"); // 线条颜色
ctx.setLineWidth(7); // 线条宽度
ctx.stroke(); // 绘制成线条(fill()是填充为饼图)
// 开始绘制第二条路径 成交 橘色
ctx.beginPath();
ctx.arc(50, 50, 45, -Math.PI / 2, val * Math.PI - Math.PI / 2);
ctx.setStrokeStyle("#68B881");
ctx.setLineWidth(7);
ctx.stroke();
ctx.beginPath();
ctx.arc(50, 50, 45, val * Math.PI - Math.PI / 2, (val + val1) * Math.PI - Math.PI / 2);
ctx.setStrokeStyle("#F3A21B");
ctx.setLineWidth(7);
ctx.stroke();
ctx.beginPath();
ctx.arc(50, 50, 45, (val + val1) * Math.PI - Math.PI / 2, (val + val1 + valArr) * Math.PI - Math.PI / 2);
ctx.setStrokeStyle("#4C97D9");
ctx.setLineWidth(7);
ctx.stroke();
ctx.draw(false, (()=>{
setTimeout(()=>{
this.handleCanvarToImg(canvas)
}, 500)
}));
},
handleCanvarToImg(canvas) {
uni.canvasToTempFilePath({
x: 0,
y: 0,
width: 100,
height: 110,
canvasId: canvas.canvas,
success: function(res) {
let n = {redarImg: res.tempFilePath}
Object.assign(canvas, n)
}
})
},
uniapp里的editor无法赋值 (2021/09/24)
得益与老太太们的强烈要求,早上需要做编辑框editor的内容备份功能,但是发现给editor赋值无法生效
查阅文档得知,可以在初始化的时候给setContents,
editor富文本编辑器
<editor id="editor1" class="ql-container" :read-only="false"
@ready="onEditorReady('1')"
@input="(e)=>editorInput('1', e)"
@focus="editorFocus"
@blur="editorBlur"
@statuschange="onStatusChange"
showImgToolbar></editor>
onEditorReady(index) {
let that = this
uni.createSelectorQuery().select('#editor' + index).context((res) => {
this.editorCtx = res.context
this.editorCtx.setContents({
html: that['content'+index]
})
}).exec()
},
uniapp 金额正则验证
<input type='digit' @input="keyinput" v-model="qian" placeholder="0.00">
keyinput(e) {
let that = this
let price = e.detail.value.toString()
console.log('price old is1111', price)
price = price.replace(/[^\d.]/g, ""); //清除“数字”和“.”以外的字符
price = price.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的
price = price.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
price = price.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
if (price.indexOf(".") < 0 && price != "") { //以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额
price = parseFloat(price);
} else if (price.indexOf(".") == 0) {//首为小数点,补全
price = price.replace(/[^$#$]/g, "0.");
price = price.replace(/\.{2,}/g, ".");
}
console.log('price is', price)
that.$nextTick(function() {
//限制位数 ---暂时:'有小数点时,最大长度为7位,没有则是5位'
// that.maxLength = maxLength == -1 ? 5 : 7
that.qian = price
})
},