优势:
(1)容易推广。在微信中,小程序拥有众多入口,例如附近的小程序、小程序码、分享、 发现-小程序等五十多个的入口,这些都有助于推广小程序;
(2)使用便捷。用户在使用小程序时,只需要轻轻点一下就可以使用;
(3)体验良好。小程序不会像H5页面一样经常出现卡顿、延时、加载慢、权限不足问题;
(4)成本更低,从开发成本到运营推广成本,小程序的花费仅为APP的十分之一。
劣势:
(1)单个包大小限制为2M,这导致无法开发大型的应用,采用分包最大是20M;
(2)需要像app一样审核上架,这点相对于H5的发布要麻烦一些;
(3)处处受微信限制。例如不能直接分享到朋友圈,涉及到积分,或者虚拟交易的时候,小程序也是不允许的。
app.js的生命周期
onLaunch: 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
onShow:当小程序启动,或从后台进入前台显示,会触发 onShow
onHide:当小程序从前台进入后台,会触发 onHide
onError:当小程序发生脚本错误,或者 API 调用失败时,会触发 onError 并带上错误信息。
page中的生命周期
onLoad:生命周期函数--监听页面加载,触发时机早于onShow和onReady
onReady:生命周期函数--监听页面初次渲染完成
onShow:生命周期函数--监听页面显示,触发事件早于onReady
onHide:生命周期函数--监听页面隐藏
onUnload:生命周期函数--监听页面卸载
pa组件中的生命周期
created 监听页面加载
attached 监听页面显示
ready 监听页面初次渲染完成
moved 监听页面隐藏
detached 监听页面卸载
error 每当组件方法抛出错误时执行
在js文件中,this.data.变量修改,只可以修改逻辑层的数据,渲染层不会改变
用app实例的this.setData()方法修改data数据逻辑层和渲染层的数据都会更新
控制代码包的大小:
(1)代码包的体积压缩可以通过勾选开发者工具中“上传代码时,压缩代码”选项
(2)及时清理无用的代码和资源文件
(3)减少资源包中的图片等资源的数量和大小
分包加载,预加载:
将用户访问率高的页面放在主包里,将访问率低的页面放入子包里,按需加载;采用子包预加载技术,并不需要等到用户点击到子包页面后在下载子包
预请求:
请求可以在页面onLoad就加载,不需要等页面ready后在异步请求数据;尽量减少不必要的https请求,可使用 getStorageSync() 及 setStorageSync() 方法将数据存储在本地
避免不当的使用setData:
不要过于频繁调用setData,应考虑将多次setData合并成一次setData调用
使用自定义组件:
对于一些独立的模块我们尽可能抽离出来,这是因为自定义组件的更新并不会影响页面上其他元素的更新;各个组件也将具有各自独立的逻辑空间。每个组件都分别拥有自己的独立的数据、setData调用
(1)标签式跳转:
<navigator url=”页面地址” target=“self // 当前页面小程序的 || miniProgram // 其他 页面小程序”><navigator>
(2)声明式跳转
wx.navigateTo
保留当前页面,只能打开非 tabBar 页面,返回时返回该页面
wx.redirectTo
关闭卸载当前页面,只能打开非 tabBar 页面
wx.switchTab
关闭所有非tabbar页面, 只能打开 tabBar 页面
wx.reLaunch
关闭卸载所有页面,可以打开任意页面
wx.navigateBack
返回前面的页面,可以指定返回多少页,如果用过redirectTo,那么被关闭的页面将返 回不去
navigator标签
navigator标签中加的url地址可以跳转到非tabBar页面
若要跳转到tabBar页面可以增加一个open-type='switchTab'则可以跳转到tabBar页 面,实质相当于wx.switchTab函数
同步:
(1)存储:wx.setStorageSync('list', {age:5})
(2)获取:wx.getStorageSync('list')
异步:
(1)存储:wx.setStorage({
key:"key",
data:'value'
})
(2)获取:wx.getStorage({'key'})
(1)路由跳转传参:路由跳转传参可以通过?的方式拼接参数。
wx.switchTab({
url: '../todolist/todolist?id=789',
})
//或者navigator标签
<navigator url="../detail/detail?id=666">带参数去detail</navigator>
跳转到指定界面之后,可以在该页面的onLoad方法中的options参数(本身是个对 象)拿到路由跳转的参数。
onLoad(options) {
console.log(options);
}
wxml中:
<button bindtap="navigateTo" data-num="10">wx.navigateTo</button>
js中:
navigateTo(e){
console.log(e.target.dataset.num);
wx.navigateTo({
url: '/pages/detail/detail?id=999&num='+e.target.dataset.num,
})
}
小程序中父传子:
在父页面中:
<son msg=’hello’></son>
<son></son>
子组件接收:
properties:{
msg:{
type:[String,Number],
value:’hello world’,
}
}
子组件:
<view>{{msg}}</view>
打印结果:
hello
小程序中子传父:
父页面:
<son bind:fromson=’fromson’></son>
子组件:
<button bindtap=’tofather’>子传父</button>
子组件中触发:
methods:{
tofather(){
this.triggerEvent(‘fromson’,’111’)
}
}
父组件接收子组件参数:
fromson(res){
console.log(res.detail)
this.setData({
“fromson”:res.detail
})
}
wx.request
不会跨域
因为不是浏览器,没有同源策略
目的:
为了给所有的接口请求添加统一的配置,避免每次请求的时候指定配置
可以添加统一的请求拦截器和响应拦截器,在调用接口的时候做一些通用的处理
具体代码:
function request(options) {
// 请求拦截器
// ...
// 1. 加一些统一的参数,或者配置
if (!options.url.startsWith("https://") && !options.url.startsWith("http://")) {
options.url = "https://showme.myhope365.com" + options.url
}
// 默认的请求头
let header = {
"content-type": "application/x-www-form-urlencoded",
};
if (options.header) {
header = {
...header,
...options.header
}
}
return new Promise((reslove, reject) => {
// 调用接口
wx.request({
// 默认的配置
// 加载传入的配置
...options,
header,
success(res) {
// 响应拦截器,所有接口获取数据之前,都会先执行这里
// 1. 统一的错误处理
if (res.statusCode != 200) {
wx.showToast({
title: '服务器异常,请联系管理员',
})
}
reslove(res)
},
fail(err) {
reject(err)
}
})
})
}
export function get(url, options = {}) {
return request({
url,
...options
})
}
export function post(url, data, options = {}) {
return request({
url,
data,
method: "POST",
...options
})
}
使用promise封装异步请求,统一化管理
直接在异步请求的回调函数中调用执行函数
多个异步请求可以使用$nextTick()来判断是否执行完毕
wx.request http请求
wx.getNetworkType 获取网络状态
wx.downloadFile 从网络上下载pdf文档
wx.openDocument 下载成功之后进行预览文档
wx.scanCode 扫码能力
wx.getUserInfo 用户头像,昵称
behaviors 是用于组件间代码共享的特性,类似于一些编程语言中的 “mixins” 或 “traits”。每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。 每个组件可以引用多个 behavior ,behavior 也可以引用其它 behavior。
优点:多端开发,一套代码可以生成ios、安卓、微信小程序、支付宝小程序等;
学习成本低,uniapp封装的组件与微信小程序相似,并且基于vue.js,上手快;
结合HBuilder开发速度快;
缺点:完善性较差,uni-app问世的时间还比较短,坑多。如果想要一个更稳定、坑更 少的开发环境,建议选择其他平台。
事件总线可以作为组件沟通的桥梁,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件;
在uni中可以通过uni.$emit(eventName,OBJECT)来触发全局的自定事件;
通过uni.$on(eventName,callback)监听全局的自定义事件;
通过uni.$off([eventName, callback])移除全局自定义事件监听器。
注意事项:如果没有提供参数,则移除所有的事件监听器;
如果只提供了事件,则移除该事件所有的监听器;
如果同时提供了事件与回调,则只移除这个回调的监听器;
提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器;
同步储存和读取
存储:
uni.setStorageSync('name','LZJAPYX,ZDL'); // name为键名 LZJAPYX,ZDL为键值
获取:
uni.getStorageSync('name') // 以健名取键值
删除:
uni.removeStorageSync('name') // 删除该键名的数据
异步存储和读取
存储:
uni.setStorage({
key: "name", // 键名
data: "LZJAPYX,ZDL" // 键值
});
获取:
uni.getStorage({
key: "name", // 键名
success(res){
console.log.(res.data) // LZJAPYX,ZDL
}
});
删除:
uni.reomveStorage({
key: "name", // 键名
success(res){
console.log.(res) // reomveStorage:ok
}
});
uni.navigateTo({url: "/路径?参数=参数值"});
uni.redirectTo({url: "/路径?参数=参数值"});
uni.reLaunch({url: "/路径?参数=参数值"});
uni.switchTab({url: "/路径?参数=参数值"});
uni.navigateBack({delta: 2});
uni.preloadPage({url: "/路径?参数=参数值"});
条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同的平台。
写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾
在app.js中设置globalData设置,在需要的地方的js文件let app=getApp() app.globalData.数据
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我的测试尝试访问网页并验证页面上是否存在某些元素。例如,它访问http://foo.com/homepage.html并检查Logo图像,然后访问http://bar.com/store/blah.html并检查页面上是否出现了某些文本。我的目标是访问经过Kerberos身份验证的网页。我发现Kerberos代码如下:主文件uri=URI.parse(Capybara.app_host)kerberos=Kerberos.new(uri.host)@kerberos_token=kerberos.encoded_tokenkerberos.rb文件classKerberosdefini