HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

在 ios 真机运行时在 page.json 下给 nvue 页面配置 pullToRefresh 下拉刷新会导致 app 卡死

在 ios 真机运行下,给 nvue 页面配置 pullToRefresh 会导致 app 卡死退出,其他情况正常,即 android 真机运行环境以及 vue 页面正常

解决方法:去掉 nvue 页面的 pullToRefresh 配置即可

继续阅读 »

在 ios 真机运行下,给 nvue 页面配置 pullToRefresh 会导致 app 卡死退出,其他情况正常,即 android 真机运行环境以及 vue 页面正常

解决方法:去掉 nvue 页面的 pullToRefresh 配置即可

收起阅读 »

已找到

招聘

已找到

已找到

IOS离线打包库文件精简

离线打包 iOS

研究了几天IOS离线打包,总算是初步走通了,真是历尽千辛万苦,尤其打包文件精简过程。

这里抱怨一句:官方出的文档能不能详细点?能不能别那么多bug?做事情能不能认真一点?

以下是我精简出来的包,打包出来的文件和云端打包大小差别不大了,如果发现还可以精简的里方欢迎补充:

我的项目用到了蓝牙,如果不需要用蓝牙的可以把liblibBlueTooth.a这个文件也去掉

继续阅读 »

研究了几天IOS离线打包,总算是初步走通了,真是历尽千辛万苦,尤其打包文件精简过程。

这里抱怨一句:官方出的文档能不能详细点?能不能别那么多bug?做事情能不能认真一点?

以下是我精简出来的包,打包出来的文件和云端打包大小差别不大了,如果发现还可以精简的里方欢迎补充:

我的项目用到了蓝牙,如果不需要用蓝牙的可以把liblibBlueTooth.a这个文件也去掉

收起阅读 »

【分享】uniapp迁移QQ小程序

uniapp没有兼容QQ小程序,
但是QQ小程序本身是兼容微信小程序的,
所以考虑生成微信小程序后直接搞到QQ小程序内,
发现效果还不错,
但是请注意,
每个页面和组件必须有js/json/wxml/wxss四个文件,否则会报错。

uniapp没有兼容QQ小程序,
但是QQ小程序本身是兼容微信小程序的,
所以考虑生成微信小程序后直接搞到QQ小程序内,
发现效果还不错,
但是请注意,
每个页面和组件必须有js/json/wxml/wxss四个文件,否则会报错。

加快表单处理效率:增加、编辑通用

表单

首先看表单的基本格式

<form @submit="onSubmit">  
            <view class="cu-form-group margin-top">  
                <view class="title">申请理由</view>  
                <input placeholder="请输入..." name="name" :value="formdata.name"></input>  
            </view>  
</form>

其中value因为是可以给表单赋初值,所以可以再进入编辑页时,调用查询详情的接口给formdata对象赋值,

但是因为这里是单向绑定的关系,input内容的变更如果不做特殊事件处理,formdata.name是接收不到它更改之后的值的,因此我们还是需要在上面写上name。

注意,value依赖的对象是双层的,这是为了定义变量和引用方便,我们需要在data中声明

formdata: {  
    name: ''  
},

这里的name是可以可无的。

提交表单时,可以使用

...this.formdata,  
...e.detail.value

两者合并,同时构成提交的对象

示例:

methods: {  
   onSubmit(e) {  
       // 这里因为我用了request插件所以直接使用$http,即使不用也只是这里不同  
       this.$http.post('/device/authority/authApply', {  
           ...this.formdata,  
           ...e.detail.value  
           }).then(res => {  
       })  
   }  
}
继续阅读 »

首先看表单的基本格式

<form @submit="onSubmit">  
            <view class="cu-form-group margin-top">  
                <view class="title">申请理由</view>  
                <input placeholder="请输入..." name="name" :value="formdata.name"></input>  
            </view>  
</form>

其中value因为是可以给表单赋初值,所以可以再进入编辑页时,调用查询详情的接口给formdata对象赋值,

