4.综合实例

4.1.基于数据驱动的选项卡

4.1.1.需求

  1. 需求说明:
  2. 1. 被选中的选项按钮颜色成橙色
  3. 2. 完成被选中选项下的数据列表渲染
  4. 3. 完成选项切换

4.1.2.代码实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. #tab div {
  8. display: none;
  9. padding: 10px;
  10. border: 1px solid black;
  11. width: 428px;
  12. }
  13. #tab div.active{
  14. display: block;
  15. }
  16. #tab button.active{
  17. background-color: orange;
  18. }
  19. #tab button{
  20. width: 150px;
  21. height: 50px;
  22. }
  23. #tab ul{
  24. padding: 0;
  25. }
  26. #tab li{
  27. list-style: none;
  28. height: 40px;
  29. line-height: 40px;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div id="app">
  35. <div id="tab">
  36. <button @click="changeTab(i)" :class="{active: index==i}" v-for="(item, i) in tabData">{{item.tabTitle}}</button>
  37. <div v-for="(item, j) in tabData" :class="{active: index==j}">
  38. <ul>
  39. <li v-for="listitem in item.list">{{listitem.newsTitle}}</li>
  40. </ul>
  41. </div>
  42. </div>
  43. </div>
  44. <script src="node_modules/vue/dist/vue.js"></script>
  45. <script>
  46. new Vue({
  47. el: '#app',
  48. data:{
  49. tabData:[
  50. {
  51. tabTitle:'财经',
  52. list: [
  53. {id:1, newsTitle: '大数据刷新认知:平均每天都有儿童在遭受性侵!'},
  54. {id:2, newsTitle: '董登新:外资没有能力把中国的保险市场全部吃掉'},
  55. {id:3, newsTitle: '收评:沪指大幅回调跌1.80% 钢铁板块领跌两市'},
  56. {id:4, newsTitle: '党报评个税改革:起征点并非越高越好 需统筹平衡'},
  57. ]
  58. },
  59. {
  60. tabTitle:'股票',
  61. list: [
  62. {id:1, newsTitle: '2.5万股民心凉!200多亿市值没了 长生被基金0估值'},
  63. {id:2, newsTitle: '美年健康回应深交所6大关切:医师执业确有瑕疵'},
  64. {id:3, newsTitle: '详细解读!中央政治局会议透露出这些重大信息!'},
  65. {id:4, newsTitle: '业绩预增近3倍却瞬间跌停!谁撂倒了这只绩优股?'},
  66. ]
  67. },
  68. {
  69. tabTitle:'商业',
  70. list: [
  71. {id:1, newsTitle: 'SOHO中国全面竞价租房 潘石屹感慨房子坍塌敲警钟'},
  72. {id:2, newsTitle: 'iPhone吸金 服务创新高 苹果盈利收入两位数大涨\n'},
  73. {id:3, newsTitle: '《西虹市首富》5天破12亿 开心麻花战略转型?'},
  74. {id:4, newsTitle: 'Twitter股价暴跌超20% 美国社交平台陷流量瓶颈'},
  75. ]
  76. },
  77. ],
  78. index: 0
  79. },
  80. methods: {
  81. changeTab(i){
  82. this.index = i
  83. }
  84. }
  85. })
  86. </script>
  87. </body>
  88. </html>

4.1.2.练习作业

尝试完成下一节课程的需求,请保持自己独立实现,不要先看实现的代码

4.2.后台管理菜单

4.2.1.需求

  1. 需求说明:
  2. 1. 完成菜单列表渲染
  3. 2. 点击相应菜单,展开其子菜单,再次点击,收缩子菜单

4.2.2.相关资源下载地址

静态文件下载地址

