在github上看到的练习,看了遍代码后,按自己的思路再修改了一下。
先放原址:https://github.com/graysheeep/vue-material-timepicker。
自己做的在线demo:http://jsbin.com/dumace/2/edit?html,js,output
主要用到的还是Vue的基本知识而已,不过要想到的细节很多。
先放效果,点击上框,显示timepicker。而且可以根据点击的是时还是分来改变圆盘的数字。

这里我用了两个组件,<time-box>和<time-picker>,这里的时和分的数值我挂在了根实例中,因为两个组件都需要这两个值,所以想了想我决定还是挂在根实例,通过动态绑定到组件中。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;
})
}
})
<time-box>组件
点击时、分的时候,要“通知”根实例点击的是什么,下面的时钟才能显示相应的数字。改变父组件的属性,有两种办法,一是直接修改父组件属性;二是通过自定义事件。
Vue.component('time-box',{
template:'
<div class="timeBox" @click="openTime">
<span @click="changeCurrent('h')">{{hour}}</span>
<span> : </span>
<span @click="changeCurrent('m')">{{minutes}}<span/>
</div>',
props: ['hour','minutes'],
methods: {
openTime: function() {
app.$emit("openTimePicker");
},
changeCurrent: function(type) {
if(type == 'h' ){
app.current = 0;
} else {
app.current = 1;
}
}
}
});
<time-picker>组件
这里最需要注意的就是单向数据流。时分是通过props传进来的,刚开始我直接操作this.hour,然后控制台警告。看到警告才想起看过的知识,这样很容易误改父组件的信息。所以啊,有些东西得实践才行,不能只看不敲。这里我定义一个局部 data 属性,并将 prop 的初始值作为局部数据的初始值。知识点:https://cn.vuejs.org/v2/guide/components.html#单向数据流
props: ['h','m','mode'],
data: function() {










