1. 前言
微信小程序作为一种新型的应用形态,近年来在移动应用市场中受到了广泛的关注和追捧。对于已经从事小程序开发的同学来说,我们需要充分掌握小程序的开发技能;而对于面试者来说,我们则需要准备充分,提高我们的面试竞争力。本文将从多个方面,介绍小程序开发必知必会的面试题,帮助广大小程序开发者更好地备战面试。
2. 常见问题解答
2.1 如何处理小程序中的数据存储?
小程序中有两种主要的数据存储方式:
本地存储:通过小程序提供的wx.getStorageSync和wx.setStorageSync,可以实现数据的本地存储和读取。
//存储数据
wx.setStorageSync('key', 'value')
//读取数据
var value = wx.getStorageSync('key')
远程服务器存储: 小程序可以通过向服务器发送请求来实现数据的存储和读取。可以使用小程序提供的wx.request方法,或者通过封装过后的类库来实现对后台数据的操作。
// 发送请求
wx.request({
url: 'https://example.com/api/getData',
data: {
x: '',
y: ''
},
header: {
'content-type': 'application/json' // 默认值
},
success (res) {
console.log(res.data)
}
})
2.2 如何实现小程序页面的跳转?
小程序页面跳转有以下几种方式:
使用wx.navigateTo和wx.redirectTo实现页面的跳转:
//navigateTo
wx.navigateTo({
url: '/pages/index/index'
})
//redirectTo
wx.redirectTo({
url: '/pages/index/index'
})
使用wx.switchTab实现tab页面的切换:
wx.switchTab({
url: '/pages/index/index'
})
2.3 小程序中如何实现数据绑定?
小程序中使用数据绑定可以实现数据的双向绑定,即当数据发生变化时,视图也会随之变化。
//js
Page({
data: {
text: 'welcome'
},
getText: function(e) {
this.setData({
text: e.detail.value
})
}
})
2.4 小程序中如何实现列表循环渲染?
小程序中可以使用wx:for指令实现列表渲染,通过设置wx:for-items属性来进行数据的遍历,同时也可以使用wx:for-index和wx:for-item分别获取到循环遍历的索引和值。
{{index}}: {{item.msg}}
//js
Page({
data: {
array: [{
msg: 'hello'
}, {
msg: 'world'
}]
}
})
3. 实现案例分析
3.1 实现微信小程序登录功能
微信小程序的登录流程可以大致分成以下几个步骤:
通过wx.login获取到code,将code发送到后台服务器进行处理。
wx.login({
success (res) {
if (res.code) {
//将code发送到后台服务器
wx.request({
url: 'https://example.com/api/login',
data: {
code: res.code
},
success: function(res) {
console.log(res.data)
}
})
}
}
})
后台服务器通过code,获取到用户的openid,并将其返回给小程序前端。
//后台代码示例(使用express框架)
const express = require('express')
const app = express()
const axios = require('axios') //引入axios库
const APPID = 'XXXX'
const APPSECRET = 'XXXX'
const getOpenidByCode = async (code) => {
const response = await axios.get('https://api.weixin.qq.com/sns/jscode2session', {
params: {
appid: APPID,
secret: APPSECRET,
js_code: code,
grant_type: 'authorization_code'
}
})
return response.data
}
app.get('/api/login', async (req, res) => {
const { code } = req.query
const { openid } = await getOpenidByCode(code)
res.status(200).json({ openid })
})
app.listen(3000, () => console.log('listening on port 3000'))
3.2 实现微信支付功能
微信支付流程如下:
使用wx.requestPayment打开微信支付界面。
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success (res) { },
fail (res) { }
})
后台服务器向微信支付接口发送请求,获取到prepay_id,并将其返回给小程序前端。
//后台代码示例(使用koa框架)
const Koa = require('koa')
const app = new Koa()
const axios = require('axios')
const wxpay = require('node-wxpay') //引入wxpay库
const options = {
appid: 'XXXX',
mch_id: 'XXXX',
partner_key: 'XXXX',
pfx: fs.readFileSync(`${__dirname}/XXX.p12`),
notify_url: 'https://example.com/api/payNotify'
}
const wxpay_api = wxpay.createPayment(options)
//生成订单
app.post('/api/order', async (ctx, next) => {
const { openid, productId, money } = ctx.request.body
const order_no = 'xxxx'
const body = '描述信息'
const attach = ''
const out_trade_no = `${Date.now()}-${productId}`
const total_fee = money * 100
const spbill_create_ip = '127.0.0.1'
const trade_type = 'JSAPI'
const params = {
openid,
body,
attach,
out_trade_no,
total_fee,
spbill_create_ip,
trade_type,
notify_url: options.notify_url,
}
const result = await wxpay_api.getBrandWCPayParams(params)
ctx.status = 200
ctx.body = {
prepay_id: result.prepay_id //返回prepay_id
}
})
//处理支付结果通知
app.post('/api/payNotify', async (ctx, next) => {
const params = {
openid,
attach,
out_trade_no,
total_fee,
spbill_create_ip,
trade_type,
notify_url: options.notify_url,
}
const success = await wxpay_api.notifyVerify(ctx.req)
if (success && return_code === 'SUCCESS' && result_code === 'SUCCESS') {
//处理支付成功后的逻辑
} else {
//处理支付失败后的逻辑
}
ctx.status = 200
ctx.body = 'success'
})
app.listen(3000, () => console.log('listening on port 3000'))
4. 总结
微信小程序成为移动应用的一大战场,而小程序开发人才也随之成为企业竞争的核心。本文总结了小程序应用开发的常见面试问题,并结合实际案例,详细介绍了微信小程序的开发细节。希望对正在备战小程序开发面试的同学有所帮助!