1.小程序的优势

  1. 不用安装即开即用,用完就走
  2. 体验上虽然没办法媲美APP,但综合考虑还是更优
  3. 对小程序拥有者来说,开发成本更低
  4. 对于用户来说,相较于各种APP,微信小程序UI和操作流程会更统一

    2.小程序的页面构成(4个文件)

  5. app.js 注册小程序 App({})

  6. index.js 注册页面 Page({})
  7. app.json 配置小程序页面路径和窗口表现
  8. index.wxml 添加页面布局

    3.小程序的生命周期

    应用生命周期
  • onLaunch;初始化小程序是触发,全局支出法一次
  • onShow:小程序初始化完成或者用户从后台切换到前台显示时触发
  • onHide:用户从前台切换到后台隐藏时触发
  • onError:小程序发生脚本错误,或者api调用失败,会触发onError并带上错误信息
  • onPageNotFound:当小程序第一次打开的时候,找不到入口页面,才会触发
  1. 后台:当用户单击左上角关闭,或者按了设备Home件准备离开微信,小程序并没有直接销毁,而是进入了后台
  2. 前台:当再次进入微信或再次打开小程序,又会从后台进入前台

image.png

页面生命周期

image.png

  • onLoad:页面加载 1) 一个页面只会调用一次 2) 参数可以获取wx.navigateTo和wx.redireacTo及中的query
  • onShow页面显示 1) 每次打开都会调用一次
  • onReady:页面初次渲染完成 1) 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互 2)对界面的设置如wx.setNavigtionBarTitle请在inReady之后设置,
  • onHide:页面隐藏 1) 当navgateTo或底部tab切换时调用
  • onUnload:页面卸载 1) 当rediectTo或navigateBack的时候调用
  • onPullDownRefresh :监听用户下拉
  • onReachBottom :监听页面触底 可以编写下拉加载
  • onShareAppMessage:监听用户右上角转换
  • onPageScroll:监听页面滚动
  • onResize :页面尺寸发生改变的时候触发 为横竖屏切换 需要页面中开启横屏:在app.json window,或者指定页面的json文件中,添加 “pageOrientation”:”auto”
  • onTabItemTap:当该页面指定的tab页面,再次点击这个tabbar对应的tab按钮,就会触发
    应用及页面生命周期的触发顺序
    image.png

4.小程序如何请求数据

微信小程序不存在ajax,那么它是如何实现数据请求功能的呢?

  • 在微信官方文档中提供了API的调用wx.request()来请求数据

  • 我们需要把微信小程序数据请求的坑过一遍

  1. 微信小程序的请求地址需要在开发者小程序请求的坑过一遍
  2. 微信的小程序必须是https接口,并且默认443端口,也就是说,不允许修改默认端口
  3. 域名必须经过ICP备案
  4. 关于https证书
  • 然后把这个勾勾去掉叫OK了

image.png
在小程序的生命周期函数中使用 (具体哪个生命周期看需求)

  1. wx.request({
  2. url:'https://xxx.xxx' //接口地址
  3. //向后传递数据
  4. data:{
  5. 参数1:'',
  6. 参数2:' '
  7. },
  8. // 设置header头
  9. header:{
  10. 'content-type':'application.json' //默认值
  11. }
  12. // 请求成功进行逻辑操作
  13. success:function(res){
  14. console.log(res)
  15. }
  16. })

5.如何提高小程序的首屏加载时间

image.png

  1. 请求前置:提前请求数据,缩短页面加载时间
  2. 首屏直出:请求前,利用已有数据,跳过”页面加载”的过程
  3. 数据缓存:请求后,缓存接口请求的数据

