利用Vue特性与Cavnas的API绘制简易时钟
模块作用域、computed的灵活运用,以及CSS的border边框处理。
实例代码
从template,到css,再到详细的js逻辑代码。
html
里面放置一个canvas,我们假设宽高都是200px,则:
css
![4bf2e89375654e1257e19a007bbc6338.png](https://i-blog.csdnimg.cn/blog_migrate/b542643524f3d4dcbbfb922bb01a01e2.jpeg)
这里主要是利用了css天然的dashed虚线边框来模拟时钟的刻度。
至此效果如下:
![f7647c6cd936604ad7cd75fe4b937357.png](https://i-blog.csdnimg.cn/blog_migrate/df47037302f1b02ab26720f2b6ceca96.jpeg)
js
data
![8553b6565ae4e88372ce57321baaeeb8.png](https://i-blog.csdnimg.cn/blog_migrate/2abc2d815d1686d44afcaa211846f440.jpeg)
这里使用一个date的data来控制变化,从而自动触发与之相关的computed字段,并在computed里面触发绘制函数。
computed
![dbb2544a275eb36bcebc80773757e70d.png](https://i-blog.csdnimg.cn/blog_migrate/0978975cc23675efedb81e725696663c.jpeg)
这里需要注意,最好像上面那样提供一个result变量,传给函数用,否则就可能在函数里面再次调用this.time,那这样就死循环了。
methods
![e47f2d8b28bc87d75c5dc3b569044905.png](https://i-blog.csdnimg.cn/blog_migrate/22d0649ef1bedf197aeccd51a0dec87f.jpeg)
上面注意两点:
- 如果有些变量或DOM,只会获取一次,并且与$vue实例无关,那么可以考虑放在模块变量中,不用什么都绑定在data上,算是一种分工优化。
- canvas的save与restore在这里使用是非常重要的东西。
其他就是常规的代码计算与逻辑。
无外乎,mounted时候主动触发一个this.date的值,并且后面每秒获取一次,这样就可以触发this.date这个computed,于是有触发绘制函数drawCanvas,一条线下来,相当于纯自动,感觉还是很棒的。
最终效果
![4e4b4b3f8377196adab689bb478f2cd4.gif](https://i-blog.csdnimg.cn/blog_migrate/d762a42d2238ce3f92d2518f654ec03f.gif)