4.2.3.代码实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. * {
  8. box-sizing: border-box;
  9. }
  10. body {
  11. margin: 0;
  12. }
  13. ul {
  14. padding: 0;
  15. }
  16. a{
  17. text-decoration: none;
  18. color: hsla(0, 0%, 100%, .65);
  19. }
  20. ul li {
  21. list-style: none;
  22. }
  23. #menu {
  24. width: 200px;
  25. height: 800px;
  26. background-color: #001529;
  27. }
  28. #menu .logo {
  29. height: 64px;
  30. background-color: #002140;
  31. padding-left: 16px;
  32. line-height: 64px;
  33. }
  34. #menu .logo h1 {
  35. font-size: 16px;
  36. color: #fff;
  37. margin: 0 0 0 5px;
  38. }
  39. #menu .logo h1, #menu .logo img {
  40. display: inline-block;
  41. vertical-align: middle;
  42. }
  43. .menu-content {
  44. color: hsla(0, 0%, 100%, .65);
  45. font-size: 14px;
  46. padding: 0;
  47. }
  48. .menu-content .submenu {
  49. padding-left: 16px;
  50. }
  51. .submenu .submenu-title {
  52. padding: 10px 0;
  53. }
  54. .submenu .submenu-list {
  55. padding-left: 16px;
  56. }
  57. .submenu .submenu-list li {
  58. padding: 5px 0;
  59. }
  60. .submenu .submenu-list{
  61. display: none;
  62. }
  63. .submenu .active{
  64. display: block;
  65. color: #fff;
  66. }
  67. </style>
  68. </head>
  69. <body>
  70. <div id="app">
  71. <div id="menu">
  72. <div class="logo">
  73. <a href="http://nodeing.com">
  74. <img src="images/logo.ico" alt="">
  75. <h1>螺钉课堂后台管理</h1>
  76. </a>
  77. </div>
  78. <ul class="menu-content">
  79. <menu-list v-for="item in menuData" :key="item.id" :item="item"></menu-list>
  80. </ul>
  81. </div>
  82. </div>
  83. <script src="node_modules/vue/dist/vue.js"></script>
  84. <script>
  85. Vue.component('menu-list', {
  86. template: ` <li class="submenu" >
  87. <div class="submenu-title" @click="show">{{item.submenu_title}}</div>
  88. <ul :class="[submenulist,{active: isShow}]">
  89. <li v-for="value in item.submenu_lists" :key="value.href"><a :href="value.href">{{value.content}}</a></li>
  90. </ul>
  91. </li>`,
  92. props: ['menuData', 'item'],
  93. data(){
  94. return {
  95. isShow: false,
  96. submenulist: 'submenu-list'
  97. }
  98. },
  99. methods:{
  100. show(){
  101. this.isShow = !this.isShow
  102. }
  103. }
  104. });
  105. new Vue({
  106. el: "#app",
  107. data: {
  108. menuData: [
  109. { id: 1,
  110. submenu_title: '课程管理',
  111. submenu_lists: [
  112. {
  113. content: '课程列表',
  114. href: '/course/list'
  115. },
  116. {
  117. content: '创建课程',
  118. href: '/course/create'
  119. },
  120. {
  121. content: '课程统计',
  122. href: '/course/statistical'
  123. },
  124. ]
  125. },
  126. {
  127. id:2,
  128. submenu_title: '用户管理',
  129. submenu_lists: [
  130. {
  131. content: '用户列表',
  132. href: '/user/list'
  133. },
  134. {
  135. content: '增加用户',
  136. href: '/user/add'
  137. },
  138. {
  139. content: '在线用户',
  140. href: '/user/online'
  141. },
  142. {
  143. content: '登录日志',
  144. href: '/user/loginlog'
  145. },
  146. {
  147. content: '批量导入',
  148. href: '/user/import'
  149. },
  150. ]
  151. },
  152. {
  153. id: 3,
  154. submenu_title: '会员管理',
  155. submenu_lists: [
  156. {
  157. content: '全部会员',
  158. href: '/vip/all'
  159. },
  160. {
  161. content: '添加会员',
  162. href: '/vip/add'
  163. },
  164. {
  165. content: '会员等级',
  166. href: '/vip/level'
  167. },
  168. {
  169. content: '即将到期会员',
  170. href: '/vip/willexpire'
  171. },
  172. {
  173. content: '过期会员',
  174. href: '/vip/expired'
  175. },
  176. ]
  177. },
  178. {
  179. id:4,
  180. submenu_title: '系统设置',
  181. submenu_lists: [
  182. {
  183. content: '网站基础信息',
  184. href: '/system/basis'
  185. },
  186. {
  187. content: '主题设置',
  188. href: '/system/theme'
  189. },
  190. {
  191. content: '导航设置',
  192. href: '/system/nav'
  193. },
  194. {
  195. content: '友情链接',
  196. href: '/system/links'
  197. },
  198. {
  199. content: '财务设置',
  200. href: '/system/Finance'
  201. },
  202. ]
  203. }
  204. ]
  205. }
  206. })
  207. </script>
  208. </body>
  209. </html>

