该内容主要整理关于小程序的相关面试题,其他内容面试题请移步至 最新最全的前端面试题集锦 查看。
微信小程序项目结构主要有四个文件类型:
wxml
模板文件,是框架设计的一套标签语言,结合基础组件、事件系统、可以构建出页面的结构;wxss
样式文件,是一套样式语言,用于描述 WXML
的组件样式;js
脚本逻辑文件,逻辑处理网络请求;json
配置文件,小程序设置,如页面注册,页面标题及tabBar
;app.json
整个小程序的全局配置,包括:
pages
: [所有页面路径]window
: {背景色、导航样式、默认标题}tab
等app.js
监听并处理小程序的生命周期函数、声明全局变量;app.wxss
全局配置的样式文件。wx:if
这样的属性以及 {{ }}
这样的表达式;WXML
仅能在微信小程序开发者工具中预览,而 HTML
可以在浏览器内预览;WXML
对组件进行了重新封装;JS Core
内,没有DOM
树和window
对象,小程序中无法使用window
对象和document
对象。WXSS
具有 CSS
大部分的特性,但是也做了一些扩充和修改;WXSS
新增了尺寸单位,WXSS
在底层支持新的尺寸单位 rpx
;WXSS
仅支持部分 CSS
选择器;WXSS
提供全局样式与局部样式;WXSS
不支持 window
和 dom
文档流。方案一:
js
文件中并导出;app.js
中创建封装请求数据的方法;方案二:
utils
目录及api.js
文件和apiConfig.js
文件;appConfig.js
封装基础的请求方法,设置请求体,带上token和异常处理等;api.js
中引入apiConfig.js
封装好的请求方法,根据页面数据请求的urls
,设置对应的方法并导出;app.js
中使用全局变量实现数据传递;data-*
属性来传递值,然后通过e.currentTarget.dataset
或onload
的param
参数获取。注:data-
名称不能有大写字母、不可以存放对象;id
的方法标识来传值,通过e.currentTarget.id
获取设置的id
的值,然后通过设置全局对象的方式来传递数值;navigator
中使用url
带参数传递数据;template
传递参数;两者大体相同,但小程序直接使用this.data
属性是不可以同步到视图的,必须调用this.setData()
方法。
data
来实现。this.xxx
取值;小程序中,通过 this.data.xxx
取值。page.js
中直接定义即可,vue的方法通过写在method
中进行定义。wx:for = "{{ lists }}"
;Vue是 v-for = "item in lists"
;data
模型(赋值):
this.data.item 需要调用 this.setData({item:1}) 进行赋值
this.item 调用 this.item = 1 赋值
小程序的双向绑定原则上来说并不是真正的双向绑定。如果在小程序 .js
文件中改变了某个变量的值,那么页面上的值并不会跟着改变;如果想要页面上的值也跟着改变的话,需要通过this.setData
来操作。而 Vue 默认就是双向绑定,只改变了某个变量的值,页面上也会跟着改变。
全局生命周期app.js:
onLaunch()
小程序初始化,只会调用一次,可获取当前页面路径中的参数;onShow()
页面显示或切入前台时触发,一般用来发送数据请求;onHide()
页面隐藏或切入后台时触发;onError()
页面发生错误时触发;onPageNotFound()
小程序要打开的页面不存在时触发,可以在此函数进行重定向操作。小程序页面的生命周期:
onLoad()
页面加载时触发,只会调用一次,可获取当前页面路径中的参数;onShow()
页面显示或切入前台时触发,一般用来发送数据请求;onReady()
页面初次渲染完成时触发, 只会调用一次,代表页面已可和视图层进行交互;onHide()
页面隐藏或切入后台时触发, 如底部 tab
切换到其他页面或小程序切入后台等;onUnload()
页面卸载时触发,如redirectTo
或navigateBack
到其他页面时;onPullDownRefresh()
下拉刷新的钩子函数,用户下拉刷新时会自动走到这个函数中;onReachBottom()
上拉触底的钩子函数;onShareAppMessage()
用户点击右上角分享。小程序组件中的生命周期:
lifetimes:组件生命周期
created()
在组件实例刚刚被创建时执行;attached()
在组件实例进入页面节点树时执行;ready()
在组件在视图层布局完成后执行;moved()
在组件实例被移动到节点树另一个位置时执行;detached()
在组件实例被从页面节点树移除时执行;error()
每当组件方法抛出错误时执行。pageLifetimes:组件所在页面的生命周期
show()
页面被展示时执行;hide()
页面被隐藏时执行;resize()
页面尺寸变化时执行。JavaScript
、WXML
、WXSS
三种技术进行开发;webview
和appService
两个部分:webview
用来展现UI,appService
用来处理业务逻辑、数据及接口调用,两个部分在两个进程中运行,通过系统层JSBridge
实现通信,实现UI的渲染、事件的处理等。
个人认为,如果是新项目,且没有旧的 h5 项目迁移,则考虑用小程序原生开发,好处是相比于第三方框架,坑少。
如果有老的 h5 项目且是 vue 开发 或者 也有 h5 项目也需要小程序开发,则比较适合 wepy 或者 mpvue 来做迁移或者开发。
具体见:微信小程序之提高应用速度小技巧
小程序支持 ES6
语法,使用 Promise
来解决异步请求
function asyncFn1(){
return new Promise(function (resolve, reject) {
//...
})
}
// 调用
asyncFn1()
.then(asyncFn2)
.then(asyncFn3);
使用 wx.getUserInfo
方法 withCredentials
为 true
时,可获取 encryptedData
,里面有 union_id
,后端需要进行对称解密。
在json配置中开启 enablePullDownRefresh
下拉刷新的动作,在.js
文件中通过 onPullDownRefresh
函数来实现相关的操作。
详细的实现代码请移步至:微信小程序之实现下拉刷新效果
appid
,必须是小程序的appid
,而且用户的openid
也必须是用户和小程序的。详情请移步至:H5网页跳转至微信小程序
wx.miniProgram.navigateTo({
url:’pages/login/login’+’$params’
})
// 跳转到小程序导航页面
wx.miniProgram.switchTab({
url:’/pages/index/index’
})
bindtap
是不会阻止冒泡事件的,catchtap
是阻止事件冒泡的。wx.navigateTo()
保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar
页面 ;wx.redirectTo()
关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar
页面;wx.switchTab()
跳转到 tabBar
页面,并关闭其他所有非 tabBar
页面;wx.navigateBack()
关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages()
获取当前的页面栈,决定需要返回几层;wx.reLaunch()
关闭所有页面,打开到应用内的某个页面。可以按照在 wxml、js和跳转失败进行区分:
可以通过 this.setData
来进行改变。
可以通过 wx.setStorageSync('键名', 对应的值)
来进行数据持久化存储。
bind-tap
点击事件 向 app.js
定义的方法中获取回执;data
的值 实现双向绑定。usingComponents
,引入组件;properties
接收就可以使用了。现在小程序官方提供了 自定义 tabBar 的能力,根据官方提供的demo很容易就可以实现自定义 tabBar。
但是要实现 tab
选中态,要在当前页面下,通过 getTabBar
接口获取组件实例,并调用 setData
更新选中态。
app.json
中的 tabBar
项指定 custom
字段,同时其余 tabBar
相关配置也补充完整。tab
页的 json
里需声明 usingComponents
项,也可以在 app.json
全局开启。tabBar
代码相关文件。tabBar
代码:用自定义组件的方式编写即可,该自定义组件完全接管 tabBar
的渲染。另外,自定义组件新增 getTabBar
接口,可获取当前页面下的自定义 tabBar
组件实例。URL传值
这种方式最常用,比如通过 wx.navigateTo({})
直接通过跳转页面的URL进行传值:
wx.navigateTo({
url: '../detail/detail?cid=' + cid + '&access_token=' + access_token;
})
然后在另一个页面通过 options
进行接收:
onLoad: function (options) {
console.log('cid =' + options.cid);
console.log('access_token =' + options.access_token);
}
这种传值方式只适合值比较少的时候使用。
本地缓存
传值比较多的时候,建议写本地缓存进行传值。
小程序API提供了本地缓存数据的API,默认可以缓存10M的数据:
wx.setStorageSync('checkin', checkin);
在需要的页面直接调用 wx.getStorageSync
即可获取到存储的本地缓存数据。
全局app
我们可以利用 app.js
和 app.wxss
中的代码都是全局生效的这一特性,在不同页面之间进行传值。
App({
// 全局变量
globalData: {
host: 'https://xxx/xcx',
version: 2,
versionFeature: '更新说明'
}
})
在使用的页面中通过引入 app.js
来使用定义的全局变量。
const app = getApp();
let app_host = app.globalData.host;
本地资源图片无法通过WXSS 获取,可以使用网络图片,或者 base64,或者使用标签来解决。
一个应用同时只能打开5个页面,当已经打开了5个页面之后,wx.navigateTo
不能正常打开新页面。请避免多层级的交互方式,或者使用 wx.redirectTo
。
tabBar
设置不显示有如下几个原因:
tabBar
的数量少于2项或超过5项都不会显示;tabBar
写法错误导致不显示;tabBar
没有写 pagePath
字段(程序启动后显示的第一个页面)html
文本内容,若需显示要借助插件,但插件渲染会导致页面加载变慢,所以最好在后台对文章内容的html
进行过滤,后台直接处理批量替换p
标签div
标签为view
标签,然后其它的标签让插件来做,减轻前端处理的时间。wx.login()
获取 code
wx.request()
发送 code
到我们自己的服务器(我们自己的服务器会返回一个登录状态的标识,比如 token
)token
进行存储,以便下次使用token
。小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。对于开发者而言,小程序开发门槛相对较低,难度不及APP,能够满足简单的基础应用,适合生活服务类线下商铺以及非刚需低频应用的转换。
优点:
缺点:
let dataList = ['alex','lld','uuid']
for(let i in dataList){
(function(data){
wx.request({
url:'xxx',
success:(res) => {
console.log(data);
}
})
})(dataList[i])
}
因为微信小程序处理函数是异步执行的,异步执行造成的结果可能和预期的不合,如果函数中有循环,最后的结果都一样,所以使用 js 闭包可以解决这个问题。
以上几个问题可根据自己实际情况而答。
上面的好多问题在我们的实际开发过程中都会碰到,既可以做为一个面试经验,也可以作为技术分享,希望总结的内容可以帮助到大家,有任何问题欢迎讨论留言。
不要忘记一键三连哦~
骚年 加油!