【微信小程序】项目实战—抽签应用

简介: 【微信小程序】项目实战—抽签应用

完成学习前面章节的微信小程序开发必备的基础知识,从本章开始就可以进入完整的应用开发了。很多大型的应用主要通过App来实现,微信小程序的定义则主要是工具类的应用,宗旨是做到即用即走。抽签应用完全符合这一特性,所以本章将实现一个抽签类型的小程序。

本章主要涉及的知识点有:

UI组件的使用

表单的使用

本地存储

1.项目起步

本节开始设计抽签项目所需要包含的功能。在平时遇到难以决定的事情时,可以使用小程序进行抽签。该抽签应用包括以下功能。

增加抽签项及其内容项

删除抽签项及其内容项

抽签

本地存储

输入校验

用户交互提示

接下来新建一个项目draw作为本章的项目。导入UI框架iView,并在根目录新建文件夹images。项目中所需要用到的图片可以直接从示例代码中获取。目录如图所示。

image-20220727155057058

将app.js清空,删除index和logs页面,新建home、mine、edit-item、draw-view页面,最后在app.json、app.wxss中输入以下代码:

// app.json

·..

"tabBar":{

"selectedColor":"#2C8BEF""list": [

{

"selectedIconPath":"images/home2.png","iconPath":"images/home.png","pagePath":"pages/home/home","text":"首页"},{

"selectedIconPath":"images/mine2.png","iconPath":"images/mine.png","pagePath":"pages/mine/mine","text":"我的"

}]

},

·..

// app.wxss page {

background-color: #EFEFEF;

运行效果如图所示。

image-20220727155740162

【代码解析】一个带底部导航栏的首页已经完成。导航栏的内容主要是通过tabBar参数来实现的。

注意:应把app.json中的v2删除,否则UI框架可能会运行出错。

2.项目开发

准备工作完成后,正式进入编码阶段。

2.1首页开发

打开home页面,输入以下代码:

// home.json

"navigationBarTitleText":"首页""usingComponents":

{

"i-button":"/dist/button/index",

"i-cell-group":"/dist/cell-group/i ndex","i-cell":"/dist/cell/index",

   "i-modal":"/dist/modal/index"

}

// home.wxml

<i-button type="primary" bind:click="addItem">添加选项</i-button>

<i-cell-group><i-cell

wx:for="{{listData}}" wx:for-item="item" wx:key="item"

data-item="{{item}}" title="{{item}}" bindtap="draw"

bindlongpress="delete" is-link></i-cell></i-cell-group>

<i-modal title="删除确认" visible="{{ visible }}" actions="{{ actions }}" bind:click="realDelete">

<view>删除后无法恢复哦</view></i-modal>

// home.js

// pages/home/home.js

