实现背景

最近学习《vue实战》,第二篇进阶篇有一个练习

刚好最近在研究vue移动端框架vant

两者结合,实现这么个小项目

实现代码

新建 vue单文件 L0529L.vue

  1. <template>
  2. <div class="dom">
  3. <div class="tmnr">{{showtm+1}}. {{timu[showtm]['tmcontent']}}</div>
  4. <component0529
  5. :info="ziInfo"
  6. :showtm="showtm"
  7. @chooseRadio="changeAnswer"
  8. @chooseCheckbox="changeAnswer"
  9. @chooseInput="changeAnswer"
  10. ></component0529>
  11. <div class="buttondom">
  12. <van-button type="primary" v-show="showtm>0" @click="shangtm" :disabled="showtm===0">上一题</van-button>
  13. <van-button
  14. type="primary"
  15. v-show="showtm<timu.length-1"
  16. @click="nexttm"
  17. :disabled="nextdisable"
  18. >下一题</van-button>
  19. <van-button type="warning" @click="chongzhi">重置</van-button>
  20. </div>
  21. </div>
  22. </template>
  23.  
  24. <script>
  25. import component0529 from "./views/component0529";
  26.  
  27. export default {
  28. name: "",
  29. data() {
  30. return {
  31. showtm: 0,
  32. timu: [
  33. {
  34. id: 1,
  35. type: "radio",
  36. tmcontent: "题目内容1-单选",
  37. xx: [
  38. { id: "A", nr: "选项A-单选" },
  39. { id: "B", nr: "选项B-单选" },
  40. { id: "C", nr: "选项C-单选" }
  41. ],
  42. cannext: false,
  43. answer: ""
  44. },
  45. {
  46. id: 2,
  47. type: "checkbox",
  48. tmcontent: "题目内容2-复选",
  49. xx: [
  50. { id: "A", nr: "选项A", ischeck: false },
  51. { id: "B", nr: "选项B", ischeck: false },
  52. { id: "C", nr: "选项C", ischeck: false },
  53. { id: "D", nr: "选项D", ischeck: false }
  54. ],
  55. cannext: false,
  56. answer: []
  57. },
  58. {
  59. id: 3,
  60. type: "input",
  61. tmcontent: "题目内容3-问答",
  62. cannext: false,
  63. answer: ""
  64. }
  65. ]
  66. };
  67. },
  68. computed: {
  69. ziInfo() {
  70. return this.timu[this.showtm];
  71. },
  72. nextdisable() {
  73. var a = false;
  74. if (this.showtm == this.timu.length - 1) a = true;
  75. var t = this.timu[this.showtm]["type"];
  76. switch (t) {
  77. case "radio":
  78. if (this.timu[this.showtm]["answer"] == "") a = true;
  79. break;
  80. case "checkbox":
  81. if (
  82. this.timu[this.showtm]["answer"].length != 2 &&
  83. this.timu[this.showtm]["answer"].length != 3
  84. )
  85. a = true;
  86. break;
  87. case "input":
  88. var c = this.timu[this.showtm]["answer"];
  89. if (c.length < 100) a = true;
  90. break;
  91. }
  92. return a;
  93. }
  94. },
  95. components: {
  96. component0529
  97. },
  98. methods: {
  99. nexttm() {
  100. this.showtm++;
  101. },
  102. shangtm() {
  103. this.showtm--;
  104. },
  105. chongzhi() {
  106. if (this.timu[this.showtm]["type"] == "checkbox") {
  107. this.timu[this.showtm]["answer"].length = 0;
  108. for (var i = 0; i < this.timu[this.showtm]["xx"].length; i++) {
  109. this.timu[this.showtm]["xx"][i]["ischeck"] = false;
  110. }
  111. } else {
  112. this.timu[this.showtm]["answer"] = "";
  113. }
  114. },
  115. changeAnswer(ans) {
  116. this.timu[this.showtm]["answer"] = ans;
  117. }
  118. }
  119. };
  120. </script>
  121.  
  122. <style scoped>
  123. .dom{
  124. padding: 14px;
  125. }
  126. .tmnr{
  127. margin: 10px 0px;
  128. text-align: left;
  129. }
  130. .buttondom {
  131. position: absolute;
  132. bottom: 10px;
  133. text-align: center;
  134. width: 100%;
  135. }
  136. </style>

  引入组件 component0529.vue 代码:

  1. <template>
  2. <ul>
  3. <li v-if="info.type==='checkbox'">
  4. <van-checkbox
  5. v-for="infoa in childInfo.xx"
  6. v-model="infoa.ischeck"
  7. @change="changeCheckbox"
  8. >{{infoa.nr}}</van-checkbox>
  9. </li>
  10. <li v-else-if="info.type==='radio'">
  11. <van-radio-group v-model="childInfo.answer" @change="changeRadio">
  12. <van-radio v-for="infoa in childInfo.xx" :name="infoa.id">{{infoa.nr}}</van-radio>
  13. </van-radio-group>
  14. </li>
  15. <li v-else-if="info.type==='input'">
  16. <van-cell-group>
  17. <van-field
  18. v-model="childInfo.answer"
  19. type="textarea"
  20. placeholder="请输入不少于100字"
  21. rows='1'
  22. autosize
  23. border="true"
  24. />
  25. </van-cell-group>
  26. </li>
  27. </ul>
  28. </template>
  29.  
  30. <script>
  31. export default {
  32. props: ["info", "showtm"],
  33. data() {
  34. return {};
  35. },
  36. computed: {
  37. childInfo() {
  38. var an = this.info["answer"],
  39. type = this.info["type"];
  40.  
  41. if (type == "checkbox") {
  42. for (var i = 0; i < this.info.xx.length; i++) {
  43. var x = this.info.xx[i];
  44. if (an.join(",").indexOf(x.id) > -1) x.ischeck = true;
  45. }
  46. }
  47.  
  48. return this.info;
  49. }
  50. },
  51. methods: {
  52. changeRadio() {
  53. var a = this.childInfo.answer;
  54. this.$emit("chooseRadio", a);
  55. },
  56. changeCheckbox() {
  57. var a = [];
  58. for (var i = 0; i < this.childInfo.xx.length; i++) {
  59. if (this.childInfo.xx[i]["ischeck"]) a.push(this.childInfo.xx[i]["id"]);
  60. }
  61.  
  62. this.$emit("chooseCheckbox", a);
  63. },
  64. changeInput() {
  65. this.$emit("chooseInput", this.childInfo.answer);
  66. }
  67. },
  68. components: {}
  69. };
  70. </script>
  71.  
  72. <style scoped>
  73. ul li .van-radio,
  74. .van-checkbox {
  75. margin: 16px 0px;
  76. }
  77. </style>

  