6.请简述你经常使用的小程序的组件

  1. 组件: 路由组建,类似于html中a标签的功能.其中open-type对应于路由相关的API,可以是navigate.reLaunch,redirectTo,navigateBack,除此之外,还可以是exit表示退出小程序.url的路径要使用绝对路径,最前端带有/
  2. 组件:在小程序中实现富文本编辑器需要用到editor组件,在editor组件中要给它一个id属性,EditorContext是通知id和editor组件关联
  3. 组件:摄像头组件,摄像头的使用需要组件和API配合,当然在使用camera组件的时候
  4. 组件:块级组件,代替原来的div标签
  5. 组件,富文本标签,可用将字符串解析成对应的标签.其中rich-text组件内会屏蔽所有节点的事件
  6. 组件:单选框组件,可用color属性来修改选择时的颜色,但是radio需要搭配radio-group来使用
  7. 组件:多选框组件,可以通过 color属性来修改颜色,但是checkbox需要搭配checkbo-groupx来使用。
  8. 组件:图标组件,有三个属性,其中type为icon的类型,string形式的;size为icon的大小,长度单位默认为px;color为icon的颜色,和css样式中的color一样
  9. 组件:输入框组件,该组件是原生组件,使用时请注意相关限制。常用的属性有value:输入框的初始内容,string类型,为必填选项;type:input的类型,string类型,默认为text;placeholder:输入框为空时的占位符,string类型,为必填选项。

    7.Wxss与css的区别请简述

  • 新增了rex尺寸单位
  • css中需要手动进行像素单位换算,如rem
  • wxss在底层支持新的尺寸单位rpx在不同大小的屏幕上小程序会自动进行换算
  • 提供了全局的样式和局部样式
  • 项目根目录中的app.wxss会作用于所有小程序页面
  • 局部页面的wxss样式仅对当前页面有效
  • wxss仅支持部分css选择器
  • .class和#id
  • 并集选择器 后代选择器
  • ::after ::before等伪类选择器

    8.小程序如何实现响应式

    9.怎么优化小程序

  • 使用CDN资源,减少服务器带宽压力

  • 路由懒加载
  • 将一些静态 js css 放到其他地方(如OSS),减少服务器压力
  • 按需加载三方资源,如iview,建议按需引入iview的组件
  • 使用niginx开启gzip减少网络传输的流量大小
  • 如首屏为登录页,可以做成多入口,登录页单独分离为一个入口
  • 使用uglifyjs-webpack-plugin插件代替webpack自带UglifyJsPlugin插件
  • 异步组件,类似路由懒加载
  • js外联文件放到body底部,css外联文件放到head内
  • http静态资源尽量用多个子域名
  • 尽量减少http requests的数量
  • js/css/html/img资源压缩
  • 使用css spirtes,可以使用img请求次数
  • 大图使用lazyLoad懒加载
  • 避免dom elements的数量
  • 使用异步脚本,动态创建脚本

    10.小程序如何显示用户头像与用户名

    方法一 : wx.getUserInfo

    wx.getUserInfo 需要授权后才能得到数据 在新版本中 wx.getUserInfo需要搭配button让用户主动授权

  1. <button wx:if="{{canIUse}}" open-type="getUserInfo">授权登录</button>
  2. <view wx:else>请升级微信版本</view>

方法二 button+bindgetuserinfo
  1. <button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权登录</button>
  2. <view wx:else>请升级微信版本</view>
  1. Page({
  2. data: {
  3. canIUse: wx.canIUse('button.open-type.getUserInfo') // 这个是兼容
  4. },
  5. onLoad: function() {
  6. },
  7. bindGetUserInfo (e) {
  8. console.log(e.detail.userInfo);
  9. }
  10. })

11.请谈谈小程序的双向绑定和vue的异同

