在vue中实现picker样式_基于Vue实现timepicker

主要用到的还是Vue的基本知识而已,不过要想到的细节很多。

先放效果,点击上框,显示timepicker。而且可以根据点击的是时还是分来改变圆盘的数字。

这里我用了两个组件,和,这里的时和分的数值我挂在了根实例中,因为两个组件都需要这两个值,所以想了想我决定还是挂在根实例,通过动态绑定到组件中。HTML见在线demo。

根组件

var app = new Vue({

el: "#app",

data: {

minutes: 15,

hour: 8,

showTimePicker: false,

current: 0 //0为时、1为分

},

created: function(){

this.$on("closeTimePicker",function() { //监听关闭time-picker

this.showTimePicker = false;

}),

this.$on("openTimePicker",function() {

this.showTimePicker = true;

}),

this.$on("getTime",function(h,m) { //获取time-picker返回的点击后的数值,然后动态改变

this.minutes = m;

this.hour = h;

})

}

})

组件

点击时、分的时候,要“通知”根实例点击的是什么,下面的时钟才能显示相应的数字。改变父组件的属性,有两种办法,一是直接修改父组件属性;二是通过自定义事件。

Vue.component('time-box',{

template:'\

\

{{hour}}\

: \

{{minutes}}\

',

props: ['hour','minutes'],

methods: {

openTime: function() {

app.$emit("openTimePicker");

},

changeCurrent: function(type) {

if(type == 'h' ){

app.current = 0;

} else {

app.current = 1;

}

}

}

});

组件

这里最需要注意的就是单向数据流。时分是通过props传进来的,刚开始我直接操作this.hour,然后控制台警告。看到警告才想起看过的知识,这样很容易误改父组件的信息。所以啊,有些东西得实践才行,不能只看不敲。这里我定义一个局部 data 属性,并将 prop 的初始值作为局部数据的初始值。知识点:https://cn.vuejs.org/v2/guide/components.html#单向数据流

props: ['h','m','mode'],

data: function() {

return {

current: this.mode,

hour: this.h,

minutes: this.m

}

},

正常情况下,如果时分不够两位数就要自动添加0,实现很简单的。刚开始直接判断是否小于10就添加。但是,“08”是小于10的,所以又自动添加0了。但是我觉得这里写得不好,还有改进的空间的。

//时分保证是两位数

fixHour: function() {

return (this.hour < 10 && this.hour.toString().indexOf(0) !== 0) ? "0" + this.hour : this.hour

}

fixMinutes: function() {

return (this.minutes < 10 && this.minutes.toString().indexOf(0) !== 0) ? "0" + this.minutes : this.minutes

},

再说说template里面的事吧。点击timepicker里面的时分改变组件的的current属性和透明度。这里显示数据就需要用到fixHour和fixMinutes了。

{{fixHour(hour)}}

:

{{fixMinutes(minutes)}}

圆盘里的内容就靠v-for了。先定义好12个位置,然后遍历每个位置。里面的针就通过CSS3的旋转啦。一共360度,12个格,一小时60分钟,这么简单的数字知识就不继续说下去了,下面的乘法我相信各位是看得懂的。这里注意的是60,我们钟表没有60只有0啊,所以 ((5 * i) % 60 || “00”)。这里写得很有技巧。60%60是0。然后是||和&&的问题了(推荐两本书《你不知道的JavaScript》上中卷,内容跟《高级程序设计JS》也不怎么重复,值得看)。0强转为false,然后||就返回第二个操作数的值。

{{current === 0 ? i : ((5 * i) % 60 || "00")}}\

methods: {

//分时针的样式

selectorRotateAngle: function(i) {

if(this.current === 0) {

return {

transform: 'rotateZ('+(this.hour * 30)+'deg)'

}

} else {

return {

transform: 'rotateZ('+(this.minutes * 6)+'deg)'

}

}

},

//12格样式

getHourStyle: function(i) {

var hasSelected = (this.current === 0 && this.hour % 12 === i)

|| (this.current === 1 && this.minutes % 60 == (i * 5)); //判断到底是哪个数值被选中

var styleObj = {

transform: 'translate(' + positions[i][0] + "px, " + positions[i][1] + "px)",

background: hasSelected ? 'rgb(0, 188, 212)' : 'rgba(255, 255, 255, 0)',

color: !hasSelected ? '#2c3e50' : '#FFF'

}

return styleObj;

}

}

最后就是把选好的数值传回给父组件啦。

//关闭timepicker

closePicker: function() {

app.$emit('closeTimePicker');

},

//获取时间

getTime: function() {

app.$emit('getTime',this.fixHour(this.hour),this.fixMinutes(this.minutes));

app.$emit('closeTimePicker');

}

v-if和v-show

v-show只是改变每次的display,而v-if如果为true才渲染到页面,所以每次隐藏显示都重新渲染一遍。我觉得。。。如果实际中,经常要开开关关的就用v-show就好了,但是用来v-show我发现不能根据选中的是时还是分来展现数值,很奇怪,v-if就可以。刚开始觉得是初始化问题,但是,既然hour和minute能根据props传下来再data转化,为啥mode就不行呢?没想明白。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

相关文章

玩玩

金字塔一样输出字母&#xff0c;如 输入 d a a b a a b c b a a b c d c b a 代码实现 #include<stdio.h> int main(void) { char z; int j,t,k; scanf("%c",&z); t0; if(z>a&&z<z) { for(int i0;i<z-a;i) { for(kz-a-t;k…

总结界面框架_UI_Adapter

