直接挂this上 [代码]Component({[代码][代码] [代码][代码]created() {[代码][代码] [代码][代码]this[代码][代码].v = 1[代码][代码] [代码][代码]}[代码][代码]})[代码]
用户不可见数据不建议进行 setData,那怎么定义当前页面的全局变量提问题步骤这么多!? 其实我就想知道当前页面的全局变量写在哪里? 不要提globalData,这个是整个app的全局变量 不要用setData ,因为我说的全局变量是不需要显示在页面上的 补充一下: 我说的是当前页面的全局变量,就是我在index.js里面定义的,在整个index.js里面都能使用。其他的js都不能使用的那种 ヽ(ー_ー)ノ
2019-02-18老铁,promise、async function了解一下,别把无知当个性,还有,这里也吐槽一下wx的api,为啥wx的api一开始不是promise来设计的,为啥小程序内部不自带regeneratorRuntime,看来小程序的架构也是垃圾中的战斗机呀
吐槽小程序异步API接口调用方式- 需求的场景描述(希望解决的问题) 小程序提供API接口大部分都是异步接口,但是有些接口又依赖于其他接口的调用结果,这就造成为了实现一个接口调用需求而进行多层代码嵌套,代码相当不美观,也不利于开发者维护。 例如:要获取当前连接的WiFi信息,则需要三个API的嵌套调用来实现获取WiFi信息,然后再与服务器进行交互: [代码]wx.getNetworkType({ [代码][代码]//获取当前网络类型[代码] [代码] [代码][代码]success(res) {[代码][代码] [代码][代码]const networkType = res.networkType[代码][代码] [代码][代码]if[代码] [代码](networkType === [代码][代码]'wifi'[代码][代码]) {[代码][代码]//判断是wifi环境[代码][代码] [代码][代码]wx.startWifi({ [代码][代码]//初始化WiFi[代码][代码] [代码][代码]success(res) {[代码][代码] [代码][代码]console.log(res.errMsg)[代码][代码] [代码][代码]wx.getConnectedWifi({ [代码][代码]//获取WiFi信息[代码][代码] [代码][代码]success(res) {[代码][代码] [代码][代码]console.log(res.errMsg)[代码][代码] [代码][代码]wx.request({ [代码][代码]//信息获取成功,与服务器进行交互[代码][代码] [代码][代码]url: [代码][代码]'test.php'[代码][代码], [代码][代码]//仅为示例,并非真实的接口地址[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]x: [代码][代码]''[代码][代码],[代码][代码] [代码][代码]y: [代码][代码]''[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success(res) {[代码][代码] [代码][代码]console.log(res.data)[代码][代码] [代码][代码]//服务器返回成功后进行页面处理[代码][代码] [代码][代码]//TODO[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码]})[代码] 以上代码除了繁琐不美观之外,还不利于维护 - 希望提供的能力 希望官方团队能将异步API实现可指定异步或同步,或者是将API封装成Promise对象,这样开发者可方便自由的通过Promise对象来模拟异步同步,还可以简化接口嵌套,简化代码,方便维护。 之所以希望官方团队将异步API封装成Promise对象而不是自己去封装,是基于良好的版本升级的考虑,如果是自己去封装,万一某次版本升级将某些API改变或者废弃,或者新增某些API,这对于开发者来说,去维护自己的封装也将是很大的开发成本。 既然小程序支持ES6的转码,那么,个人认为,如果官方团队能将所有的异步API升级为返回Promise对象,那将是对开发者相当友好的一件事,会增加开发者的热情和积极性,同时也更利于开发者维护代码。 - 补充: 其实我觉得学习promise的简单使用的成本并不是太高,尤其是跟多层嵌套调用、不利于维护等比起来,真心个人感觉这点学习成本很低。 当然,也不是没有解决办法, 比如可以通过在全局的app.js中增加一个配置项,用来指定是否全局开启异步API的promise调用方式,或者是在单个API中增加一个配置项,来指定当前API是使用原本的异步方式还是使用promise方式。 这只是个人建议,仅供参考。但我真心觉得异步API使用promise肯定会越来越成为更多开发者的呼唤和心声的!
2018-11-09客户端一般不做图片处理,或者只做简单处理,原因是服务端可以保留更好质素的图片,以便以后在碎片化的使用场景下可以更灵活处理
小程序h5图片压缩问题(紧急求取,老板只给24小时,夺命call)请教各位大神,本人有个项目在小程序中运行h5页面,需要使用h5进行图片压缩,目前大量用户遇到了安卓上压缩后的图片是黑图(设置底色为白色),ios上传的是白图,部分oppo手机的图片为上半张图正常,下半张图类似绿色蒙层,源码如下: let canvas = document.createElement("canvas"); let ctx = canvas.getContext('2d'); let initSize = img.src.length; let width = img.width; let height = img.height; //如果图片大于四百万像素,计算压缩比并将大小压至400万以下 let ratio; if ((ratio = width * height / 4000000) > 1) { ratio = Math.sqrt(ratio); width /= ratio; height /= ratio; } else { ratio = 1; } canvas.width = width; canvas.height = height; // 铺底色 ctx.fillStyle = "#fff"; ctx.fillRect(0, 0, canvas.width, canvas.height); //如果图片像素大于100万则使用瓦片绘制 let count; if ((count = width * height / 1000000) > 1 && Util.isIOS()) { count = Math.ceil(Math.sqrt(count)); //计算要分成多少块瓦片 // 计算每块瓦片的宽和高 var nw = ~~(width / count); var nh = ~~(height / count); // 瓦片canvas for (var i = 0; i < count; i++) { for (var j = 0; j < count; j++) { let tCanvas = document.createElement("canvas"); let tCtx = tCanvas.getContext("2d"); tCanvas.width = nw; tCanvas.height = nh; tCtx.drawImage(img, Math.ceil(i * nw * ratio), Math.ceil(j * nh * ratio), Math.ceil(nw * ratio), Math.ceil(nh * ratio), 0, 0, nw, nh); ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh); } } } else { ctx.drawImage(img, 0, 0, width, height); } let data = canvas.toDataURL('image/jpeg', 0.7); 跪谢各位大神,急急急!!!
2018-10-24没办法了,科科,touchstart从视图层到data层需要通过postMessage或者类似方案去通讯,反之亦然,小程序的架构根本没法做到流畅的拖动动画,死心吧
setData有延迟老板要把我炒了- 需求的场景描述(希望解决的问题) 要做一个左右滑动的刷新动画 开发者工具里还好点,但是手机上调试时 scroll-view的scrolltoupper和scrolltolower里setdata有延迟 view的话touchstart和toucheend里setdata也有延迟 滑动时左右两边弹性框延迟出现 老板说做不出来就要把我炒了 - 希望提供的能力 跟上下拉刷新一样的左右拉刷新
2018-10-23努比亚z11无法播放
视频videoContext play方法在安卓上无效使用wx.createVideoContext创建ctx对象,点击按钮执行ctx.play()方法,在iOS可以触发播放,在安卓上则不行。 以及,在调试工具中输出ctx对象,发现原型链上没有ctx方法。 另外,亲测: wx.createVideoContext的构造时机没问题,在onReady和在onLoad中构造都一样 视频本身没有问题,在浏览器中可以访问。 基础库版本1.7.0,微信版本6.5.22,不会是版本过低的问题。 把video-compnent的hidden改为false,也不会解决问题。 以及,重点是:上上周这样的写法是没有问题的。。。这周就不行了 wxml: [代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"section tc"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"video-item"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码][代码] [代码][代码]data-id[代码][代码]=[代码][代码]"{{ video.id }}"[代码][代码] [代码][代码]catchtap[代码][代码]=[代码][代码]"handleTap"[代码][代码] [代码][代码]class[代码][代码]=[代码][代码]"video-item-discover"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]image[代码] [代码]class[代码][代码]=[代码][代码]"video-item-discover-bg"[代码] [代码]src[代码][代码]=[代码][代码]"{{ video.preview_pic_url }}"[代码] [代码]/>[代码][代码] [代码][代码]<[代码][代码]image[代码] [代码]class[代码][代码]=[代码][代码]"video-item-btn"[代码] [代码]src[代码][代码]=[代码][代码]"/images/write-question/ic-reload@3x.png"[代码] [代码]/>[代码][代码] [代码][代码]view[代码][代码]>[代码][代码][代码][代码][代码][代码] [代码][代码][代码][代码][代码][代码][代码][代码] [代码][代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"video-component"[代码] [代码]hidden[代码][代码]=[代码][代码]"{{ true }}"[代码][代码]>[代码][代码][代码][代码][代码][代码] [代码][代码]<[代码][代码]video[代码][代码][代码][代码][代码][代码] [代码][代码]id[代码][代码]=[代码][代码]"{{ video.id }}"[代码][代码][代码][代码][代码][代码] [代码][代码]data-id[代码][代码]=[代码][代码]"{{ video.id }}"[代码][代码][代码][代码][代码][代码] [代码][代码]controls[代码][代码]=[代码][代码]"{{ true }}"[代码][代码][代码][代码][代码][代码] [代码][代码]bindplay[代码][代码]=[代码][代码]"handleVideoPlayEvent"[代码][代码][代码][代码][代码][代码] [代码][代码]bindpause[代码][代码]=[代码][代码]"handleVideoPauseEvent"[代码][代码][代码][代码][代码][代码] [代码][代码]bindended[代码][代码]=[代码][代码]"handleVideoEndedEvent"[代码][代码][代码][代码][代码][代码] [代码][代码]bindfullscreenchange[代码][代码]=[代码][代码]"handleVideoFullScreenEvent"[代码][代码][代码][代码][代码][代码] [代码][代码]src[代码][代码]=[代码][代码]"{{ video.cdn_url }}"[代码][代码][代码][代码][代码][代码] [代码][代码]poster[代码][代码]=[代码][代码]"{{ video.preview_pic_url }}"[代码] [代码]/>[代码][代码][代码][代码][代码][代码] [代码][代码]view[代码][代码]>[代码][代码][代码][代码][代码][代码][代码][代码][代码][代码] [代码][代码]view[代码][代码]>[代码][代码][代码][代码][代码][代码][代码][代码][代码][代码][代码] [代码][代码]<[代码][代码]view[代码] [代码]class[代码][代码]=[代码][代码]"btn-area"[代码][代码]>[代码][代码][代码][代码][代码][代码][代码][代码] [代码][代码]<[代码][代码]input[代码] [代码]bindblur[代码][代码]=[代码][代码]"bindInputBlur"[代码][代码]/>[代码][代码][代码][代码][代码][代码][代码][代码] [代码][代码]<[代码][代码]button[代码] [代码]bindtap[代码][代码]=[代码][代码]"handleTap"[代码] [代码]data-id[代码][代码]=[代码][代码]"{{ Num }}"[代码][代码]>点击播放button[代码][代码]>[代码][代码][代码][代码][代码][代码][代码] [代码][代码]view[代码][代码]>[代码][代码][代码][代码][代码][代码][代码][代码][代码][代码]>[代码][代码][代码][代码][代码]index.js [代码]const config = {[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]Num: 12345,[代码][代码] [代码][代码]video: {[代码][代码] [代码][代码]id: 12345,[代码][代码] [代码][代码]preview_pic_url: [代码][代码]'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000'[代码][代码],[代码][代码] [代码][代码]cdn_url: [代码][代码]'http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]videoContextList: [][代码][代码] [代码][代码]},[代码][代码] [代码][代码]onLoad () {[代码][代码] [代码][代码]const { Num } = [代码][代码]this[代码][代码].data;[代码][代码] [代码][代码]// this.videoContext = wx.createVideoContext(String(Num));[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]videoContextList: [[代码][代码] [代码][代码]{ id: Num, ctx: wx.createVideoContext(String(Num))}[代码][代码] [代码][代码]][代码][代码] [代码][代码]});[代码][代码] [代码][代码]},[代码][代码] [代码][代码]getVideoContext(id) {[代码][代码] [代码][代码]const { videoContextList } = [代码][代码]this[代码][代码].data;[代码][代码] [代码][代码]// 对每一个video都按照单例模式设置[代码][代码] [代码][代码]return[代码] [代码]videoContextList.find(video => video.id === id).ctx || wx.createVideoContext(String(id));[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 点击图片开始播放[代码][代码] [代码][代码]* @param {*} event[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]handleTap(event) {[代码][代码] [代码][代码]const { currentTarget: { dataset: { id }}} = event;[代码][代码] [代码][代码]const ctx = [代码][代码]this[代码][代码].getVideoContext(id);[代码][代码] [代码][代码]console.log(ctx);[代码][代码] [代码][代码]// 点击图片时,必然是非全屏状态,此时必然没有播放,直接play即可[代码][代码] [代码][代码]ctx.play();[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 视频播放事件处理函数[代码][代码] [代码][代码]* 开始播放时自动全屏[代码][代码] [代码][代码]* @param {*} event 播放[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]handleVideoPlayEvent(event) {[代码][代码] [代码][代码]const { currentTarget: { dataset: { id }}} = event;[代码][代码] [代码][代码]const ctx = [代码][代码]this[代码][代码].getVideoContext(id);[代码][代码] [代码][代码]console.log(ctx);[代码][代码] [代码][代码]ctx.requestFullScreen();[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 视频暂停事件处理函数[代码][代码] [代码][代码]* @param {*} event 暂停[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]handleVideoPauseEvent(event) {[代码][代码] [代码][代码]console.log(event);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 全屏事件处理函数[代码][代码] [代码][代码]* @param {*} event 事件[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]handleVideoFullScreenEvent(event) {[代码][代码] [代码][代码]console.warn([代码][代码]'handleVideoFullScreenEvent'[代码][代码]);[代码][代码] [代码][代码]const { detail: { fullScreen }, target: { dataset: { id }} } = event;[代码][代码] [代码][代码]const ctx = [代码][代码]this[代码][代码].getVideoContext(id);[代码][代码] [代码][代码]console.log(ctx);[代码][代码] [代码][代码]// 退出全屏时,若正在播放,则自动暂停,且跳到起始位置[代码][代码] [代码][代码]if[代码] [代码](!fullScreen) {[代码][代码] [代码][代码]ctx.seek(0);[代码][代码] [代码][代码]ctx.pause();[代码][代码] [代码][代码]}[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 视频播放到末尾的处理函数[代码][代码] [代码][代码]* @param {*} event 自然播放结束[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]handleVideoEndedEvent(event) {[代码][代码] [代码][代码]console.log(event);[代码][代码] [代码][代码]}[代码][代码]};[代码] [代码]Page(config);[代码]wxss样式 [代码].video-item {[代码][代码] [代码][代码]width: 100%;[代码][代码] [代码][代码]height: 100%;[代码][代码]}[代码][代码].video-item video {[代码][代码] [代码][代码]width: 100%;[代码][代码] [代码][代码]height: 100%;[代码][代码]}[代码][代码].video-item .video-item-discover{[代码][代码] [代码][代码]position: relative;[代码][代码] [代码][代码]width:100%;[代码][代码] [代码][代码]height:100%;[代码][代码]}[代码][代码].video-item .video-item-discover .video-item-btn{[代码][代码] [代码][代码]position: absolute;[代码][代码] [代码][代码]width: 70rpx;[代码][代码] [代码][代码]height: 70rpx;[代码][代码] [代码][代码]top: 50%;[代码][代码] [代码][代码]left: 50%;[代码][代码] [代码][代码]transform: translate(-50%, -50%);[代码][代码] [代码][代码]z-index: 100;[代码][代码]}[代码][代码].video-item .video-item-discover .video-item-discover-bg{[代码][代码] [代码][代码]width: 100%;[代码][代码] [代码][代码]height: 100%;[代码][代码] [代码][代码]filter: brightness(0.6);[代码][代码]}[代码][代码].section.tc {[代码][代码] [代码][代码]display: flex;[代码][代码] [代码][代码]align-items: center;[代码][代码] [代码][代码]justify-content: center;[代码][代码] [代码][代码]flex-wrap: wrap;[代码][代码]}[代码][代码].section.tc .video-item .video-item-discover{[代码][代码] [代码][代码]width: 200px;[代码][代码] [代码][代码]height: 200px;[代码][代码] [代码][代码]flex-basis: 100vw;[代码][代码] [代码][代码]margin: 0 auto;[代码][代码]}[代码]
2018-08-29