《微信小程序开发从入门到实战》学习三十一

3.4 开发参与投票页面

3.4.9 显示投票结果

在实际使用中,一个用户不能对同一个投票进行重复提交,因此需要向服务器端提交投票结果和提交用户ID。另外页面,需要完善。用户提交完投票后 ,还需要显示投票目前的结果,提交过的用户再打开这个页面也能看到投票结果而不是重新投票。通过用户ID可以查询到这个用户的投票信息。

小程序在用云开发技术实现服务端存储时,小程序会自动在请求中携带用户ID。(我还未验证)。

实现以上效果,需要在data对象增加一个voteStatus,记录当前用户是否已经投票,每个选项的投票情况,总投票数量,用户投了哪个选项的票。vote.js代码如下:

voteStatus: {//当前的投票情况

      alreadyVoted:false, //当前用户是否已经投票

      optionStatus: [], //每个选项的投票情况,包含用户投了哪个选项的票

      totalVoteCount: 0 //总投票数

    }

修改onLoad页面初加载函数和onTapVote提交投票的事件处理函数,增加对服务器端该用户的投票信息的请求和处理,增加一个getVoteStatusFromServer,代码如下:

  onLoad(options) {

    const voteID = options.voteID //通过页面路径参数获取投票ID

    this.getVoteDateFromServer(voteID) //从服务器端获取投票信息

    this.getVoteStatusFromServer(voteID) //从服务器端获取投票情况

  },

 onTapVote(){

    if(this.data.isAnonymous) {//匿名投票的情况

      const postData = {//需要提交的数据

        voteID: this.data.voteID,

        pickedOption: this.data.pickedOption

      }

      // TODO 将postData数据上传到服务器端

      this.getVoteStatusFromServer(voteID) //从服务器端获取投票情况  

    } else {//实名投票的情况

        const _this = this //在API接口的函数中,this会被改变,因此需要提前获取this的值到_this中

        wx.getUserProfile({

          desc: 'desc',

          success:(res) => {  //授权成功后,调用wx.getUserProfile接口时会回调这个函数

            const postData = {

              voteID: _this.data.voteID,

              userInfo: res.userInfo, //获取用户信息

              pickedOption: _this.data.pickedOption

            }

            console.log(postData)

            // TODO 将postData数据上传到服务器端 

            _this.getVoteStatusFromServer(_this.data.voteID)

          }

        })

    }

  },

  getVoteStatusFromServer(voteID){

    if(voteID === 'test'){ //如果投票ID为test,则伪造一些测试数据

      const voteStatus = { 

        alreadyVoted: true, 

        totalVoteCount: 100, 

        optionStatus: [{

          count:25, //第1个选项的投票数量

          vote:false

        },{

          count:35, //第2个选项的投票数量

          vote:false

        },{

          count:10, //第3个选项的投票数量

          vote:true //用户选择了该投票

        },{

          count:30, //第四个选项的投票数量

          vote:false

        }]  

      }

      /* 以上是伪造的测试数据*/

      this.setData({ //将获取的投票更新到data对象中 

        voteStatus

      })

    }else{

      // TODO 真的从服务端获取投票情况

    }

  },

然后修改wxml文件,加入投票结果显示的部分。代码如下:

  <view wx:if="{{voteStatus.alreadyVoted}}" class="option-list">

    <view class="option" wx:for="{{optionList}}" wx:key="index">

      <text>{{item}}</text>

      <text class="vote-count">({{voteStatus.optionStatus[index].count}}/{{voteStatus.totalVoteCount}} 票)</text>

      <text class="vote-picked" wx:if="{{voteStatus.optionStatus[index].vote}}">[已选]</text>

    </view>

  </view>

  <block wx:else>

    <checkbox-group wx:if="{{type === 'multiVote'}}" class="option-list" bindchange="onPickOption">...</checkbox-group>

    <radio-group wx:else class="option-list" bindchange="onPickOption">...</radio-group>

  </block>

...

  <button class="btn" type="primary" disabled="{{isExpired || pickedOption.length === 0}}" bind:tap="onTapVote" wx:if="{{!voteStatus.alreadyVoted}}">确认投票</button>

这里有个特殊标签block,它不是一个组件,不会在页面中做渲染。和wx:if,wx:for属性一起使用,将条件或列表应用到内部的所有组件。当需要 一次性判断多个组件是否条件渲染,使用block。

block学习小例子代码如下:

<block wx:if="{{condition}}">

        <view>View A</view>

        <view>View B</view>

        <view>View C</view>

</block>

最后为vote.wxss加入一些样式美化:

.vote-count{

  color: #ccc;

}