小程序中的数据双向绑定
  • 首先要通过bindinput绑定文本框的输入事件
  • 在data中声明一个变量content,将其动态绑定文本框的value值
  • 在bindinput事件中通过事件参数e.detail.value 可以获取到文本框中最新的value值
  • 通过this.setDate将文本框最新的value值 赋值给动态绑定的value值,connect即可实现数据的双向绑定

    vue中的双向绑定
  • 首先为文本框绑定@input 监听文本框的输入事件

  • 为文本框动态绑定value属性,其值是在data中定义的变量
  • 在@input绑定事件中,通过事件参数event,target.value 可以获取到input框中最新的value值
  • 将其重新获取的value赋值给value值动态绑定的那个变量

    区别
  • 大体上区别不大,绑定事件不同,以及获取value值的具体方式不同,以及在小程序中设置data中的数据,需要调用 this,setData方法进行设置

    12.小程序中传参是怎么传的

  1. 通过在App.js中设置全局变量
  2. 通过拼接URL直接传递
  3. 通过数据缓存存储在获取
  • App.js

通常把不会更改的数据放在app.js的Data中,在各个页面中都可以通过app实力获取Data数据

  1. var app = getApp();
  2. var data = app.data;
  • wx.navigateTo({})中URL携带参数

    1. wx.navigateTo({
    2. url:'test?id=1'
    3. })
  • 数据缓存 ```javascript //统一处理

var dealParam = function(data) { for(var i in data) { if (typeof data[i] == ‘string’){ console.log(“key=”+i+“; value=”+data[i]); } else if (typeof data[i] == ‘object’) { dealParam(data[i]); } } }

  1. <a name="rRr2K"></a>
  2. ### 13.和vue类比介绍
  3. - 生命周期
  4. -- 相比之下,小程序的钩子函数要简单的多;vue的钩子函数在跳转新页面时,钩子函数都会触发,但是小程序的钩子函数,页面不同的跳转方式,触发的钩子并不一样
  5. - 数据绑定
  6. -- vue动态绑定一个变量的值为元素的某个属性的时候,会在变量前面加上冒号:<br />-- 小程序绑定某个变量的值为元素属性时,会用两个大括号括起来,为被认为是字符串
  7. - 列表渲染
  8. -- vue 使用的是v-for<br />-- 小程序使用的是wx:for
  9. - 显示与隐藏元素
  10. -- vue 使用v-if和v-show控制元素的显示和隐藏<br />-- 小程序 使用vx-if和hidden 控制元素的显示和隐藏
  11. - 事件处理
  12. -- vue 使用 v-on:click:event绑定事件, 或者使用@event 绑定事件
  13. ```html
  14. <button v-on:click="counter+=1">Add</button>
  15. <button v-on:click.stop="counter+=1"></button>

— 小程序 全用bindtap(bind+event),或者catchtap(catch+event)绑定事件

  1. <button bindtap="noWork">不上班</button>
  2. <button catchtap="noWork">不上班</button> //阻止事件冒泡
  • 数据双向绑定
  1. 设置值

— vue 中,只需要在表单元素上加v-model,然后咋绑定data中对应的一个值,当表单元素内容发生变化时,data中对应的值也会相应改变
— 小程序中,当表单内容发生变化时,会触发表单元素上绑定的方法,然后在该方法中,通过this.setData({key:value})来将表单上的值赋值给data中的对应值
去别:

  1. 取值

— 在vue中,通过this,reason取值
— 小程序中,通过this.data.reason取值

14.如何让事件在捕获阶段触发

  1. 事件的触发分为两个阶段,首先是捕获阶段,其次是冒泡阶段。默认情况下事件都是在冒泡阶段触发。如果希望事件可以在捕获阶段触发,可以通过capture-bind进行事件绑定

15.小程序页面间有那些传递数据的方法

1. 使用全局变量实现数据传递
— app.js和app.wxss中的代码都是全局生效的,所以我们可以利用这一点儿,在不同页面之间进行传值。**2. 页面跳转或重定向时,使用url带参数传递数据
1、父组件的json文件中声明对引用子组件**3. 使用组件模板 template传递参数
4. 使用缓存传递参数

  1. wx.setStorageSync('checkin', checkin)

