有关于小程序原生开发的高频面试题

239 阅读8分钟

1.# 你认为微信小程序的优点是什么,缺点是什么

优势

  1. 微信助理,容易推广。  在微信中,小程序拥有众多入口,例如附近的小程序、小程序码、分享、发现-小程序等五十多个的入口。这些入口有助于企业更好的获取流量,从而进行转化、变现。
  2. 使用便捷。  用户在使用小程序时,只需要轻轻点一下就可以使用,更加符合用户对使用方便、快捷的需求,所以小程序的用户数量不断增加。
  3. 体验良好,有接近原生app的体验 。  在微信生态里,小程序在功能和体验上是可以秒杀掉 H5 页面的,H5 页面经常出现卡顿、延时、加载慢、权限不足等原因,而这些问题在小程序里都不会出现。
  4. 成本更低。  从开发成本到运营推广成本,小程序的花费仅为APP的十分之一,无论是对创业者还是传统商家来说都是一大优势。

不足

  1. 单个包大小限制为2M。  这导致无法开发大型的应用,采用分包最大是20M(这个值一直在变化,以官网为准)。
  2. 发布审核麻烦。  需要像app一样审核上架,这点相对于H5的发布要麻烦一些。
  3. 处处受微信限制。  例如不能直接分享到朋友圈,涉及到积分,或者虚拟交易的时候,小程序也是不允许的

2.# 谈谈对微信小程序中生命周期函数的理解

小程序中的生命周期函数,分为 应用生命周期函数 和 页面生命周期函数 。
在这里插入图片描述
应用生命周期函数

onLaunch 函数的参数也可以使用 wx.getLaunchOptionsSync 获取;
onShow 也可以使用 wx.onAppShow 绑定监听;
onHide 也可以使用 wx.onAppHide 绑定监听;

App.js是小程序入口文件,所以在App.js中调用应用生命周期函数:
微信小程序官网