4.3.购物车

4.3.1.需求

  1. 需求说明:
  2. 1. 循环渲染出所有商品
  3. 2. 商品数量加减后,统计单个商品总价
  4. 3. 点击每个商品的删除按钮可以删除当前商品
  5. 4. 统计商品数量,统计选中商品数量
  6. 5. 统计选中商品总价
  7. 6. 删除选中商品
  8. 7. 实现全选功能

4.3.2.实现代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. body {
  8. background-color: #F5F5F5;
  9. }
  10. #shoppingcart {
  11. width: 960px;
  12. margin: 50px auto;
  13. }
  14. #shoppingcart button {
  15. padding: 10px 20px;
  16. font-size: 16px;
  17. border-radius: 5px;
  18. }
  19. #shoppingcart button.danger {
  20. background-color: red;
  21. padding: 8px;
  22. border: none;
  23. color: white;
  24. }
  25. #shoppingcart .ipt {
  26. width: 60px;
  27. height: 36px;
  28. border: 1px solid #ccc;
  29. border-radius: 5px;
  30. padding-left: 20px;
  31. }
  32. #shoppingcart table {
  33. width: 100%;
  34. background-color: #fff;
  35. }
  36. #shoppingcart table td {
  37. padding: 10px 0;
  38. text-align: center;
  39. }
  40. .footer {
  41. height: 70px;
  42. background-color: #fff;
  43. margin-top: 30px;
  44. line-height: 70px;
  45. }
  46. .footer-left {
  47. float: left;
  48. padding-left: 24px;
  49. }
  50. .footer-left a, .footer-left span {
  51. margin-left: 10px;
  52. }
  53. .footer-right {
  54. float: right;
  55. padding-right: 24px;
  56. }
  57. .footer-right button, .footer-right div {
  58. display: inline-block;
  59. }
  60. .footer-right button {
  61. background-color: #00c3f5;
  62. padding: 8px 16px;
  63. border-radius: 5px;
  64. color: #fff;
  65. }
  66. .footer-right span {
  67. font-weight: bold;
  68. font-size: 16px;
  69. color: red;
  70. margin-right: 20px;
  71. }
  72. </style>
  73. </head>
  74. <body>
  75. <div id="app">
  76. <div id="shoppingcart">
  77. <table>
  78. <tr>
  79. <td><input type="checkbox" v-model="ischeckedAll">全选</td>
  80. <td>商品</td>
  81. <td>单价(元)</td>
  82. <td>数量</td>
  83. <td>小记(元)</td>
  84. <td>操作</td>
  85. </tr>
  86. <tr v-for="item in goods" :key="item.id">
  87. <td><input type="checkbox" v-model="item.checked"></td>
  88. <td>{{item.goods_name}}</td>
  89. <td>{{item.goods_price}}</td>
  90. <td>
  91. <button @click="decrease(item.id)">-</button>
  92. <input type="text" v-model="item.goods_num" class="ipt">
  93. <button @click="increase(item.id)">+</button>
  94. </td>
  95. <td>{{item.goods_price * item.goods_num}}</td>
  96. <td>
  97. <button @click="delete_goods(item.id)" class="danger">删除</button>
  98. </td>
  99. </tr>
  100. </table>
  101. <div class="footer">
  102. <div class="footer-left">
  103. <input type="checkbox" v-model="ischeckedAll">
  104. <span>全选</span>
  105. <a @click="delete_checked">删除选中的商品</a>
  106. <span>共{{goods.length}}件商品,已选择{{checkedLength}}件</span>
  107. {{checkedId}}
  108. </div>
  109. <div class="footer-right">
  110. <div>合计(不含运费): <span>¥{{total_price}}元</span></div>
  111. <button>去结算</button>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <script src="node_modules/vue/dist/vue.js"></script>
  117. <script>
  118. let goods = [
  119. {
  120. id: 1,
  121. goods_name: '魅族手环',
  122. goods_price: 169,
  123. goods_num: 1,
  124. checked: true
  125. },
  126. {
  127. id: 2,
  128. goods_name: '魅族耳机',
  129. goods_price: 163,
  130. goods_num: 1,
  131. checked: true
  132. },
  133. {
  134. id: 3,
  135. goods_name: '小米汽车',
  136. goods_price: 1890,
  137. goods_num: 1,
  138. checked: false
  139. },
  140. {
  141. id: 4,
  142. goods_name: '坚果pro2',
  143. goods_price: 1699,
  144. goods_num: 1,
  145. checked: true
  146. }
  147. ]
  148. new Vue({
  149. el: '#app',
  150. data: {
  151. goods: goods
  152. },
  153. methods: {
  154. increase(id) {
  155. for (let item of this.goods.values()) {
  156. if (item.id == id) {
  157. item.goods_num++
  158. }
  159. }
  160. },
  161. decrease(id) {
  162. for (let item of this.goods.values()) {
  163. if (item.id == id && item.goods_num > 1) {
  164. item.goods_num--
  165. }
  166. }
  167. },
  168. delete_goods(id) {
  169. this.goods = this.goods.filter((item) => {
  170. //满足条件的保留 不满足条件的删除
  171. return item.id !== id
  172. })
  173. },
  174. delete_checked() {
  175. this.goods = this.goods.filter((item) => {
  176. return !item.checked
  177. })
  178. }
  179. },
  180. computed: {
  181. total_price() {
  182. let result = 0
  183. for (let item of this.goods.values()) {
  184. if (item.checked) {
  185. result += item.goods_num * item.goods_price
  186. }
  187. }
  188. return result
  189. },
  190. ischeckedAll: {
  191. get() {
  192. return this.goods.every((item) => {
  193. return item.checked
  194. })
  195. },
  196. set(newValue){
  197. this.goods.forEach((item)=>{
  198. item.checked = newValue
  199. })
  200. }
  201. },
  202. checkedLength() {
  203. return this.goods.filter((item) => {
  204. return item.checked
  205. }).length
  206. }
  207. }
  208. })
  209. </script>
  210. </body>
  211. </html>

