Vuejs2.0构建一个彩票查询WebAPP(2)

一,Vuex的使用

1 import Vue from ‘vue‘
2 import Vuex from ‘vuex‘
3 import MsgModules from ‘./MsgModules‘
4 Vue.use(Vuex)
5 export default new Vuex.Store({
6   modules: {
7     msg: MsgModules
8   }
9 })
 1 export default{
 2   state: {
 3     CheckedMenu: ‘‘, //菜单选中变量
 4     CheckedLottoryHistory: [] //彩票历史变量
 5   },
 6   mutations: {
 7     setCheckedMenu (state, index) {
 8       state.CheckedMenu = index
 9     },
10     setHistory (state, arr) {
11       state.CheckedLottoryHistory = arr
12     }
13   },
14   getters: {
15   },
16   actions: {
17   }
18 }

state中声明各种状态变量,使用方法this.$store.state.msg.xx

mutations中对state中状态做同步修改this.$store.commit("xx",obj),只能有一个obj参数

getters中为获取状态变量的方法this.$store.getters.xx

actions中可以支持异步操作状态变量this.$store.dispatch("xx",obj)

vuex.store使用modules可以统筹多个状态管理文件,使业务分离,便于维护

二,Vue核心,组件的编写

  1 <template>
  2   <div>
  3     <div class="nav">
  4       <div class="channel">
  5         <ul>
  6           <li v-for="(menu,index) in menulist" :key="index">
  7             <LinkBtn :title="menu.DESCR" :index="index"></LinkBtn>
  8           </li>
  9         </ul>
 10       </div>
 11     </div>
 12     <ul class="newsContent" v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
 13       <li class="section" v-for="(item, index) in types" :key="index">
 14         <LastIssueItem :code="item" :name="categorys.CAI[item].DESCR"></LastIssueItem>
 15       </li>
 16       </ul>
 17   </div>
 18 </template>
 19
 20 <script>
 21 import { Indicator } from ‘mint-ui‘
 22 import LinkBtn from ‘@/components/LinkBtn‘
 23 import LastIssueItem from ‘@/components/LastIssueItem‘
 24 export default {
 25   data () {
 26     return {
 27       busy: false,
 28       categorys: {},
 29       menulist: [],
 30       types: []
 31     }
 32   },
 33   mounted () {
 34     this.$myaxios.get(‘http://misc.opencai.net/consts/lotts.json‘) // 使用自定义的axios来做ajax操作
 35       .then((response) => {
 36         if (response.data) {
 37           this.categorys = response.data
 38           this.menulist = response.data.GRP.C // 菜单数据
 39           let firstKey = Object.keys(this.menulist)[0] // 第一个菜单的关键字
 40           this.$store.commit(‘setCheckedMenu‘, firstKey) // 设置第一个菜单被选中,状态提交至vuex的状态管理器中
 41           this.types = this.menulist[firstKey].CODES // 第一个菜单下的各类彩票编码集合
 42         }
 43       })
 44   },
 45   watch: {
 46     CheckedMenu: { /* 监听菜单是否切换 */
 47       handler (newValue, oldValue) {
 48         let self = this
 49         self.busy = true
 50         setTimeout(() => {
 51           if (self && !self._isDestroyed) {
 52             // 菜单发生切换之后,从集合中获取新的大类下的彩票类别10条
 53             self.types = self.menulist[newValue].CODES.slice(0, 10)
 54             self.busy = false
 55           }
 56         }, 500)
 57       },
 58       deep: true
 59     },
 60     busy (newValue, oldValue) {
 61       if (newValue) {
 62         Indicator.open({text: ‘加载中...‘, spinnerType: ‘fading-circle‘})
 63       } else {
 64         Indicator.close()
 65       }
 66     }
 67   },
 68   components: {
 69     LinkBtn,
 70     LastIssueItem
 71   },
 72   computed: {
 73     CheckedMenu () {
 74       scrollTo(0, 0)
 75       // 获取Vuex状态管理器中的选中菜单,如果状态管理器中菜单值发生改变,此处的计算属性也会发生改变
 76       return this.$store.state.msg.CheckedMenu
 77     }
 78   },
 79   methods: {
 80     loadMore () {
 81       let i = this.types.length
 82       if (i > 0) {
 83         // 加载更多时,从某大类下获取所有彩票类型编码
 84         let childs = this.menulist[this.CheckedMenu].CODES
 85         // 如果大类下的彩票编码数量大于当前彩票编码数量则可以加载更多
 86         if (childs.length > i) {
 87           this.busy = true
 88           // 从大类下的彩票编码集合中截取更多10条加入当前彩票编码集合
 89           let array = childs.slice(i, i + 10)
 90           for (var j = 0; j < array.length; j++) {
 91             this.types.push(array[j])
 92           }
 93           this.busy = false
 94         }
 95       }
 96     }
 97   }
 98 }
 99 </script>
100
101 <style lang="css" scoped>
102 .nav {
103   width: 100%;
104   height: .96rem;
105   background-color: #f4f5f6;
106   display: flex;
107   position: fixed;
108   z-index: 99;
109 }
110 .channel {
111   display: inline-block;
112   flex: 1;
113   white-space: nowrap;
114   display: flex;
115   align-items: center;
116   overflow-x: scroll;
117   font-size: .30rem;
118   color: #4b4949;
119 }
120 .channel::-webkit-scrollbar {
121   height: 0;
122 }
123 .channel ul li {
124   display: inline-block;
125 }
126 .newsContent {
127   padding-top: 0.96rem;
128 }
129 .section {
130   width: 100%;
131   height: 2.24rem;
132   border-bottom:1px solid #ccc;
133 }
134 </style>

可以看到组件中引入了两个自定义的组件,横向大类菜单和纵向各类彩票最新一期的信息。使用了Mint-UI中的Infinite scroll来做无限滚动加载,Indicator来做loading。唯一的操作“菜单切换”使用vuex来做状态管理。最终效果如下图

列表的子项组件,当传入某彩票编码时,获取彩票的数据

  1 <template lang="html">
  2   <div class="news" @click="toDetail">
  3     <div class="p">
  4         <span class="s1">{{name}}</span>
  5         <span class="s2">第{{Detail&&Detail.expect||""}}期</span>
  6         <span class="s3">
  7           <span style=" color:grey;">开奖:</span>
  8           <span v-if="Detail.hasOwnProperty(‘opentime‘)&&Detail.opentime">
  9             {{(new Date(Detail.opentime)).toLocaleDateString()}}
 10           </span>
 11         </span>
 12     </div>
 13     <div class="p">
 14         <span v-for="(value, index) in RedBall" class="ball1" :key="‘Red‘+index">
 15           <span class="word">
 16             {{value}}
 17           </span>
 18         </span>
 19         <span v-for="(value, index) in BlueBall" class="ball2" :key="‘Blue‘+index">
 20          <span class="word">
 21             {{value}}
 22           </span>
 23         </span>
 24     </div>
 25   </div>
 26 </template>
 27
 28 <script>
 29 export default {
 30   data () {
 31     return {
 32       List: [],
 33       Detail: {},
 34       RedBall: [],
 35       BlueBall: []
 36     }
 37   },
 38   props: [‘code‘, ‘name‘],
 39   mounted () {
 40     // 此处根据传过来的彩票代码获取彩票最新的数据
 41     this.$myaxios.get(‘/api/‘ + this.code + ‘-20.json‘)
 42       .then((response) => {
 43         if (response.data.rows > 0) {
 44           // 某类彩票的最近20条数据
 45           this.List = response.data.data
 46           // 某类彩票的最近一条数据
 47           this.Detail = response.data.data[0]
 48           // 彩票数据的数字码
 49           if (this.Detail.hasOwnProperty(‘opencode‘) && this.Detail.opencode) {
 50             let arr = this.Detail.opencode.split(‘+‘)
 51             if (arr.length > 0) {
 52               if (arr[0]) {
 53                 this.RedBall = arr[0].split(‘,‘)
 54               }
 55               if (arr[1]) {
 56                 this.BlueBall = arr[1].split(‘,‘)
 57               }
 58             } else {
 59               this.RedBall = this.Detail.opencode.split(‘,‘)
 60             }
 61           }
 62         }
 63       })
 64   },
 65   methods: {
 66     toDetail () {
 67       // 点击时,将某彩票的历史数据传递给Vuex的状态管理器。然后在历史页中直接获取这些历史数据并呈现
 68       this.$store.commit(‘setHistory‘, this.List)
 69       this.$router.push({path: ‘/history‘, query: { name: this.name }})
 70     }
 71   },
 72   computed: {
 73   }
 74 }
 75 </script>
 76
 77 <style lang="css" scoped>
 78 .news {
 79   height: 2.24rem;
 80   box-sizing: border-box;
 81   width: 100%;
 82   padding: 0.01rem;
 83 }
 84 .p{
 85   height: 1.12rem;
 86   line-height: 1.12rem;
 87   padding-left: .1rem;
 88   padding-right: .1rem;
 89   vertical-align:middle;
 90   width: 100%;
 91   display:inline-block;
 92 }
 93 .s1{
 94   color:blue;
 95   width: 30%;
 96   padding:2px;
 97 }
 98 .s2{
 99   padding-left:2px;
100   padding-right: 2px;
101 }
102 .ball1{
103   border-radius: 50%;
104   height: 20px;
105   width: 20px;
106   display: inline-block;
107   background: #f54646;
108   vertical-align: top;
109 }
110 .ball2{
111   border-radius: 50%;
112   height: 20px;
113   width: 20px;
114   display: inline-block;
115   background: #39f;
116   vertical-align: top;
117 }
118 .word{
119 display: block;
120 color: #FFFFFF;
121 height: 20px;
122 line-height: 20px;
123 text-align:center;
124 }
125 </style>

三,路由设置

 1 import Vue from ‘vue‘
 2 import Router from ‘vue-router‘
 3 import index from ‘@/pages/index‘
 4 import history from ‘@/pages/history‘
 5
 6 Vue.use(Router)
 7
 8 export default new Router({
 9   mode: ‘history‘,
10   routes: [
11     {
12       path: ‘/‘,
13       component: index
14     },
15     {
16       path: ‘/history‘,
17       component: history
18     }
19   ],
20   scrollBehavior (to, from, savedPosition) {
21     return { x: 0, y: 0 }
22   }
23 })

四,工程的入口main.js,引入各种包和声明全局变量

 1 import Vue from ‘vue‘
 2 import App from ‘./App‘
 3 import axios from ‘axios‘
 4 import router from ‘./router‘
 5 import store from ‘./store/‘
 6 import MintUI from ‘mint-ui‘
 7 import ‘mint-ui/lib/style.css‘
 8 Vue.use(MintUI)
 9
10 Vue.config.productionTip = false
11 axios.default.timeout = 5000
12 Vue.prototype.$myaxios = axios
13
14 /* eslint-disable no-new */
15 let vm = new Vue({
16   el: ‘#app‘,
17   router,
18   store,
19   template: ‘<App/>‘,
20   components: { App }
21 })
22 console.log(vm)

Vuejs2.0构建一个彩票查询WebAPP(1)

Vuejs2.0构建一个彩票查询WebAPP(3)

原文地址:https://www.cnblogs.com/shi2310/p/8618483.html

时间: 2024-10-06 22:42:10

Vuejs2.0构建一个彩票查询WebAPP(2)的相关文章

Vuejs2.0构建一个彩票查询WebAPP(1)

说明:本人也是刚接触VUE.js,作为一个学习笔记,旨在与初学者共同学习.其中编程语法错误或者写作水平刺眼,还望轻喷. 使用工具:Visual Studio Code.技术栈为vue2+vuex+axios+vue-router+mintUI 备注:Vue.js开发环境的搭建,参见window下搭建Vue.Js开发环境 一,构建项目脚手架 在我的工作区下输入vue init webpack Lottery,会自动构建项目脚手架 进入项目Lottery中输入cnpm install进行库安装 此外

react构建淘票票webapp,及react与vue的简单比较。

前言 前段时间使用vue2.0构建了淘票票页面,并写了一篇相关文章vue2.0构建淘票票webapp,得到了很多童鞋的支持,因此这些天又使用react重构了下这个项目,目的无他,只为了学习和共同进步! 项目技术栈 前端技术栈:react + react-router + redux + ant-design-mobile 后台技术栈:nodejs + express 项目地址:https://github.com/canfoo/react-taopiaopiao 同样地,先晒一张效果图,想要看更

java+Maven+SpringBoot构建一个webapp项目

一.先创建一个Maven项目 1.打开eclipse,新建一个项目 File->new->Maven Prooject(若Maven Project不存在,可以在other中寻找) 2.这里的界面默认,点击next,出现如下界面: 3.选择我们需要构建的webapp,然后点击next, 4.输入必要的信息,点击finish,完成了一个webapp项目的基础创建. 项目结构如图所示 发现有红叉, 右键点击SpringBootProject->Build Path->Configure

Cocos2d-x 3.0 - Eclipse上构建一个Android项目

Cocos2d-x 3.0 - Eclipse上构建一个Android项目 2014年4月30日 4月末 本篇继续介绍Cocos2d-x 3.0的一些基础内容,前面一篇博客介绍了如何在Visual Studio 2012上编译我们的Cocos2d-x项目,也成功把Helloworld运行起来了.跟以往的版本是类似的,只不过创建空项目的时候命令变成了cocos.本篇博客带给大家的是,如何在Eclipse运行起我们的Cocos2d-x项目,如果童鞋们有看我写的Cocos2d-x 2.2.3版本的交叉

使用vuejs2.0和element-ui 搭建的一个后台管理界面

说明: 这是一个用vuejs2.0和element-ui搭建的后台管理界面. 相关技术: vuejs2.0:渐进式JavaScript框架,易用.灵活.高效,似乎任何规模的应用都适用. element-ui:基于vuejs2.0的ui组件库. vue-router:一般单页面应用spa都要用到的前端路由. axios: 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用. mock.js: 生成随机数据,拦截 Ajax 请求,让前端攻城师独立于后端进行开发.

微信公众平台消息接口开发 彩票查询

一.获取数据 目前很多网站都提供彩票信息查询,所以取得彩票数据是件很容易的事.方倍工作室开发出彩票查询接口 API,目前已开通'双色球','3D','七乐彩','大乐透','七星彩','排列3','排列5','胜负彩','六场半全场','四场进球' 10种数据,每日同步更新 使用方式为直接在URL中提交彩票名称即可,名称需要先做urlencode调用url方法:以下是调用双色球方法 http://api2.sinaapp.com/search/lottery/?appkey=0020130430

基于rsyslog+mysql+loganalyzer构建一个小而美的日志服务器

前言: 每当我们遇到问题抓耳挠腮,一脸懵那啥的时候,也许看一下日志就瞬间豁然开朗,所以,一个易用的日志服务器还是很重要的.我们先不介绍elk,那个牛逼吊炸天的日志分析系统.今天我们先来构建一个小的日志服务器.elk我们以后再说~ 正文: 当我们配置完一个服务,启动报错时,那感觉就像吃了啥一样,别提多难受,除非服务程序本身有检测配置文件的程序,不然我们就得依赖linux自己的集中日志服务器rsyslog了.不过,有时候也许我们想搜索一下某条日志,或者向用可视化的界面进行统计分析.此时我们可以把日志

从零构建一个简单的 Python Web框架

为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何工作的很感兴趣,因为你想要成为一位更好的 web 开发者. 接下来的笔墨将着重于最后一点.这篇文章旨在通过对设计和实现过程一步一步的阐述告诉读者,我在完成一个小型的服务器和框架之后学到了什么.你可以在这个代码仓库中找到这个项目的完整代码. 我希望这篇文章可以鼓励更多的人来尝试,因为这确实很有趣.它让

为您的Web项目构建一个简单的JSON控制器

摘要:无论您的项目使用的是哪种数据库后端,JavaScript Object Notation (JSON) 控制器都能简化您的开发工作.本文将带领您建立一个能够增强您的下一个开发项目的非常基础的 JSON 控制器. 您的下一个 PHP/MySQL 项目可能与您最近完成的十几个项目类似:建立一个 MySQL 数据库,创建包含 HTML 的 PHP 视图,根据需要添加 JavaScript 代码和 CSS 文件,连接到数据库,从数据库提取内容来填充视图,等等.如果您熟悉 web 开发,您一定知道分