今天是一年一度的1024程序员节,祝大家节日快乐。前面半年我一直在研究Python和Linux相关技术,最近有需要写微信小程序的需求,为此花点时间学了下,很容易就上手了,大家不防一试。
什么是微信小程序
- 移动互联网时代,手机
- 手机软件,在手机中安装很多软件
- 腾讯和阿里(只安装自己不用别人)
- 腾讯:微信 + N小程序
- 阿里:支付宝 + N小程序
为什么要做小程序?
微信用户基数大
在微信上用我们小程序比较便捷
如何开发小程序?
appid:wxff2dd22b6fb5a253
{
"pages": [
"pages/index/index",
"pages/logs/index"
],
"window": {
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "PDF转换器",
"backgroundColor": "#eeeeee",
"backgroundTextStyle": "light",
"enablePullDownRefresh": false
},
"tabBar": {
"selectedColor": "#CD5C5C",
"list": [{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/tabbar/[email protected]",
"selectedIconPath": "static/tabbar/[email protected]"
}, {
"pagePath": "pages/logs/index",
"text": "日志",
"iconPath": "static/tabbar/[email protected]",
"selectedIconPath": "static/tabbar/[email protected]"
}]
},
"networkTimeout": {
"request": 10000,
"downloadFile": 10000
},
"debug": true
}
编写文本信息,类似于span
容器,类似于div标签
图片
一种非常方便的布局方式。
在容器中记住4个样式即可。
display: flex; flex布局
flex-direction: column; 规定主轴水平方向:row/column
justify-content: space-around; 在主轴方向如何展示:flex-start/flex-end/center/space-around/space-between/space-evenly
align-items: flex-end; 在副轴方向如何展示: flex-start/center/space-around/space-between/space-evenly
<view bindtap="clickMe" data-nid="123" data-name="harry">点我跳转view>
Page({
/**
* 点击绑定的时间
*/
clickMe(e) {
var nid = e.currentTarget.dataset.nid
// String *harry = e.currentTarget.dataset.name
console.log(nid)
// 跳转
wx.navigateTo({
url: '/pages/redirect/redirect?id='+nid,
})
}
)}
// 跳转
wx.navigateTo({
url: '/pages/redirect/redirect?id='+nid,
})
跳转到的界面如果想要接收参数,可以在onload方法中接收
Page({
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
console.log(options.id)
},
)}
注意事项:只能跳转到非tabbar的界面
跳转到新界面
wxml
当前头像:
当前用户名:{{name}}
获取当前用户
展示数据
/**
* 页面的初始数据
*/
data: {
message: "你好呀,哈哈",
name: "",
avatarUrl: "/static/222.png"
},
changeData() {
// 获取数据
console.log(this.data.message)
// 修改数据 错误的方式,这样只能改后端
// this.data.message = "222"
// 修改数据
this.setData({message: "嗨,你好呀"})
},
<view bindtap="getUserName">获取当前用户view>
getUserName() {
var that = this
console.log('获取当前用户信息')
// 调用微信的接口, 获取用户信息
wx.getUserInfo({
success: function(res) {
// 调用成功后触发
var userInfo = res.userInfo
var nickName = userInfo.nickName
var avatarUrl = userInfo.avatarUrl
var gender = userInfo.gender //性别 0:未知、1:男、2:女
var province = userInfo.province
var city = userInfo.city
var country = userInfo.country
console.log('success', avatarUrl)
that.setData({
name: nickName,
avatarUrl: avatarUrl
})
},
fail:function(res){
// 调用失败后触发
console.log('fail', res)
}
})
},
<button open-type="getUserInfo" bindgetuserinfo="fetchInfo">获取信息buttonbutton>
// pages/login/login.js
Page({
/**
* 页面的初始数据
*/
data: {
name: "",
avatarUrl: "/static/222.png"
},
fetchInfo:function() {
var that = this
console.log('获取当前用户信息')
// 调用微信的接口, 获取用户信息
wx.getUserInfo({
success: function(res) {
// 调用成功后触发
var userInfo = res.userInfo
var nickName = userInfo.nickName
var avatarUrl = userInfo.avatarUrl
var gender = userInfo.gender //性别 0:未知、1:男、2:女
var province = userInfo.province
var city = userInfo.city
var country = userInfo.country
console.log('success', avatarUrl)
that.setData({
name: nickName,
avatarUrl: avatarUrl
})
},
fail:function(res){
// 调用失败后触发
console.log('fail', res)
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
注意事项:
想要获取用户信息,必须经过用户授权(button)
已授权
不授权,通过调用wx.opensettings
// 打开配置,手动授权
wx.openSetting({})
getLocalPath:function() {
var that = this
wx.chooseLocation({
success:function(res){
console.log(res)
that.setData({
localpath: res.address
})
}
})
},
app.json
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将被展示在小程序"
}
},
"requiredPrivateInfos": [
"getLocation"
]
<text>商品列表text>
<view>----------------------------view>
<view>
<view wx:for="{{dataList}}">{{index}}-{{item}}view>
view>
<view>----------------------------view>
<view>
{{userInfo.name}}
{{userInfo.age}}
view>
<view>----------------------------view>
<view>
<view wx:for="{{userInfo}}">{{index}}:{{item}}view>
view>
js
/**
* 页面的初始数据
*/
data: {
dataList: ["小明", "harry", "小花"],
userInfo: {
name: "harry",
age: 18
}
},
wxml
<text bindtap="uploadImage">请上传图片text>
<view class="container">
<image wx:for="{{imageList}}" src="{{item}}">image>
view>
js
uploadImage:function(){
var that = this
wx.chooseImage({
count: 6,
sizeType: ["original", "compressed"],
sourceType: ["album","camera"],
success: (res) => {
console.log(res)
// 默认图片 + 新选择图片
that.setData({
imageList: that.data.imageList.concat(res.tempFilePaths)
})
},
fail: (res) => {
console.log(res)
},
complete: (res) => {
console.log(res)
},
})
},
注意:图片目前只是上传到内存。
标签(组件)
时间
bindtap
<view bindtap="func">view>
<view bindtap="func" data-xx="123">view>
func:function(e){
e.currentTarget.dataset
}
api
wx.navigateTo({
url: '/pages/redirect/redirect?id='+nid,
})
wx.openSetting()
wx.getUserInfo({
success: function(res) {
}
})
wx.chooseLocation({
success:function(res){
}
})
wx.chooseImage({
count: 6,
sizeType: ["original", "compressed"],
sourceType: ["album","camera"],
success: (res) => {
}
})
数据绑定
for指令
注意:setData + that
1.拍卖详细页面
拍卖列表页面通过for循环+后端数据展示信息
点击拍卖列表中的某项拍卖时,需要将自己的id传递给拍卖详细页面
2.发布消息的页面
<textarea>textarea>
双向绑定
小程序公共对象
App.js
App({
/**
* 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
*/
onLaunch: function () {
var userInfo = wx.getStorageSync('userInfo')
if (userInfo){
this.globalData.userInfo = userInfo
}
},
globalData:{
userInfo: null
},
initUserInfo:function(res, localUser){
console.log(localUser.nickName)
var info = {
token: res.token,
phone: res.phone,
nickName: localUser.nickName,
avatarUrl: localUser.avatarUrl
}
console.log(info)
// 获取公共app, 赋值, 全局变量赋值
this.globalData.userInfo = info // {phone:xxx, token:xxx}
// 在本地存储值
wx.setStorageSync('userInfo', info)
},
delUserInfo:function(){
this.globalData.userInfo = null
wx.removeStorageSync('userInfo')
}
})
var app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
userInfo:null
},
/**
* 生命周期函数--监听页面显示(每次都执行)
*/
onShow() {
this.setData({
userInfo: app.globalData.userInfo
})
},
/**
* 用户注销
*/
onClickLogout:function(){
app.globalData.userInfo = null
wx.removeStorageSync('userInfo')
this.setData({
userInfo:null
})
}
})
注意:修改globalData之后, 其他页面已用的值不会自动变化,而是需要手动设置。
本地存储
wx.getStorageSync('userInfo')
wx.setStorageSync('userInfo', info)
wx.removeStorageSync('userInfo')
页面调用栈
var pages = getCurrentPages()
prevPage = pages[pages.length-2]
跳回上一个页面
wx.navigateBack({})
小程序页面的生命周期
全局app.js
App({
/**
* 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
*/
onLaunch: function () {
var userInfo = wx.getStorageSync('userInfo')
if (userInfo){
this.globalData.userInfo = userInfo
}
},
globalData:{
userInfo: null
}
})
wx:if指令
父页面:
/pages/xx/xxx?id=1
子页面:
onLoad:function(){
}
子页面:
/**
* 选择话题事件
*/
chooseTopic:function(e){
var topicInfo = e.currentTarget.dataset.xx
var pages = getCurrentPages()
var prevPage = pages[pages.length-2]
// prevPage.setData({ topicText: topicInfo.title })
prevPage.setTopicData(topicInfo)
// 把这个值传给父界面
wx.navigateBack({})
},
注意:data-xx可以给事件传值
1.打开图片进行本地预览
2.将本地图片上传到云
3.输入文字 & 选择相应信息
4.发布:
必须上传完毕之后, 才允许点击发布按钮
<progress percent="{{precent1}}" >progress>
<progress percent="{{precent2}}" activeColor="#DC143C">progress>
/**
* 页面的初始数据
*/
data: {
imageList:[
{id:1, title:'pic1', precent: 20 },
{id:2, title:'pic2', precent: 40 },
{id:3, title:'pic3', precent: 60 }
],
precent1:20,
precent2:50
},
/**
* 修改百分比
*/
changePercent:function(){
var num = 2
this.setData({
["imageList[0].precent"]:80,
["imageList[" + num + "].precent"]:90,
["imageList[3].title"]:"哈哈哈"
})
},
<view wx:for="{{imageList}}">
<view>{{item.title}}view>
<progress percent="{{item.precent}}" >progress>
view>
<button bindtap="changePercent">更新button>
/**
* 闭包
*/
bibaoAction:function(){
// 闭包1
var dataList = [11, 2, 45]
for (var i in dataList) {
function v1(data){
wx.request({
url: 'xx',
success:function(res){
console.log(i)
}
})
}
v1(dataList[i])
}
// 闭包2
for (var i in dataList) {
(function(data){
wx.request({
url: 'xx',
success:function(res){
console.log(i)
}
})
})(dataList[i])
}
},
全局配置下拉刷新, app.json
"window": {
"enablePullDownRefresh": True
},
局部下拉刷新, xxx.json
{
"usingComponents": {},
"enablePullDownRefresh": true
}
方式1:自己构造
<view style="width:50%">
view>
<view style="width:50%">
view>
方式2:设置样式css
<view class="container">
<view class="item">
<image mode="widthFix" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2F%2Fpic%2F5%2F8d%2F5f31a37412.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1664420148&t=2d54b8c73bb16e55720d4219ac4013d8">image>
view>
<view class="item">
<image mode="widthFix" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp6.itc.cn%2Fimages01%2F20200731%2Feafbff9ae5e94f939ab41097518a23c1.jpeg&refer=http%3A%2F%2Fp6.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1664420148&t=878daea64d40ea5f0dd900121dd635ae">image>
view>
view>
/* pages/news2/news2.wxss */
.container{
-moz-column-count: 2; /* 分为两列 */
-webkit-column-count: 2;
column-count: 2;
-moz-column-gap: 20rpx;
-webkit-column-gap: 20rpx;
columns-gap: 20rpx
}
.container .item{
break-inside: avoid-column;
-webkit-column-break-inside: avoid;
}
.container .item .image{
width: 100%;
display: block;
}