螺钉课堂视频课程地址:http://edu.nodeing.com

vue基础入门(4)的更多相关文章

  1. vue基础入门(2.1)

    2.vue基础用法 2.1.事件处理 2.1.1.监听事件 使用v-on:事件名称 = '事件处理函数'的形式来监听事件,事件处理函数要写在methods后面的对象中 <!DOCTYPE htm ...

  2. vue基础入门

    Hello World   <body> <!-- 在angularJS中用ng-model --> <!-- {{mseeage?message:11}}支持三元表达式 ...

  3. vue基础入门(3)

    3.组件基础 3.1.什么是组件? 3.1.1.理解组件 前端组件化开发是目前非常流行的方式,什么是前端组件化开发呢?就是将页面的某一部分独立出来,将这一部分的数据.视图.以及一些控制逻辑封装到一个组 ...

  4. vue基础入门(2.3)

    2.3.样式绑定 2.3.1.绑定class样式 1.绑定单个class <!DOCTYPE html> <html lang="en"> <head ...

  5. vue基础入门(2.2)

    2.2.基础指令 2.2.1.什么是指令 指令 (Directives) 是带有 v- 前缀的特殊特性,指令特性的值预期是单个 JavaScript 表达式,指令的职责是,当表达式的值改变时,将其产生 ...

  6. Vue学习笔记-Vue基础入门

    此篇文章是本人在学习Vue是做的部分笔记的一个整理,内容不是很全面,希望能对阅读文章的同学有点帮助. 什么是Vue? Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式 ...

  7. Vue基础入门笔记

    不是面向DOM进行编程,而是面向数据去编程.当数据发生改变,页面就会随着改变. 属性绑定(v-bind)和双向数据绑定(v-model) 模板指令(v-bind:)后面跟的内容不再是字符串而是: js ...

  8. vue基础入门(1)

    1.vue初体验 1.1.vue简介 1.1.1.vue是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,什么叫做渐进式呢?通俗的讲就是一层一层的,一步一 ...

  9. vue 基础入门(一)

    app-1 :声明式渲染 app-2 :绑定元素特性 v-bind 特性被称为指令.指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性. app-3 app-4 :条件与循环 app-5 ,ap ...

