This article is part of the A New Vue On JavaScript30 series that explores re-implementing #JavaScript30 projects using Vue. Today we will be working with the second of Wes Bos’s (@wesbos) #JavaScript30 projects titled: 02 - JS and CSS Clock. It’s a cool looking analog clock that uses a setInterval()
callback to control the clock hands by rotating them based on the current time.
Key Vue Concepts
The following Vue concepts are discussed in this article:
- Style binding with
:style
(shorthand forv-bind:style
) -
data
reactivity -
mounted
lifecycle hook
Vue Implementation
Unlike A New Vue On JavaScript30 - 01 JavaScript Drum Kit, I only created one Vue implementation this time but I followed a similar pattern. First, I inserted the code from the original #JavaScript30 project into their corresponding Vue locations in my base starter file from my getting started article:
- The HTML section fit inside the root
<div id="app">
- The functions went into the
methods
section - The JavaScript that executed upon page load was placed into the
mounted
function - The
<style>
section was moved into my Vue version unchanged - The
computed
andwatch
sections were not needed so they were removed
With those changes we can get pretty close to a working clock but not quite. The querySelector()
calls don’t have a place to go; without those, the rotation transforms aren’t going to work. To fix this I made just a couple of changes. First, I added three fields to the Vue Instance data object: secondsDegrees
, minsDegrees
, and hourDegrees
. These will hold the values in degrees for each clock hand.
Next, I changed the setDate
method to update those data fields. Note the usage of this
to reference the proper data fields within the Vue instance.
Then, I added a method transformHandStyle
that returns the transform style using degrees as its input.
And finally, I used Vue’s :style
binding to set the clock hands to the result of the transformHandStyle
method that is passed the corresponding data field.
Now let’s take a look at what the core of what the implementation looks like. I’ve annotated it to show how how it flows together.
- When the Vue instance is mounted, the
setDate
method is called at intervals of 1 second (1000ms). - Inside the
setDate
function, the calculations for each hand is computed and set in the appropriate data field. - Changes to the
secondsDegrees
,minsDegrees
, andhourDegrees
data fields activate Vue’s reactivity system to trigger calling thetransformHandStyle
method which sets the clock hand style. - The
transformHandStyle
method returns the css transform that rotates the clock hand.
Putting It All Together
Overall, my Vue implementation isn’t drastically different than #JavaScript30, but I was able to use Vue’s style binding and reactivity system to remove all direct JavaScript DOM queries and manipulations.
I hope you enjoyed this article, feel free to message me with any questions, comments, or corrections. All code presented within this series is available in my fork of the official #JavaScript30 GitHub repository which is located at:
Up Next
Next in the A New Vue On JavaScript30 series is:
Top comments (0)