但是因为这里是单向绑定的关系,input内容的变更如果不做特殊事件处理,formdata.name是接收不到它更改之后的值的,因此我们还是需要在上面写上name。

注意,value依赖的对象是双层的,这是为了定义变量和引用方便,我们需要在data中声明

formdata: {  
    name: ''  
},

这里的name是可以可无的。

提交表单时,可以使用

...this.formdata,  
...e.detail.value

两者合并,同时构成提交的对象

示例:

methods: {  
   onSubmit(e) {  
       // 这里因为我用了request插件所以直接使用$http,即使不用也只是这里不同  
       this.$http.post('/device/authority/authApply', {  
           ...this.formdata,  
           ...e.detail.value  
           }).then(res => {  
       })  
   }  
}
收起阅读 »

提升体验,操作完成后先提示结果再延时跳转

很多时候,我们提交完一个表单或者做了一个搜索操作等,需要跳转到其它页面,但是如果直接跳转会给用户显得很突兀,而且我们的提示信息用户也看不到。

场景:

  1. 提交表单后,需要跳到列表页或者结果页

这个时候可以按如下方式,先提示,然后在1.5秒之后跳转。

if (res.data.code == 0) {  
    uni.showToast({  
        title: '提交成功'  
    });  
    setTimeout(function() {                           
        uni.redirectTo({  
            url: 'toMe',  
            success: res => {},  
            fail: () => {},  
            complete: () => {}  
        });  
    }, 1500)  
}

或者

uni.showToast({  
    title: '提示信息'  
});  
setTimeout(function() {                           
    uni.navigateBack({  
        delta: 1  
    });  
}, 1500)
继续阅读 »

很多时候,我们提交完一个表单或者做了一个搜索操作等,需要跳转到其它页面,但是如果直接跳转会给用户显得很突兀,而且我们的提示信息用户也看不到。

场景:

  1. 提交表单后,需要跳到列表页或者结果页

这个时候可以按如下方式,先提示,然后在1.5秒之后跳转。

if (res.data.code == 0) {  
    uni.showToast({  
        title: '提交成功'  
    });  
    setTimeout(function() {                           
        uni.redirectTo({  
            url: 'toMe',  
            success: res => {},  
            fail: () => {},  
            complete: () => {}  
        });  
    }, 1500)  
}

或者

uni.showToast({  
    title: '提示信息'  
});  
setTimeout(function() {                           
    uni.navigateBack({  
        delta: 1  
    });  
}, 1500)
收起阅读 »

厦门招聘uni-app人才

移动APP 招聘

厦门企业(云起行简)招聘资深前端工程师,薪资17-25K 职位信息
1、负责基于H5、uni-App的手机APP的设计与开发;
2、负责公司现有APP的重构与优化;
3、参与公司级APP的发展方向的规划与设计;
4、参与APP研发技术的积累、学习、实践工作;
5、参与公司其他前端技术支持工作。
6、指导其他前端开发工程师完成研发任务。
任职要求:
1、专科及以上学历,计算机、软件、设计等相关专业;
2、3年或以上H5相关开发经验,一个以上项目跨平台APP开发经验(要有项目展示);
3、精通符合W3C标准的Html5、JavaScript和CSS相关技术;
4、精通JSON、XML等通信格式以及基于AJAX请求实现与后台数据交互;
5、精通JQuery、Vue等常见JS开发框架;
6、熟悉使用HBuilder IDE编辑器进行开发,并完成打包发布安卓、ios版本app;
7、精通 Vue、uni-app 框架应用,并能运用uni-app框架完成移动端及小程序开发;
9、良好沟通能力、团队合作精神,积极主动、服从安排,能承受较大压力,责任心和学习能力强,能独立分析问题及解决问题;
有意向者请联系sophie:
手机微信:13544899516
qq:1765268710

继续阅读 »