随机推荐

  1. Rocket - diplomacy - IdRange

    https://mp.weixin.qq.com/s/qqL2XWqAhVcnGSxs6kxhLg   介绍IdRange的实现.   ​​   1. 基本定义   A non-empty half- ...

  2. F5忘记密码修改教程

    !!!首先查看系统版本,13版本和14版本修改密码方式不一致 首先介绍13版本修改密码 注:12版本也适用,11版本未测试,应该也可以,有问题欢迎留言) 1. 将终端连接到BIG-IP串行控制台端口. ...

  3. Java实现 LeetCode 795 区间子数组个数 (暴力分析)

    795. 区间子数组个数 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = ...

  4. Java实现 LeetCode 526 优美的排列(DFS)

    526. 优美的排列 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这 ...

  5. Java实现 LeetCode 508 出现次数最多的子树元素和

    508. 出现次数最多的子树元素和 给出二叉树的根,找出出现次数最多的子树元素和.一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身).然后求出出现次数最多的子树元素和. ...

  6. Java实现 蓝桥杯 算法训练 数据交换

    试题 算法训练 数据交换 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 编写一个程序,输入两个整数,分别存放在变量x和y当中,然后使用自己定义的函数swap来交换这两个变量的值. ...

  7. Linux 源码包安装过程

    安装准备 安装gcc编译器 下载源码包 源代码保存位置:/usr/local/src/ 软件安装位置:/usr/local/ 解压缩下载的源码包 进入解压缩目录 软件配置与检查:./configure ...

  8. TZOJ 复习时间

    描述 为了能过个好年,xhd开始复习了,于是每天晚上背着书往教室跑.为了追求更高的效率,xhd要根据难度值来选择合适的课程进行复习,复习后一门课的效率为前一门课之间的难度差的平方,而复习第一门课的效率 ...

  9. SpringSecurity(2)---记住我功能实现

    SpringSecurity(2)---记住我功能实现 上一篇博客实现了认证+授权的基本功能,这里在这个基础上,添加一个 记住我的功能. 上一篇博客地址:SpringSecurity(1)---认证+ ...

  10. 使用Aspose.word (Java) 填充word文档数据(包含图片填充)

    Aspose填充word数据 本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考. 有问题欢迎 call 微信:905369866,小弟尽力而为..毕竟这玩意没吃透. 目录 A ...