16.你是怎么封装微信小程序的数据请求的

  • wx.request ```javascript // 官方例子 wx.request({ url: ‘test.php’, //仅为示例,并非真实的接口地址 data: { x: ‘’ , y: ‘’ }, header: {
    1. 'content-type': 'application/json' // 默认值
    }, success: function(res) { console.log(res.data) } })
  1. - promise
  2. ```javascript
  3. Promise封装
  4. const baseUrl = 'https://csdn.net';
  5. export const http = ({ url = '', param = {}, method="get",...other } = {}) => {
  6. wx.showLoading({
  7. title: '请求中,请耐心等待..'
  8. });
  9. let timeStart = Date.now();
  10. return new Promise((resolve, reject) => {
  11. wx.request({
  12. url: getUrl(url),
  13. data: param,
  14. methods,
  15. header: {
  16. 'content-type': 'application/json' // 默认值 ,另一种是 "content-type": "application/x-www-form-urlencoded"
  17. },
  18. ...other,
  19. complete: (res) => {
  20. wx.hideLoading();
  21. console.log(`耗时${Date.now() - timeStart}`);
  22. if (res.statusCode >= 200 && res.statusCode < 300) {
  23. resolve(res.data)
  24. } else {
  25. reject(res)
  26. }
  27. }
  28. })
  29. })
  30. }

17.说一下微信小程序的适配问题

18.小程序跳转页面的方式

  1. navigateTo (有饭护肩,不可以跳转tabBar页面) ```javascript //保留当前页面,跳转到应用内的某个页面 wx.navigateTo({ url: ‘/pages/detail/detail?id=1’ })
  1. 2. switchTab (没有返回键,只能跳转到tabBar页面,不可以携带参数)
  2. ```javascript
  3. wx.switchTab({
  4. url: '/pages/detail/detail',
  5. })
  1. reLaunch (跳转任意页面,没有返回,有 首页按钮) ```javascript wx.reLaunch({ url: ‘/pages/detail/detail’ })
  1. 4. redirectTo (只可以跳转tabBar页面,没有返回,担有首页按钮)
  2. ```javascript
  3. wx.redirectTo({
  4. url: `/pages/detail/detail`,
  5. })
  1. navigateBack ( 应用在目标页面,delta值为1 ,表示跳转上一页,2表示跳两级) ```javascript wx.navigateBack({ delta:1 })
  1. <a name="EbFze"></a>
  2. ##### 页面栈
  3. 页面栈是以栈的形式维护页面与页面之间的关系,遵循栈的原则,先进后出,在微信小程序中有getCurrentPages()函数获取页面栈。
  4. <a name="mbc6G"></a>
  5. ### 19.微信小程序如何跳转到其他小程序
  6. <a name="sdAJS"></a>
  7. ### 20.微信小程序登录流程
  8. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/27308234/1652834721737-bcd7ba8d-4ae7-4502-a34e-50c49ae95fdb.png#clientId=u649b9fcf-e623-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u83d3f965&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1136&originWidth=3220&originalType=url&ratio=1&rotation=0&showTitle=false&size=277653&status=done&style=none&taskId=u50653480-a4bb-4256-97d5-a3d09341927&title=)
  9. - **流程1**:微信小程序通过wx.login获取到code,并将该code发送到后台,后台是根据开发去决定的,Java或者node,云开发等
  10. --------真实开发时最好对wx.request这种常用的进行Promise封装
  11. ```javascript
  12. // app.ts
  13. App<IAppOption>({
  14. globalData: {},
  15. onLaunch(): void {
  16. const token: string = wx.getStorageSync('token');
  17. // 未保存token
  18. if (!token) {
  19. wx.login({
  20. success ({code}): void {
  21. if (code) {
  22. console.log(code);
  23. wx.request({
  24. url: 'http://127.0.0.1:8080/wx/login',
  25. method: 'POST',
  26. data: {
  27. appid: 'wxe8a141f1bb800ff7',
  28. secret: 'ede7d29a505f77e8318fa54c0d1dd057',
  29. js_code: code
  30. },
  31. success({data}: any): void {
  32. console.log(data);
  33. wx.setStorage({
  34. key: "token",
  35. data: data.data
  36. })
  37. }
  38. });
  39. }
  40. }
  41. });
  42. return;
  43. }
  44. }
  45. })
  • 流程2: 后台利用appId,appSecret和code,发送给微信官方服务器进行校验,通过官方文档可以得出调用author.code2Session接口,换取用户唯一表示OpenID.用户在微信开发平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号)和会话密钥session_key