厦门企业(云起行简)招聘资深前端工程师,薪资17-25K 职位信息
1、负责基于H5、uni-App的手机APP的设计与开发;
2、负责公司现有APP的重构与优化;
3、参与公司级APP的发展方向的规划与设计;
4、参与APP研发技术的积累、学习、实践工作;
5、参与公司其他前端技术支持工作。
6、指导其他前端开发工程师完成研发任务。
任职要求:
1、专科及以上学历,计算机、软件、设计等相关专业;
2、3年或以上H5相关开发经验,一个以上项目跨平台APP开发经验(要有项目展示);
3、精通符合W3C标准的Html5、JavaScript和CSS相关技术;
4、精通JSON、XML等通信格式以及基于AJAX请求实现与后台数据交互;
5、精通JQuery、Vue等常见JS开发框架;
6、熟悉使用HBuilder IDE编辑器进行开发,并完成打包发布安卓、ios版本app;
7、精通 Vue、uni-app 框架应用,并能运用uni-app框架完成移动端及小程序开发;
9、良好沟通能力、团队合作精神,积极主动、服从安排,能承受较大压力,责任心和学习能力强,能独立分析问题及解决问题;
有意向者请联系sophie:
手机微信:13544899516
qq:1765268710

收起阅读 »

如何使用uni.$emit()和uni.$on() 进行页面间通讯

自定义事件 uniapp

自 HBuilderX 2.0.0 起支持 uni.$emituni.$onuni.$onceuni.$off ,可以方便的进行页面的通讯 ,触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等。事件详情

具体如何使用呢?我们假设一个场景,进入app,是未登陆状态,需要在我的页面点击登陆,进入登陆页面进行登陆。登陆成功之后,返回到我的页面,实时显示登陆后的用户信息。

监听事件

首先,在我的页面监听事件。

// 我的页面  
onLoad(){  
    // 监听事件  
    uni.$on('login',(usnerinfo)=>{  
        this.usnerinfo = usnerinfo;  
    })  
},  
onUnload() {  
    // 移除监听事件  
        uni.$off('login');  
    },

因为事件监听是全局的,所以使用 uni.$on ,需要使用 uni.$off 移除全局的事件监听,避免重复监听。

触发事件

进入登陆页面,触发事件

// 登陆页面  
uni.$emit('login', {  
                avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  
                token: 'user123456',  
                userName: 'unier',  
                login: true  
            });

使用 uni.$emit 触发事件后,对应的 uni.$on 就会监听到事件触发,在回调中去执行相关的逻辑。

更多使用场景

以上只是一个简单的场景应用。而我们开发中会遇到很多页面间通讯场景,如:

  • vue 与 nvue,nvue 与 vue 间的通讯
  • tabbar 页面之间的通讯
  • 父页面与多级子页面间的通讯

基本上述场景均可以实现,本质上就是一个页面通知另一个面我发生了变化,你需要处理一下。绝大部分页面的通讯都可以使用 uni.$emituni.$onuni.$onceuni.$off 四个事件完成。

Tips

  • 如果页面没有打开,将不能 注册监听事件 uni.$onuni.$once
  • 一次性的事件,直接使用 uni.$once 监听,不需要移除。

附件为 demo

继续阅读 »

自 HBuilderX 2.0.0 起支持 uni.$emituni.$onuni.$onceuni.$off ,可以方便的进行页面的通讯 ,触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等。事件详情

具体如何使用呢?我们假设一个场景,进入app,是未登陆状态,需要在我的页面点击登陆,进入登陆页面进行登陆。登陆成功之后,返回到我的页面,实时显示登陆后的用户信息。

监听事件

首先,在我的页面监听事件。

// 我的页面  
onLoad(){  
    // 监听事件  
    uni.$on('login',(usnerinfo)=>{  
        this.usnerinfo = usnerinfo;  
    })  
},  
onUnload() {  
    // 移除监听事件  
        uni.$off('login');  
    },

因为事件监听是全局的,所以使用 uni.$on ,需要使用 uni.$off 移除全局的事件监听,避免重复监听。

触发事件

进入登陆页面,触发事件

// 登陆页面  
uni.$emit('login', {  
                avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  
                token: 'user123456',  
                userName: 'unier',  
                login: true  
            });