本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728 -- 277627117 下面是常用到的ui Demo安卓三级筛选菜单listview&#xff08;非常经典&#xff09; http://download.csdn.net/detail/zillvip/9138975android地图应用&#xff08;路径规划&#xff0c;地理编码&…

AD20学习笔记2---原理图绘制及编译检查

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

git如何设置master分支的权限_Git 从master 分支拉新分支开发

一、 切换到被copy的分支(master)&#xff0c;并且从远端拉取最新版本$git checkout master$git pull二、从当前分支拉copy开发分支$git checkout -b devSwitched to a new branch dev三、 把新建的分支push到远端$git push origin dev四、拉取远端分支$git pullThere is no tr…

Yii框架 phpexcel 导出

一、说明 之前使用的是PHPExcelXML包实现的数据导出&#xff0c;由于导出的文件扩展名为“.xls” 在office2007上带不开&#xff0c;报如下图错误&#xff08;用 WPS都能打开&#xff09; 因此&#xff0c;此次采用了 PHPExcel包 不仅支持生成Excel&#xff08;.xls&#xff09…

慎用stl中的erase的返回值

在windows下的VC编译或者Mac OX的XCode下编译也许不会出问题。但是在linux下可能就会挂掉。 比如我上一篇里的poj4093出现了编译错误 2007120.8890/Main.cc: In function ‘int main()’: 2007120.8890/Main.cc:50:44: error: no match for ‘operator’ in ‘itr1 a.std::set…

AD20学习笔记3---PCB封装库的创建方法及现有封装调用

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

php的两种复合数据类型是什么意思_2.4PHP复合数据类型:数组和对象

Posted by 撒得一地 on 2015年9月29日 in PHP入门教程国外稳定加速器推荐vypr |NordPHP中复合数据类型包括两种&#xff0c;即数组和对象。array(数组)&#xff1a;一组数据的集合。object(对象)&#xff1a;对象是类型的实例&#xff0c;使用new命令来创建。数组(array)数组是…

Python守护进程和脚本单例运行

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 守护进程最重要的特性是后台运行&#xff1b;它必须与其运行前的环境隔离开来&#xff0c;这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等&#xff1b;它可以在系统启动…

分析access.log

cat access.log | awk {print $4,$1,$9} | awk -F/ {print $3}| awk -F: {print $2 ":" $3,$4} | awk {print $1,$3,$4} | uniq -c | sort -n转载于:https://www.cnblogs.com/olderblue/p/4778339.html

AD20学习笔记4---网表导入及模块化布局设计

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

Paoding-Rose学习

* HttpServletRequest.getContextPath 获取web程序root。如果是默认位置&#xff0c;返回””空串&#xff0c;否则返回 /根路径名 * rose是如何扫描到资源的 利用spring提供的类扫描类和jar* rose建立匹配树的过程 传入根节点和List&#xff0c;按照路径建立每个节点 * Module…

楪祈机器人_饥荒 Inori楪祈人物MOD V20161211

使用说明&#xff1a;1.解压缩2.复制所有文件到游戏目录mods3.启动游戏&#xff0c;点击mods(模组)加载MOD适用游戏版本&#xff1a;理论上支持所有版本的饥荒(普通&#xff0c;巨人&#xff0c;海难&#xff0c;联机版)MOD说明&#xff1a;饥荒 Inori楪祈人物MOD&#xff1b;由…

javascript 模块化

2019独角兽企业重金招聘Python工程师标准>>> 一直好奇像node.js,require.js的模块化是怎么做的&#xff0c;在看了《你不知道的javascript》后&#xff0c;对js的模块化有了一些简单的了解。这本书真的还不错。 书里讲述了js的模块化的原理 和 现代js实现模块化的简…

AD20学习笔记5---PCB设计规则设置及PCB手工布线

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

理论物理极础9:相空间流体和吉布斯-刘维尔定理

莱尼喜欢看河&#xff0c;尤其喜欢看漂浮物顺流而下。他猜想漂浮物如何穿过礁石&#xff0c;如何陷入漩涡。但是河流整体&#xff0c;水量&#xff0c;流切变&#xff0c;河的分流和汇聚&#xff0c;这是莱尼所看不到的。 相空间流体 在经典力学里&#xff0c;注视一个特别的初…

ComponentName的意思

ComponentName是用来打开其它应用程序中的Activity或服务的。 使用方法&#xff1a; Intent inew Intent();i.setComponent(new ComponentName(String packageName,String activityName ));startActivity(i); 转载于:https://www.cnblogs.com/hrhguanli/p/3861243.html

nginx没有worker进程_如何优雅地关闭worker进程?

点击上方“武培轩”&#xff0c;选择“设为星标”技术文章第一时间送达&#xff01;之前我们讲解 Nginx 命令行的时候&#xff0c;可以看到 Nginx 停止有两种方式&#xff0c;分别是 nginx -s quit 和 nginx -s stop&#xff0c;其中 stop 是指立即停止 Nginx&#xff0c;而 qu…

[Python3]Python面向对象的程序设计

[Python3]Python面向对象的程序设计 一、面向对象的程序设计的由来 1.第一阶段&#xff1a;面向机器&#xff0c;1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。 简单来说,就是直接编写 0 和 1 的序列来代表程序语…

RC电路输出波形的时域与频域分析

RC一阶电路为例进行时域和频域分析&#xff0c;激励Us为方波&#xff0c;以Uc作为输出的波形相当于积分电路的输出曲线&#xff0c;以Ur作为输出的波形相当于微分电路的输出曲线。电容对输入电压具有平滑作用&#xff0c;平滑程度与时间常数有关&#xff0c;衰减程度与带宽设计…