.vote-picked{

  color: #09BB07;

}

预览效果如下:

                                                3-41 

实践的时候顺风顺水,不知道为什么确认投票按钮没实现隐藏,后来发现是参数没加{{}}所以没取到值。又是粗心大意,也许是太累。

期待每一位读者的回音。欢迎打赏,评论,点赞,收藏,关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/219006.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 基于opencv和face_recognition的人脸识别

python 基于opencv和face_recognition的人脸识别 代码如下&#xff1a; 使用一个photos存放你需要识别的照片&#xff0c;注意一个人一张就行 然后通过下面代码注册用户&#xff0c;之后启动程序&#xff0c;就会调用摄像头进行识别了。 AddPhoto(“发哥”, “./photos/fag…

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

面向对象的三大特征

目录 封装&#xff08;Encapsulation&#xff09;&#xff1a; 继承&#xff08;Inheritance&#xff09;&#xff1a; 多态&#xff08;Polymorphism&#xff09;&#xff1a; 封装&#xff08;Encapsulation&#xff09;&#xff1a; 定义&#xff1a; 封装是将对象的状态…

FreeRTOS入门教程(任务通知)

文章目录 前言一、什么是任务通知二、任务通知和队列&#xff0c;信号量的区别三、任务通知的优点和缺点1.优点2.缺点 四、任务状态和通知值五、任务通知相关的函数发出通知取出通知 六、任务通知具体使用1.实现轻量级信号量二进制信号量计数型信号量 2.实现轻量级队列 总结 前…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)二

七、Shell Here String&#xff08;内嵌字符串&#xff0c;嵌入式字符串&#xff09; Here String 是《六、Shell Here Document&#xff08;内嵌文档/立即文档&#xff09;》的一个变种&#xff0c;它的用法如下&#xff1a; command <<< string command 是 Shell 命…

TikTok 将开源“云中和”边缘加速器

“从某种意义上说&#xff0c;我们正在努力破解云的骨干网&#xff0c;以造福于我们&#xff0c;”TikTok产品管理基础设施经理Vikram Siwach指出&#xff0c;他解释了该公司即将开源的“全球服务加速器”的好处&#xff0c;这是一个可编程的边缘平台&#xff0c;可将应用程序需…

单片机学习1——点亮一个LED灯

Keil软件编写程序&#xff1a; 特殊功能寄存器声明&#xff1a; #include<reg52.h>sbit LED P1^0;void main() {LED 0;while(1); } 代码说明&#xff1a; sbit 语句是特殊功能位声明。 生成HEX文件&#xff0c;这个文件是下载到单片机里的文件。Options for Target…

机器学习---贝叶斯网络与朴素贝叶斯

1. 贝叶斯法则 如何判定一个人是好人还是坏人&#xff1f; 当你无法准确的熟悉一个事物的本质时&#xff0c;你可以依靠与事物特定本质相关的事件出现的次数来判断 其本质属性的概率。如果你看到一个人总是做一些好事&#xff0c;那这个人就越可能是一个好人。 数学语言表达…

微机课设--汇编语言在51单片机上写一个四位十进制加法器

代码如下 KEYVAL EQU 30HKEYTM EQU 31HKEYSCAN EQU 32HDAT EQU 33HSCANLED EQU 37HS_DAT EQU 38HD_DAT EQU 39HR_DATL EQU 3AHR_DATH EQU 3BH CALFLAG EQU 3CHFLAG BIT 00HORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#01HMOV TH0,#0D8HMOV TL0,…

win10+ vs2017用cmake编译geos3.5.1

参考教程&#xff1a;使用CMake编译Geos3.5.0_cmake geos-CSDN博客 注意事项&#xff1a; 报错&#xff1a;在使用cmake编译geos-3.5.1的时候&#xff0c;会出现报错&#xff1a; CMake Error at CMakeLists.txt:330 (include): include could not find load file GenerateSou…

makefile项目构建

makefile项目构建 OVERVIEW makefile项目构建1.概念2.make选项3.makefile语法&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;系统与自定变量&#xff08;3&#xff09;常用函数&#xff08;4&#xff09;模式匹配与伪目标 4.makefile编译流程&#xff08;1&#…

【模板】KMP算法笔记

练习链接&#xff1a;【模板】KMP - 洛谷 题目&#xff1a; 输入 ABABABC ABA 输出 1 3 0 0 1 思路&#xff1a; 根据题意&#xff0c;用到的是KMP算法&#xff0c;KMP算法思想是通过一个一个匹配首字母的原理进行整个匹配效果&#xff0c;当某个首字母不匹配的时候&#x…