使用 uni.$emit 触发事件后,对应的 uni.$on 就会监听到事件触发,在回调中去执行相关的逻辑。

更多使用场景

以上只是一个简单的场景应用。而我们开发中会遇到很多页面间通讯场景,如:

  • vue 与 nvue,nvue 与 vue 间的通讯
  • tabbar 页面之间的通讯
  • 父页面与多级子页面间的通讯

基本上述场景均可以实现,本质上就是一个页面通知另一个面我发生了变化,你需要处理一下。绝大部分页面的通讯都可以使用 uni.$emituni.$onuni.$onceuni.$off 四个事件完成。

Tips

  • 如果页面没有打开,将不能 注册监听事件 uni.$onuni.$once
  • 一次性的事件,直接使用 uni.$once 监听,不需要移除。

附件为 demo

收起阅读 »

最简单的uni-app返回携带参数解决方案

页面跳转 传参数 传参 uniapp

场景:A页面到B页面,B页面返回,A页面接收数据

A页面

//引入  
 import WxNotificationCenter  from '@/common/NotificationCenter.js'  

onLoad: function () {  
    //注册通知  
    WxNotificationCenter.addNotification('NotificationName', this.didNotification, this)  
  },  
    onUnload: function () {  
    //移除通知  
    WxNotificationCenter.removeNotification('NotificationName', this)  
  },  
methods:{  
   //通知处理  
  didNotification: function (info) {  
    var that = this  
    console.log(info)  
  },    
}

B页面

//引入  
 import WxNotificationCenter  from '@/common/NotificationCenter.js'  
 //发送通知  
 WxNotificationCenter.postNotificationName('NotificationName', '来自B页面')  

文件
http://e0c3afa5a2.hz22l-181.6464.cn/lian/NotificationCenter.js

继续阅读 »

场景:A页面到B页面,B页面返回,A页面接收数据

A页面

//引入  
 import WxNotificationCenter  from '@/common/NotificationCenter.js'  

onLoad: function () {  
    //注册通知  
    WxNotificationCenter.addNotification('NotificationName', this.didNotification, this)  
  },  
    onUnload: function () {  
    //移除通知  
    WxNotificationCenter.removeNotification('NotificationName', this)  
  },  
methods:{  
   //通知处理  
  didNotification: function (info) {  
    var that = this  
    console.log(info)  
  },    
}

B页面

//引入  
 import WxNotificationCenter  from '@/common/NotificationCenter.js'  
 //发送通知  
 WxNotificationCenter.postNotificationName('NotificationName', '来自B页面')  

文件
http://e0c3afa5a2.hz22l-181.6464.cn/lian/NotificationCenter.js

收起阅读 »

建议uniapp H5添加自定义路由的配置

Vue h5 uniapp

建议uniapp H5添加自定义路由的配置,不然路由很丑的。

建议uniapp H5添加自定义路由的配置,不然路由很丑的。

微信内H5使用JSSDK分享!!!注意目前Hbuilderx2.3.7版本存在问题!!!

微信分享 微信JSSDK 微信h5

今天发现Hbuilderx2.3.7存在问题,给一下解决方案,顺便希望官方看下是更新了什么内容导致不兼容!!!(11月5日)
当前最新版本Hbuilderx2.3.7,在IOS上使用以下代码分享时,调试一切正常,真机提示签名错误。

分析原因:

  1. 使用微信复制链接功能,显示的是第一次进入网站的地址,
  2. 刷新页面,再次分享正常。

解决办法:

  1. ios下记录第一次进入网站时候url地址
  2. 在调用分享jssdk的位置,使用上一步记录的url地址进行签名。
  3. 具体代码就不写了,在app.vue中获取location.href存入全局变量就可以了

最近一直有人问jssdk的问题,官方贴也太简单,没有说明。所以这里再写一篇简单教程,附有代码。其实这个sdk还是比较简单的,只是因为uni-app的h5端是SPA单页应用,所以容易出现签名错误,或者配置没有正确初始化的问题。