App({onLaunch: function () {// 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)},onShow: function (options) {// 当小程序启动,或从后台进入前台显示,会触发 onShow },onHide: function () {// 当小程序从前台进入后台,会触发 onHide},onError: function (msg) {// 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息}
})

页面生命周期函数有:
微信小程序官网

在这里插入图片描述

还有一些特殊的生命周期,它们并非与组件有很强的关联,但有时组件需要获知,以便组件内部处理。这样的生命周期称为“组件所在页面的生命周期”,在 pageLifetimes 定义段中定义。其中可用的生命周期包括:

生命周期参数描述
show组件所在的页面被展示时执行
hide组件所在的页面被隐藏时执行
resizeObject Size组件所在的页面尺寸变化时执行

3.# 微信小程序中如何进行事件的定义,传参

  1. 事件定义 bind开头
    在小程序中绑定事件可以以bind开头然后跟上事件的类型,如bindtap绑定一个点击事件,对应的值是一个字符串,需要在page构造器中定义同名函数,每次触发事件之后就会执行对应函数的内容。
  2. 阻止事件冒泡 catch开头
    在小程序中除了通过bind之外,还可以通过catch进行事件绑定,通过catch绑定的事件不会触发事件冒泡。
  3. 事件捕获 capture-bind开头
    事件的触发分为两个阶段,首先是捕获阶段,其次是冒泡阶段。默认情况下事件都是在冒泡阶段触发。如果希望事件可以在捕获阶段触发,可以通过capture-bind进行事件绑定。
  4. 事件传参 data-
    在小程序中进行事件传参不能像传统的Web项目中一样,在括号里写参数。在小程序中需要在标签上通过data-方式定义事件所需的参数。

关于事件对象其他属性

type 事件类型
timeStamp 页面打开到触发事件所经过的毫秒数
target 触发事件的组件的一些属性值集合
currentTarget 当前组件的一些属性值集合
detail 额外的信息
touches 触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouches 触摸事件,当前变化的触摸点信息的数组

这里需要注意的是target和currentTarget的区别,currentTarget为当前事件所绑定的组件,而target则是触发该事件的源头组件。

<!-- data-参数名=’参数值’ --><view bindtap="handleTap" data-msg="我是事件的参数">点击事件</view>每个事件回调触发时,都会收到一个事件对象,通过这个对象可以获取路由传递的参数。handleTap(e){console.log("执行了点击事件");// 通过currentTarget中的dataset属性可以获取时间参数console.log(e.currentTarget.dataset.msg);//我是事件的参数
}

4.# 小程序如何进行页面的跳转传参以及接收数据 最常用的两个页面的跳转和传参方式:1.wx.navigateTo 2.navigator标签

保留当前页面,只能打开非 tabBar 页面。

<navigator url="/page/navigate/navigate?title=navigate" hover-class="navigator-hover">跳转到新页面</navigator>
wx.navigateTo({url: `/pages/details?id=${xxx}`
});

其他方式:

  • wx.switchTab() 不能进行页面传参
    用来 跳转至tabBar页面,并关闭其他所有非 tabBar 页面
  • wx.redirectTo() 关闭卸载当前页面,只能打开非 tabBar 页面。
  • wx.navigateTo() 一样,都 跳转至非tabBar页面,但会关闭当前页面
  • wx.reLaunch() 关闭卸载所有页面,可以打开任意页面。
  • wx.navigateBack() 用来返回上一页面或多级页面,并关闭当前页面。
    返回前面的页面,可以指定返回多少页,如果用过redirectTo,那么被关闭的页面将不能返回
wx.navigateBack({delta: 2  //返回的页面数,如果 delta 大于现有页面数,则返回到首页。})

接收参数
路由跳转传参可以通过?的方式拼接参数。跳转到指定界面之后,可以在该页面的onLoad方法中的options参数(本身是个对象)拿到路由跳转的参数。

5.# 小程序的父子传参和vue中的有什么区别

父传子 properties接收
子传父 triggerEvent方法

父传子的不同点是:微信小程序在子组件中接受父组件传 用 propertites 进行接收,而不是 props

  properties: {msg:{// type 要接收的数据的类型type:String,// value 默认值value:""},},

子传父的不同点是:微信小程序在子组件中使用 triggerEvent 抛出自定义事件名,而不是 this.$emit()

 methods: {sendData() {console.log(this.data.msg)this.triggerEvent('eventName', '要传递的参数')}}

6.# 如何优化首次加载小程序的速度

包体积优化

  • 分包加载(优先采用,大幅降低主包体积)。
  • 图片优化(1.使用tinypng压缩图片素材; 2.服务器端支持,可采用webp格式)。
  • 组件化开发(易维护)。
  • 减少文件个数及冗余数据。

请求优化

  • 关键数据尽早请求(onLoad()阶段请求,次要数据可以通过事件触发再请求);整合请求数据,降低请求次数。
  • 采用cdn缓存静态的接口数据(如判断用户登录状态,未登录则请求缓存接口数据),cdn稳定且就近访问速度快(针对加载总时长波动大)。
  • 缓存请求的接口数据。

首次渲染优化

  • 图片懒加载(节省带宽)。
  • setData优化(不要一次性设置过多的数据等)。
  • DOM渲染优化(减少DOM节点)

7.小程序关联微信公众号如何确定用户的唯一性? 使用wx.getUserInfo方法withCredentials为 true 时 可获取encryptedData,里面有 union_id。后端需要进行对称解密

8.使用webview直接加载要注意哪些事项?

一、必须要在小程序后台使用管理员添加业务域名;

二、h5页面跳转至小程序的脚本必须是1.3.1以上;

三、微信分享只可以都是小程序的主名称了,如果要自定义分享的内容,需小程序版本在1.7.1以上;

四、h5的支付不可以是微信公众号的appid,必须是小程序的appid,而且用户的openid也必须是用户和小程序的。

9.小程序和vue写法区别

生命周期不一样: 1)小程序生命周期:onLoad页面加载、onShow页面显示、onReady页面初次渲染完成、onHide页面隐藏、onUnload页面卸载 2)vue生命周期:data、mouted、beforeupdate、updated、beforedestory、destroyed 数据请求时间不一样: 1)小程序在onLoad或者onShow中请求数据 2)Vue在created或mounted中请求数据 数据绑定方式不一样: 1)小程序使用“大括号”绑定数据 2)Vue使用“冒号”绑定数据 显示和隐藏元素不一样 1)小程序中使用wx-if和hidden控制元素显示和隐藏 2)Vue中使用v-if和v-show控制元素的显示和隐藏 事件处理不一样: 1)小程序使用bindtap和catchtap绑定事件,catchtap阻止事件冒泡 2)Vue使用v-on和@event绑定事件 数据双向绑定不一样: 1)在小程序中双向绑定时,需要在表单内容发生变化时,使用this.setData( )来将表单上的值赋值给data中的对应值 2)Vue只需要使用v-model就可以双向绑定data中的值 绑定事件传参不一样: 1)在小程序中需要使用e.currentTarget.dataset.*的方式获取,从而完成参数的传递 2)Vue只需要在触发的事件中,将传递的参数作为形参传入 父子组件通信不一样: 1)子组件创建不一样: a,在vue中:编写子组件、父组件通过import引入、conponents中注册、在模板中使用 b,在小程序中:编写子组件、子组件的json文件中,将该文件声明为组件、父组件的json文件中,在usingComponents填写子组件的组件吗及路径、在父组件中直接引用即可 2)父子组件传参不一样 a,在Vue中:父组件中在子组件上通过v-bind传入一个值,子组件通过props接收 b,在小程序中:在父组件中直接赋值给一个变量,在子组件中properties中,接收传递的值 3)父组件想要调用子组件的方法 a,小程序中给子组件添加id或class,然后通过this.selectComponent找到子组件,调用子组件方法 b,Vue中给子组件添加一个ref,通过this.refs.ref的值获取该子组件调用子组件中的任意方法