——— url:GET https://api.weixin.qq.com/sns/jscode2session?
——— appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

  1. // 此处只粘贴重要代码
  2. HttpGet get = new HttpGet(AUTH_URL + "appid=" + user.getAppid() + "&secret=" + user.getSecret() + "&js_code=" + user.getJs_code() + "&grant_type=" + user.getGrant_type()); // url拼接
  3. get.setConfig(config); // 装配配置信息
  4. CloseableHttpResponse res = this.httpClient.execute(get);
  5. User retUser = null;
  6. if (res.getStatusLine().getStatusCode() == 200) {
  7. retUser = new ObjectMapper().readValue(EntityUtils.toString(res.getEntity()), User.class);// json转对象
  8. wxMapper.insert(retUser); // 添加入数据库
  9. }
  10. res.close(); // 关闭返回结果
  11. httpClient.close(); // 关闭httpClient
  • 流程3: 后台返回给前端一个jwt生成的token ```javascript JWTUtils.getToken(claims, null); // 自己封装过的JWT工具类, 生成token扔给下程序
  1. > **主要**:拿到前端传过来的codesecretappidgrant_type三个参数然后通过httpClient发送GET请求,获取到返回的json对象,将该对象保存在数据库,再用JWT将一些不隐私且常用的数据转成token并返回给小程序
  2. >
  3. > **注意**: 请求回来的session_keyopenid,先留着存在数据库,token令牌用我们自己转换的
  4. - **流程4: **小程序保存token
  5. - **流程5: **前端请求携带token在请求头,后端通过数据库查询对比判断用户是否登录(效率更高课一采用jwt而不是每次都查询数据库)
  6. ```javascript
  7. wx.request({
  8. url: 'http://127.0.0.1:8080/wx/findsome',
  9. header: {
  10. Authentication: wx.getStorageSync('token')
  11. },
  12. success({data}: any): void {
  13. console.log(data);
  14. }
  15. })

21.在小程序中如何获取用户信息

  1. 小程序为升级前:可使用wx.getUserInfo直接获取用户信息,目前逐渐不能使用该方法了
  2. 升级后,可使用以下方法获取用户的账户信息:
  3. 使用button,设置其属性:open-type=”getUserInfo”

其实两种获取方式都是一样的,都是用wx.getUserProfile方法进行获取,但是只是采取了不同的数据处理方式,让开发更加的便捷

22.小程序中如何实现分享功能,微信有什么限制