Page({ data:{

listData:[],

currentItem:'' actions: [{

name:'取消'},

name:'删除',

color:'#ed3f14', loading:false}

],

visible:false},

onShow: function () {  

this.setData({

listData:wx.getStorageSync('homeList')})},

//加选项 addItem() {

wx.navigateTo({

url:'../edit-item/edit-item',

},

//进入抽签页 draw(e){

wx.navigateTo({

url:'../draw-view/draw-view?item='+ e.currentTarget.dataset.item

},

//删除子选项弹窗 delete(e){

console.log(e) this.setData({

visible: true,

currentItem: e.currentTarget.dataset.item});

// 删除子选项

realDelete({detail}){

if (detail.index=== 1) {

var newArray=[];

for (const item of this.data.listData){

if (item!=this.data.currentItem){ newArray.push(item);

}

}

this.setData({

listData: newArray

1

wx.setStorageSync('homeList',this.data.listData)

wx.removeStoraqeSync(this.data.currentItem) wx.showToast({

title:'删除成功',

1)

   this.setData({

visible: false

!({

})

【代码解析】首先在home.json中导入需要用到的UI组件。在页面结构上,顶部是一个添加选项按钮,并通过wxfor来显示选项,最后的i-modal是弹窗组件,通过visible控制。在页面跳转方面,edit-item是添加选项页,draw-view是抽签页。删除功能通过覆盖homeList的选项来实现,删除成功后,要循环删除子选项。

2.2新增页面开发

由于还没有开发添加选项页,因此放效果图之前需要先开发一个添加选项页面。在edit-item页面中输入以下代码:

// edit-item.json{

"navigationBarTitleText":"选项","usingComponents":{

"i-panel":"/dist/panel/index","i-input":"/dist/input/index","i-button":"/dist/button/index"

/

// edit-item.wxml

<i-panel title="{{title}}">

<i-input

value="{{itemName}!"

placeholder="请输入选项"

bind:change="changeItem"/></i-panel>

<i-button bind:click="submit" type="primary">提交</i-button>

// edit-item.js

// pages/edit-item/edit-item.js Page({

data:{

title:'添加选项',

saveKey:'homeList', itemName:''

   },

onLoad:function (options){ if (options.item){ this.setData({

title:'添加"'+options.item+'"的子选项', saveKey:options.item})}

},

changeItem(e){ this.setData({

itemName: e.detail.detail.value})

},

// 提交

submit() {

if (this.data.itemName.length===0) { wx.showToast({

title:'内容过短', icon:'none'})

} else if (this.data.itemName.length >10){ wx.showToast({

title:'内容过长', icon:'none'})

}else {

var items;

var key= this.data.saveKey; if (wx.getStorageSync(key)) {

items=wx.getstorageSync(key); for (const key of items) {

if (key== this.data.itemName){ wx.showToast({ title:'已存在', icon:'none'})

returni

}

}else {

items = [];

items.push(this.data.itemName);

wx.setStorageSync(key,items); wx.showToast({

title:'保存成功',})

setTimeout(() => {

wx.navigateBack()},1000)

}})

添加选项页的运行效果如图一所示。

【代码解析】新增选项页面之后需要与新增子选项复用,所以我们编写代码的时候要兼顾两者。同样先在JSON文件中导入用到的UI组件。表单上只有一个input需要输入,提交的时候判断是否为空、是否过长即可。如果是首页选项,就保存在homeList中,子选项则以首页选项的名字为key保存。添加完成后,首页如下下图所示。

【添加选项页】

image-20220727160425487

【首页效果】image-20220727160459366

2.3 抽签页面开发

现在首页已经有了选项,并且可以通过新增页来增加。此时可以开发抽签页,列出子选项,用于抽签。打开draw-view页面,输入以下代码:

// draw-view.json

"navigationBarTitleText":"抽签","usingComponents":{

"i-button":"/dist/button/index"

"i-cell-group":"/dist/cell-group/index","i-cell":"/dist/cell/index","i-modal":"/dist/modal/index"

// draw-view.wxml

<i-button type="primary" bind:click="addItem">添加子选项</i-button><i-button type="success" bind:click="draw">抽签</i-button>

<i-cell-group><i-cell

wx:for="{{listData}}" wx:for-item="item" wx:key="item"

data-item="{{item}}" title="{{item}}"

bindlongpress="delete"></i-cell></i-cell-group>

<i-modal title="删除确认"visible="{{ visible }}" actions="{{ actions }}"

bind:click="realDelete">

<view>删除后无法恢复哦</view></i-modal>

// draw-view.js

//pages/draw-view/draw-view.js Page({

data:{

listData:[], lastItem:''

currentItem:'', actions:[{

name:'取消'},

name:'删除',

color:'#ed3f14', loading:false}

],

visible:false},

onLoad:function(options){

this.setData({

lastItem: options.item

wx.setNavigationBarTitle({

title: options.item,})},

onShow:function() {

this.setData({

listData:wx.getStorageSync(this.data.lastItem)})},

//添加子选项 addItem() {

wx.navigateTo({

url:'../edit-item/edit-item?item='+ this.data.lastitem

})},

// 抽签 draw(){

if (this.data.listData.length == 0) { wx.showToast({

title:'没有数据', icon:'none'})

} else {

const randomNumber=this.getRandomNumber(0,

this.data.listData.length);

wx.showToast({

title:this.data.listData[randomNumber]})

},

// 获取随机数

getRandomNumber(begin,end){

return Math.floor(Math.random() * (end-begin))+ beging},

// 删除子选项弹窗 delete(e){

this.setData({

visible: true,

currentItem: e.currentTarget.dataset.item

});

},

// 删除子选项

realDelete({detail}) {

if (detail.index=== 1) {

var newArray=[];

for (const item of this.data.listData){

if (item!= this.data.currentItem){

newArray.push(item);

)}

this.setData({

listData: newArray})

wx.setStorageSync(this.data.lastItem,this.data.listData); wx.showToast({

title:'删除成功',})}

this.setData({

visible:false});}

})

添加子选项后,点击“抽签”按钮,运行效果如图所示。

【代码解析】进入页面后,会根据上一个页面传入的选项名来获取存储的子选项数据。点击“抽签”按钮,会通过随机数从现有子选项中抽取一个进行弹窗显示。添加、删除子选项功能与首页的基本相同。

image-20220727160903644

2.4 我的页面开发

通过前面3个页面的开发,主要的抽签流程已经走通了。为了完善这个应用,补充“我的”页面,增加清空、微信登录功能。打开mine页面,输入以下代码:

// mine.json{

"navigationBarTitleText":"我的",

"usingComponents":{

"i-card":"/dist/card/index"

"i-button":"/dist/button/index"

"i-cell-group":"/dist/cell-group/index""i-cell":"/dist/cell/index","i-modal":"/dist/modal/index"

// mine.wxml

<view class="view-margin">

<i-card

title="{{userInfo.nickName}}"

extra="{{userInfo.country}}"

thumb="{{userInfo.avatarUrl}}">

<!-- <view slot="content">用户名:张三</view> --></i-card>

</view>

<view class="view-margin"><i-cell-group><i-cell

title="清空数据"

bindtap="clearData" is-link></i-cell><i-cell

title="意见反馈"

bindtap="callBack" is-link></i-cell></i-cell-group></view>

<i-button

wx:if="{{userInfo.nickName=='未登录'}}" type="primary"

open-type="getUserInfo"

bind:getuserinfo="login">登录</i-button>

<i-button

wx:if="{{userInfo.nickName!='未登录'}}" type="error"

bind:click="logout">退出登录</i-button>

<i-modal

title="清空确认"

visible="{{ visible }}" bind:ok="delete"

bind:cancel="cancel">

<view>清空后无法恢复哦</view></i-modal>

// mine.wxss.view-margin{

margin-top:16px;}

// mine.js Page({

data:{

userInfo:{

nickName:'未登录', country:'-',

avatarUrl:'https://i.loli.net/2017/08/21/599a521472424.jpg

visible:false

onLoad(options){

if (wx.getStorageSync('userInfo')){ this.setData({

userInfo: wx.getStorageSync('userInfo')

})

},

clearData(){

this.setData({ visible:true

},

delete() {

const array=wx.getstorageSync('homeList') for (const item of array) {

wx.removeStorageSync(item)}

wx.removeStorageSync('homeList') this.setData({ visible:false

cancel() {

this.setData({ visible:false})},

login(e){

if (e.detail.userInfo){

this.setData({

userInfo: e.detail.userInfo})

wx.setStorageSync('userInfo',e.detail.userInfo)} else {

wx.showToast({

title:'登录失败', icon:'none'})

}

},

logout() {

wx.removeStorageSync('userInfo'y this.setData({

userInfo:{

nickName:'未登录', country: '-',

avatarUrl:"https://i.loli.net/2017/08/21/599a521472424.ipq

}

})}})

在“我的”页面点击“登录”按钮,会弹出权限申请框,点击允许授予权限后即可登录,运行效果如图所示。

image-20220727161215514

【代码解析】清空数据通过循环homeList里的数据把所有数据移除掉。登录功能在用户,点击允许按钮后,从e.detail.userInfo取出用户的头像、昵称等信息进行展示,并通过wxif控制“显示登录”或“退出登录”按钮。如果需要测试,可以点击微信开发工具中的“清缓存→清除登录状态”,如图所示。

image-20220727161259299

3.小结

本章综合运用前面学到的知识创建了一个易用的工具类应用。虽然该程序的基本功能已经齐全,但是仍有较大的改进空间。建议读者自行添加编辑选项、改变排序等功能来作为练习。为了将各种知识分类展示,本章的内容仅使用了本地存储,没有设计网络请求。下一章我们将做一个带网络请求的完整应用。

目录
相关文章
|
15天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中PWA技术的应用,PWA结合Web的开放性和原生应用的性能,提供离线访问、后台运行、桌面图标和原生体验。开发者可利用Service Worker实现离线访问,Worker处理后台运行,Web App Manifest添加桌面图标,CSS和JavaScript提升原生体验。实践中需注意兼容性、性能优化和用户体验。PWA技术能提升小程序的性能和用户体验,助力开发者打造优质小程序。
|
2月前
|
小程序
探索大模型与小程序的应用创新——产品面对面系列直播第一期
探索大模型与小程序的应用创新——产品面对面系列直播第一期
31 0
|
4月前
|
小程序 API 开发者
微信小程序授权登录流程以及应用到的API
微信小程序授权登录流程以及应用到的API
202 0
|
20天前
|
存储 小程序 开发者
如何提升微信小程序的应用速度
如何提升微信小程序的应用速度
|
1月前
|
关系型数据库 Serverless 分布式数据库
Serverless 应用引擎常见问题之在抖音快手小程序上使用如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
22 3
|
2月前
|
人工智能 小程序 算法
探索AI动画与小程序的应用创新-产品面对面系列直播第四期
探索AI动画与小程序的应用创新-产品面对面系列直播第四期
66 0
|
2月前
|
前端开发 小程序 JavaScript
小程序页面导航全家桶:navigateTo、redirectTo、switchTab等方法一网打尽,快速掌握不同场景下的最佳应用!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
2月前
|
小程序 开发者 容器
探索多端与小程序的应用创新——产品面对面系列直播第二期
探索多端与小程序的应用创新——产品面对面系列直播第二期
118 0
|
2月前
|
移动开发 小程序 安全
【社区每周】AIT现支持免登陆使用;小程序内嵌外跳H5页面支持支付宝端内官方应用(8月第一期)
【社区每周】AIT现支持免登陆使用;小程序内嵌外跳H5页面支持支付宝端内官方应用(8月第一期)
52 0
|
3月前
|
Dart 小程序 前端开发
WebSocket 解析与应用(包含web前端、服务端、小程序、dart/flutter中的用法)
WebSocket 解析与应用(包含web前端、服务端、小程序、dart/flutter中的用法)
197 0