服务端计算签名

文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

引入JSSDK

推荐使用npm安装,参考 http://ask.dcloud.net.cn/article/35380

创建一个js文件,封装微信相关功能

笔者是放在common目录,文件名称是wechat.js
代码如下:

import request from './request'; //笔者自己封装的网络请求类,也可以直接使用uni.request  
var jweixin = require('jweixin-module');  

export default {  
        //判断是否在微信中  
    isWechat:function(){  
        var ua = window.navigator.userAgent.toLowerCase();  
        if(ua.match(/micromessenger/i) == 'micromessenger'){  
            return true;  
        }else{  
            return false;  
        }  
    },  
        //初始化sdk配置  
    initJssdk:function(callback ,url){  
                //服务端进行签名 ,可使用uni.request替换。 签名算法请看文档  
        request.post('/api/oauth/wechat/sign',{url:url},function(res){  
            if(res.data){  
                jweixin.config({  
                     debug: false,  
                     appId: res.data.appId,  
                     timestamp:res.data.timestamp,  
                     nonceStr: res.data.nonceStr,  
                     signature:res.data.signature,  
                     jsApiList: [  
                         'checkJsApi',  
                         'onMenuShareTimeline',  
                         'onMenuShareAppMessage'  
                     ]  
                });  
                //配置完成后,再执行分享等功能  
                if(callback){  
                    callback(res.data);  
                }  
            }  

        });  
    },  
        //在需要自定义分享的页面中调用  
    share:function(data ,url){  
        url =url ? url :window.location.href;  
        if(!this.isWechat()){  
            return ;  
        }  
                //每次都需要重新初始化配置,才可以进行分享  
        this.initJssdk(function(signData){  
            jweixin.ready(function(){    
                var shareData = {  
                     title: data&&data.title ? data.title: signData.site_name,  
                     desc: data&&data.desc ? data.desc: signData.site_description,  
                     link: url,  
                     imgUrl: data&&data.img ?data.img :signData.site_logo,  
                     success: function (res) {  
                                                 //用户点击分享后的回调,这里可以进行统计,例如分享送金币之类的  
                        request.post('/api/member/share');  
                     },  
                     cancel: function (res) {  
                     }  
                 };  
                 //分享给朋友接口  
                 jweixin.onMenuShareAppMessage(shareData);  
                 //分享到朋友圈接口  
                 jweixin.onMenuShareTimeline(shareData);  
            });  
        } ,url);  
    }  
}

全局引用

在main.js中引入

// #ifdef H5  
import wechat from './common/wechat'  
if(wechat.isWechat()){  
    Vue.prototype.$wechat =wechat;  
}  
// #endif

在页面中调用

例如,在文章详情页面自定义分享内容。

// #ifdef H5  
if (this.$wechat && this.$wechat.isWechat()) {  
     this.$wechat.share({  
          desc: article.title,  
          img: article.image  
    });  
}  
// #endif

注意事项

1 测试时,可以将debug设置为true,可以看到日志信息
2 签名建议在服务端,签名的url必须和当前页面的url一致,否则自定义分享无效
3 每个页面都需要单独初始化配置,即jweixin.config()
4 在公众号后台设置安全域名
5 笔者的例子是在history模式下,Android、IOS手机均已正常上线使用。若您使用的是hash模式,请自行测试,理论上应该也可以,如果有问题,请检查上述几点。如果还不行,请尝试在签名的事哈去掉url上的 '#'以后部分(含'#')
6 如有遗漏或建议,欢迎下面留言

继续阅读 »

今天发现Hbuilderx2.3.7存在问题,给一下解决方案,顺便希望官方看下是更新了什么内容导致不兼容!!!(11月5日)
当前最新版本Hbuilderx2.3.7,在IOS上使用以下代码分享时,调试一切正常,真机提示签名错误。

分析原因:

  1. 使用微信复制链接功能,显示的是第一次进入网站的地址,
  2. 刷新页面,再次分享正常。