发送给朋友:onShareAppMessage(Object object);
分享到朋友圈: onShareTimeline();
限制:
“单页模式”下,一些组件或接口存在一定限制:

  1. 页面无登录态,与登录相关的接口,入wx.login()均不可用;
  2. 不允许跳转其他页面,包括跳转小程序页面,跳转其他小程序,跳转微信原生页面;
  3. 不允许横屏,页面包含的tabbar不会渲染,包括自定的tabbar;
  4. 本地储存与小程序普通模式不共用;

    23.你的小程序是如何上线的,审核大概需要多久?

    (1)在微信web开发者工具里找到项目,并且设置好服务器的域名,如果你的小程序没有用到外网请求,可以不用配置服务器。配置好服务器,先预览一下,看看有没有问题,如果没有问题的话,点击上传。
    (2)上传代码之后,在微信公众号平台登录微信小程序后台,点击开发管理,就可以看到刚刚上传的代码,点击提交审核,就可以了。接下来就是等待微信官方的审核。
    (3)一般都是1~3天左右

    24.小程序中如何用像Vant一样的第三方组件

    (1)打开cmd,进入你的项目中,在cmd中执行:npm init,初始化项目
    (2)然后安装Vant
    (3)打开小程序客户端,选择【工具】菜单 -> 选择【构建 npm】命令

    25.小程序如何实现父子组件传参

    1、父组件给子组件传值
    在子组件中定义属性 ```javascript properties: {
    // 复杂定义
    name:{
    type: String,
    value:’张三丰’
    },

    // 简单定义

    name2:String

},

  1. 父组件在引用子组件的时候通过设置属性的方式给子组件传值<br />2 子组件给父组件传值<br />在组件中绑定一个自定义事件
  2. ```html
  3. // 引用了自定义的组件, 绑定了myevent事件,这个事件对应的是parentEvent方法
  4. <test-button name="张无忌" bindmyevent="parentEvent"></test-button>

在子组件中触发这个事件,可以给父组件传值。

  • 子组件中通过triggerEvent触发事件
    1. methods: {
    2. 方法名字: function(){
    3. var myEventDetail = {} // detail对象,提供给事件监听函数
    4. var myEventOption = {} // 触发事件的选项 this.triggerEvent('myevent', myEventDetail, myEventOption)
    5. }
    6. }

其他方式

26.小程序中APP的生命周期有哪些

onLaunch(options)
小程序被加载完毕的时候调用。这个方法一般用来做一些初始化的事情。比如获取用户 信息、获取历史缓存信息、获取小程序打开来源等。
onShow(options)
小程序启动,或从后台进入前台显示时调用。如果想要在小程序每次进入到前台的时候 都执行一些事情,那么可以把代码放在这个里面。比如一些实时动态更改的数据,用户每次进来都要从服务器更新,那么我们就可以在这个里面做。

onHide()
小程序被切换到后台(包括微信自身被切换到后台或者小程序暂时被切换到后台时)。可以在这个方法中做一些数据的保存。

onError(String error)
小程序发生脚本错误,或者 api 调用失败时触发。在小程序发生错误的时候,会把错误 信息发送到这个函数中,所以可以在这个函数中做一些错误收集。

onPageNotFound(Object)
小程序要打开的页面不存在时触发。一般在代码更新的时候,有些页面被删除了,但是 其他地方没有改过来的情况下会发生这种情况,或者一些活动页面,活动结束后被关掉了。也可以 在这个里面做一些错误的收集和页面的重新跳转。

getApp()
获取当前的 app 对象。一般在app.js外的地方调用。在app.js内部可以使用this获得当前的大对象;在外面要用定义在app.js的全局数据时,要用getApp()。

27.小程序中Page的生命周期有哪些

onLoad()、onReady()、onShow()、onHide()、onUnload()五个页面生命周期函数,其分别是页面加载、就绪、渲染、隐藏、卸载时被调用。

28.小程序如何定义事件

在小程序中绑定事件可以以bind开头然后跟上事件的类型,如bindtap绑定一个点击事件,对应的值是一个字符串,需要在page构造器中定义同名函数,每次触发事件之后就会执行对应函数的内容。

29.如何阻止小程序的事件冒泡

在小程序中除了通过bind之外,还可以通过catch进行事件绑定,通过catch绑定的事件不会触发事件冒泡。

30.如何让事件在捕获阶段触发

  1. 事件的触发分为两个阶段,首先是捕获阶段,其次是冒泡阶段。默认情况下事件都是在冒泡阶段触发。如果希望事件可以在捕获阶段触发,可以通过capture-bind进行事件绑定。

31.如何实现下拉刷新