实现页面展示

 解释逻辑

1.在L0529L.vue 定义好相关问卷题目,设计好题目类型,内容,选项,选择或者输入的答案等

2.定义一个当前题目id==showtm,用这个参数决定当前显示的是哪道题。

3、将题目传递给子组件component0529.vue,在这里面处理显示选项信息或者输入框

4、子组件信息操作选择完成或者输入了相关信息,修改对应父组件中问题的答案

5、刚接触vue,逻辑方面有些冗余啰嗦,以后有更好的实现想法再进行修改

基于vant实现一个问卷调查的更多相关文章

  1. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  2. 基于SpringBoot开发一个Restful服务,实现增删改查功能

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  3. 基于线程开发一个FTP服务器

    一,项目题目:基于线程开发一个FTP服务器 二,项目要求: 基本要求: 1.用户加密认证   2.允许同时多用户登录   3.每个用户有自己的家目录 ,且只能访问自己的家目录   4.对用户进行磁盘配 ...

  4. 基于 Express 搭建一个node项目 - 起步

    一,如何基于 Express 搭建一个node项目 什么是Express 借用官方的介绍,Express是一个基于Node.js平台的极简.灵活的web应用开发框架,它提供了一系列强大的特性,帮助你创 ...

  5. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  6. 基于 OpenResty 实现一个 WS 聊天室

    基于 OpenResty 实现一个 WS 聊天室 WebSocket WebSocket 协议分析 WebSocket 协议解决了浏览器和服务器之间的全双工通信问题.在WebSocket出现之前,浏览 ...

  7. 如何基于Go搭建一个大数据平台

    如何基于Go搭建一个大数据平台 - Go中国 - CSDN博客 https://blog.csdn.net/ra681t58cjxsgckj31/article/details/78333775 01 ...

  8. 基于PHP实现一个简单的在线聊天功能(轮询ajax )

    基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...

  9. 基于 React 实现一个 Transition 过渡动画组件

    过渡动画使 UI 更富有表现力并且易于使用.如何使用 React 快速的实现一个 Transition 过渡动画组件? 基本实现 实现一个基础的 CSS 过渡动画组件,通过切换 CSS 样式实现简单的 ...

随机推荐

  1. Ubuntu caffe 测试matlab接口

    这是17年8月份新增的: make matcaffe error 255解决:在Makefile里面,大约第410行那一句话CXXFLAGS += -MMD -MP下面添加CXXFLAGS += -s ...

  2. Linux使用技巧汇总

    Debian是我日常使用的桌面系统,这里记录了我在使用Debian和其他Linux时所有的问题和解决办法,以及一些其他的心得体会. 向Debian致敬! 找回桌面系统关机按钮 在/etc/polkit ...

  3. 19.tcp_upd

    # socket编程 # 01010 ethernet(你在教室的那个位置)mark ip(教室在哪,主机)子网 tcp,udp(端口)应用程序在哪 # 物理层---->数据链路层------- ...

  4. docker和Dockerfile

    目录: 1.docker为什么会出现? 2.docker的理念 3.容器化技术 4.docker三要素 5.docker安装 6.docker帮助命令 7.Docker阿里云镜像加速器配置. 8.do ...

  5. hdu 1796 How many integers can you find 容斥第一题

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  6. (Java多线程系列一)快速入门

    Java多线程快速入门 1.线程和进程的区别 进程是所有线程的集合,每一个线程是进程的一条执行路径. 2.多线程的应用场景 多线程主要体现在提高程序的效率,比如迅雷多线程下载,多线程分批发送短信等. ...

  7. unittest详解(四) 批量执行用例(discover)

    前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...

  8. [CTS2019]氪金手游

    [CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...

  9. [CSP-S模拟测试]:集合合并(记忆化搜索)

    题目传送门(内部题133) 输入格式 第一行一个正整数$n$. 第二行$n$个正整数$a_i$,表示一开始有$S_i=\{a_i\}$ 输出格式 输出一个非负整数表示最大的收益之和 样例 样例输入: ...

  10. .py与.pyc文件区别

    原来Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候.将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了 ...