解决办法:

  1. ios下记录第一次进入网站时候url地址
  2. 在调用分享jssdk的位置,使用上一步记录的url地址进行签名。
  3. 具体代码就不写了,在app.vue中获取location.href存入全局变量就可以了

最近一直有人问jssdk的问题,官方贴也太简单,没有说明。所以这里再写一篇简单教程,附有代码。其实这个sdk还是比较简单的,只是因为uni-app的h5端是SPA单页应用,所以容易出现签名错误,或者配置没有正确初始化的问题。

服务端计算签名

文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

引入JSSDK

推荐使用npm安装,参考 http://ask.dcloud.net.cn/article/35380

创建一个js文件,封装微信相关功能

笔者是放在common目录,文件名称是wechat.js
代码如下:

import request from './request'; //笔者自己封装的网络请求类,也可以直接使用uni.request  
var jweixin = require('jweixin-module');  

export default {  
        //判断是否在微信中  
    isWechat:function(){  
        var ua = window.navigator.userAgent.toLowerCase();  
        if(ua.match(/micromessenger/i) == 'micromessenger'){  
            return true;  
        }else{  
            return false;  
        }  
    },  
        //初始化sdk配置  
    initJssdk:function(callback ,url){  
                //服务端进行签名 ,可使用uni.request替换。 签名算法请看文档  
        request.post('/api/oauth/wechat/sign',{url:url},function(res){  
            if(res.data){  
                jweixin.config({  
                     debug: false,  
                     appId: res.data.appId,  
                     timestamp:res.data.timestamp,  
                     nonceStr: res.data.nonceStr,  
                     signature:res.data.signature,  
                     jsApiList: [  
                         'checkJsApi',  
                         'onMenuShareTimeline',  
                         'onMenuShareAppMessage'  
                     ]  
                });  
                //配置完成后,再执行分享等功能  
                if(callback){  
                    callback(res.data);  
                }  
            }  

        });  
    },  
        //在需要自定义分享的页面中调用  
    share:function(data ,url){  
        url =url ? url :window.location.href;  
        if(!this.isWechat()){  
            return ;  
        }  
                //每次都需要重新初始化配置,才可以进行分享  
        this.initJssdk(function(signData){  
            jweixin.ready(function(){    
                var shareData = {  
                     title: data&&data.title ? data.title: signData.site_name,  
                     desc: data&&data.desc ? data.desc: signData.site_description,  
                     link: url,  
                     imgUrl: data&&data.img ?data.img :signData.site_logo,  
                     success: function (res) {  
                                                 //用户点击分享后的回调,这里可以进行统计,例如分享送金币之类的  
                        request.post('/api/member/share');  
                     },  
                     cancel: function (res) {  
                     }  
                 };  
                 //分享给朋友接口  
                 jweixin.onMenuShareAppMessage(shareData);  
                 //分享到朋友圈接口  
                 jweixin.onMenuShareTimeline(shareData);  
            });  
        } ,url);  
    }  
}

全局引用

在main.js中引入

// #ifdef H5  
import wechat from './common/wechat'  
if(wechat.isWechat()){  
    Vue.prototype.$wechat =wechat;  
}  
// #endif

在页面中调用

例如,在文章详情页面自定义分享内容。

// #ifdef H5  
if (this.$wechat && this.$wechat.isWechat()) {  
     this.$wechat.share({  
          desc: article.title,  
          img: article.image  
    });  
}  
// #endif

注意事项

1 测试时,可以将debug设置为true,可以看到日志信息
2 签名建议在服务端,签名的url必须和当前页面的url一致,否则自定义分享无效
3 每个页面都需要单独初始化配置,即jweixin.config()
4 在公众号后台设置安全域名
5 笔者的例子是在history模式下,Android、IOS手机均已正常上线使用。若您使用的是hash模式,请自行测试,理论上应该也可以,如果有问题,请检查上述几点。如果还不行,请尝试在签名的事哈去掉url上的 '#'以后部分(含'#')
6 如有遗漏或建议,欢迎下面留言

收起阅读 »