首先在全局 config 中的 window配置 enablePullDownRefresh ,在 Page 中定义onPullDownRefresh 钩子函数,到达下拉刷新条件后,该钩子函数执行,发起请求方法 请求返回后,调用wx.stopPullDownRefresh停止下拉刷新

32.bindtap和catchtap的区别是什么

相同点:首先他们都是作为点击事件函数,就是点击时触发。在这个作用上他们是一样的,可以不做区分

不同点:他们的不同点主要是bindtap是不会阻止冒泡事件的,catchtap是阻值冒泡的

33.简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch()的区别

wx.navigateTo():保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
wx.redirectTo():关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
wx.switchTab():跳转到 abBar 页面,并关闭其他所有非 tabBar 页面
wx.navigateBack():关闭当前页面,返回上一页面或多级页面。可通过getCurrentPages() 获取当前的页面栈,决定需要返回几层
wx.reLaunch():关闭所有页面,打开到应用内的某个页面

34.小程序调用后台接口遇到哪些问题?

  1. 数据的大小有限制,超过范围会直接导致整个小程序崩溃,除非重启小程序;
  2. 小程序不可以直接渲染文章内容页这类型的html文本内容,若需显示要借住插件,但插件渲染会导致页面加载变慢,所以最好在后台对文章内容的html进行过滤,后台直接处理批量替换p标签div标签为view标签,然后其它的标签让插件来做,减轻前端的时间。

35.stroageSync和stroage区别?

以Sync(同步,同时)结尾的都是都是同步缓存,二者的区别是,异步不会阻塞当前任务,同步缓存直到同步方法处理完才能继续往下执行。

  • 通俗点说,异步就是不管保没保存成功,程序都会继续往下执行.同步是等保存成功了,才会执行下面的代码.使用异步,性能会更好;而使用同步,数据会更安全。
  • 它们都是将数据存储在本地缓存指定的key中,单个key最大数据长度为 1MB,所有数据存储上限为 10MB
  • setStorageSync只支持原生类型、Date、及能够通过JSON.stringify序列化的对象,不能直接传入对象。
  • 否则报错:setStorage:fail parameter error: parameter should be String instead of Object;


    36.支付流程

    预支付

    预支付就是A服务器使用统一下单命令向B服务器发送数据并返回一个json数据,这个json数据到时候是要发送给客户端,完成第二次下单操作的参数
    image.png
    关于同一下单,需要几个参数我们需要先获取一下

  • openid (用户标识)

  • nonce_str(随机字符串)
  • out_trade_no (商户订单号)
  • sign(签名)

openID和unionID区别

UnionID 机制说明

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。

openID 机制说明

openid是微信用户在公众号appid下的唯一用户标识(appid不同,则获取到的openid就不同),可用于永久标记一个用户,同时也是微信JSAPI支付的必传参数。

使用场景

openID (微信用户在微信的某个应用)
移动应用,网站应用,公众号,小程序里唯一性的话,代表同一用户的话,使用openID。
UnionID (微信用户的唯一标识)
开发者有公众号,移动应用,多个应用的时候,应该用UnionID来代表同一用户。


小程序的本地存储

1、同步

(1)wx.setStorageSync();//存储值
(2)wx.removeStorageSync();/移除指定的值
(3)wx.getStorageSync();// 获取值
(4) wx.getStoragelnfoSync();//获取当前 storage中所有的 key
(5)wx.clearStorageSync();//清除所有的key

2、异步

(1) wx.setStorage();//存储值
将数据存储在本地缓存中指定的key中。会覆盖掉原来该key对应的内容。数据存储生命周期跟小程序本身一致,即除用户主动删除或超过一定时间被自动清理,否则数据都一直可用。单个key允许存储的最大数据长度为1MB,所有数据存储上限为10MB。
(2) wx removeStorage();//移除指定的值
(3) wxgetStorage();//获取值
(4)wx getStoragelnfo();//获取当前 storage中所有的 key
(5) wx.clearStorage(),//清除所有的key