1. 请你讲述一下微信小程序原理
1、微信小程序采用JavaScript、WXML、WXSS三种技术进行开发,从技术讲和现有的前端开发差不多,但深入挖掘的话却又有所不同
2、JavaScript:首先JavaScript的代码是运行在微信App中的,并不是运行在浏览器中,因此一些H5技术的应用,需要微信App提供对应的API支持,而这限制住了H5技术的应用,且其不能称为严格的H5,可以称其为伪H5,同理,微信提供的独有的某些API,H5也不支持或支持的不是特别好
3、WXML:WXML微信自己基于XML语法开发的,因此开发时,只能使用微信提供的现有标签,HTML的标签是无法使用的
4、WXSS:WXSS具有CSS的大部分特性,但并不是所有的都支持,而且支持哪些,不支持那些并没有详细的文档
5、微信的架构,是数据驱动的架构模式,它的UI和数据是分离的,所有的页面更新,都需要通过对数据的更改来实现
6、小程序分为两个部分webview和appService。其中webview主要用来展现UI,appService有来处理业务逻辑、数据及接口调用。它们在两个进程中运行,通过系统层JSBridge实现通信,实现UI的渲染、事件的处理
2. 分析下微信小程序的优劣势
优势:
1、无需下载,通过搜索和扫一扫就可以打开
2、良好的用户体验:打开速度快
3、开发成本要比App要低
4、安卓上可以添加到桌面,与原生App差不多
5、为用户提供良好的安全保障。小程序的发布,微信拥有一套严格的审查流程, 不能通过审查的小程序是无法发布到线上的
劣势:
1、限制较多。页面大小不能超过1M。不能打开超过5个层级的页面
2、样式单一。小程序的部分组件已经是成型的了,样式不可以修改。例如:幻灯片、导航
3、推广面窄,不能分享朋友圈,只能通过分享给朋友,附近小程序推广。其中附近小程序也受到微信的限制
4、依托于微信,无法开发后台管理功能
3. 说出提高小程序的应用速度
- 提高页面加载速度
- 用户行为预测
- 减少默认data的大小
- 组件化方案
4. 小程序的文件种类
- WXML 是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。内部主要是微信自己定义的一套组件
- WXSS 用于描述WXML的组件样式 类似于 css
- Js 逻辑处理,网络请求
- Json 小程序页面配置,如页面注册,页面标题及tabBar
5. 小程序的wxss 和 css有哪些不一样的地方
- wxss的图片引入需要使用外链地址
- 没有Body, 样式可以直接使用import导入
6. 小程序的生命周期函数
onLoad页面加载时触发。一个页面只会调用一次,可以在onLoad的参数中获取打开当前页面路径中的参数onShow()页面显示/切入前台时触发onReady()页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互onHide()页面隐藏/切入后台时触发。 如navigateTo或底部tab切换到其他页面,小程序切入后台等onUnload()页面卸载时触发。如redirectTo 或 navigateBack到其他页面时
7. 组件生命周期函数
- created() :组件实例刚刚被创建好时触发。
- attached() :进入页面节点树后触发
- detached() 组件离开页面节点树后触发
8. 组件之间和跳转之间和方法绑定的参数的传参
-
父传孩:组件之间通过
proprites传递参数,现在子组件定义properties定义参数类型和默认值,具体值有父组件调用子组件的时候通过相同的名字调用格式一 text:String
格式二 **text :{ type:String , value : '' ,} ** value是默认值
-
子传父:孩:
that.triggerEvent("函数名字",传递的参数)父:bind:父亲的函数="_search(实现的函数)" 然后实现的函数可以通过参数e.detail获取传递数值
跳转之间传递参数来结尾通过?xx=值传递,之后在跳转完成的界面通过onload options传递
方法绑定的传参,在html界面通过data-xx="" 之后在调用的方法中e.currentTarget.dataset.xx就可以调用参数了
- 子传递父亲:孩子通过
this.triggerEvent("up",res)创建一个事件 父亲通过组件,bind-xx()="函数名字"后可以通过函数名字(e)参数获取数据
9. 获取用户信息
<button type="primary" open-type="getUserInfo"
bindgetuserinfo="handleGetUserInfo">
登录
</button>
open-type="getUserInfo" 设置按钮功能为获取用户信息
bindgetuserinfo 是点击后的调用 自带的形参中,就有用户信息
handleGetUserInfo(e) {
console.log(e)
const { userInfo } = e.detail;
}
小程序关联微信公众号如何确定用户的唯一性?使用
wx.getUserInfo方法withCredentials为true时 可获取 <encryptedData,里面有union_id。后端需要进行对称解密
8. 微信小程序运用到的各种接口和特别的方法
-
x.request()这个方法相同于ajax,但是默认的是get方法,所以无法传递文件,只能传递文字参数 -
wx.uploadfile()不同于上一个方法,此方法能够上传文件,原理是选择上传的文件变成一个临时路径传递给后端,后端进行处理 -
获取oppenid的接口,将程序的id,秘匙,和用户id一同传给后端,成功则返回用户对于该小程序唯一的oppenid,用来唯一表示用户
-
wx.getUserProfile:获取用户的基本信息,包括用户名,用户头像地址,性别,所在城市和语言 -
qq地图提供的特殊函数调用:调用第三方的方法时,要先在第三方注册获得秘匙方能调用:首先先导入注册得到实例对象,后通过对象;qq地图提供将经纬度转化成实例坐标:
wxMap.reverseGeocoder({location:经纬度})
6. wx.createMapContext(xx):xx提供map id可以获取此地图对象
this.mapCtx.getCenterLocation:获取地图的中心位置,由res给出
10. 你是怎么封装小程序的数据请求?
- 把所有的接口放在同一的js文件中导出
- 在app.js中创建封装请求数据的方法
- 在子页面中调用封装的方法请求数据
11. 小程序页面跳转?
wx.navigateTo():保留当前页,跳转到应用内某个页面,但是不能跳转到tabbarwx.redirectTo():关闭当前页,跳转到用用内某个页面,但是不能跳到tabbarwx.switchTab():跳转到tabbar,并关闭其他所有非tabbar页面wx.navigateBack():关闭当前页面,返回上一页或者多页,可通过getCurrentPage() 获取当前的页面栈,决定需要返回几层wx.reLaunch():关闭所有页面,打开到应用内的某个页面
12. bindtap和catchtap的区别?
bind事件绑定不会阻止冒泡事件向上冒泡catch事件绑定可以阻止冒泡事件向上冒泡
13. 小程序调用后台接口遇到哪些问题?
- 数据的大小限制,超过范围会直接导致整个小程序崩溃,除非重启小程序;
- 小程序不可以直接渲染文章内容这类型的html文本,显示需借助插件
- 注:插件渲染会导致页面加载变慢,建议在后台对文章内容的html进行过滤,后台直接处理批量替换p标签div标签为view标签。然后其他的标签让插件来做。
14. 小程序对wx:if 和hidden 使用的理解?
wx:if有更高的切换消耗hidden有更好的初始渲染消耗- 因此,如果需要频繁切换的情境下,用hidden更好,如果在运行时条件不大可能改变则wx:if较好。
15. 小程序如何实现下拉刷新?
用view代替scroll-view,设置onPullDownRefresh函数实现。
1、在json文件中配置enablePullDownRefresh为true(app.json中在window中设置enablePullDownRefresh,此效果作用于全局)
2、在js文件中实现onPullDownRefresh方法,在网络请求完成后调用wx.stopPullDownRefresh()来结束下拉刷新
15. 小程序的传值方法有哪些?
- 给HTML元素添加data-*属性来传递我们需要的值,然后通过
e.currentTarget.dataset或onload的param参数获取。但data-名称不能有大写字母和不可以存放对象 - 设置id 的方法标识来传值通过
e.currentTarget.id获取设置的id的值,然后通过设置全局对象的方式来传递数值 - 使用全局变量实现数据传递 ,在
app.js文件中定义全局变量globalData, 将需要存储的信息存放在里面 - 页面跳转或重定向时,使用url带参数传递数据 如
wx.navigateTo与wx.redirectTo - 使用组件模板
template传递参数 - 使用缓存传递参数
- 使用数据库传递参数
16. 怎么解决小程序异步请求问题
- 小程序支持大部分
ES6语法 - 在返回成功的回调里面处理逻辑
Promise异步
17. 小程序简单介绍下三种事件对象的属性列表?
基础事件(BaseEvent)
type:事件类型timeStamp:事件生成时的时间戳target:触发事件的组件的属性值集合currentTarget:当前组件的一些属性集合
自定义事件(CustomEvent)
detail
触摸事件(TouchEvent)
toucheschangedTouches
18. app.json 是对当前小程序的全局配置,讲述三个配置各个项的含义
pages字段—— 用于描述当前小程序所有页面路径,这是为了让微信客户端知道当前你的小程序页面定义在哪个目录。window字段—— 小程序所有页面的顶部背景颜色,文字颜色定义在这里的tab字段—小程序全局顶部或底部tab
19. 微信小程序与vue区别
- 生命周期不一样,微信小程序生命周期比较简单
- 数据绑定也不同,微信小程序数据绑定需要使用
{{}},vue直接:就可以 显示与隐藏元素,vue中,使用v-if和v-show - 控制元素的显示和隐藏,小程序中,使用
wx-if和hidden控制元素的显示和隐藏 - 事件处理不同,小程序中,全用
bindtap(bind+event),或者catchtap(catch+event)绑定事件,vue:使用v-on:event绑定事件,或者使用@event绑定事件 - 数据双向绑定也不也不一样在
vue中,只需要再表单元素上加上v-model,然后再绑定data中对应的一个值,当表单元素内容发生变化时,data中对应的值也会相应改变,这是vue非常nice的一点。微信小程序必须获取到表单元素,改变的值,然后再把值赋给一个data中声明的变量。
20. 小程序和vue双向绑定?
- 在vue中进行数据绑定后,当数据修改了会直接更新到视图上
- 但是在小程序中呢,data数据修改是不会直接同步到,必须调用this.setData()这个方法
21. webview的页面怎么跳转到小程序导航的页面
小程序导航的页面可以通过switchTab,但默认情况是不会重新加载数据的。若需加载新数据,则在success属性中加入以下代码即可:
success: function (e) {
var page = getCurrentPages().pop();
if (page == undefined || page == null) return;
page.onLoad();
}
webview的页面,则通过
wx.miniProgram.switchTab({
url: '/pages/index/index'
})