Checkerboard in Vue.js

This was my first experiment with Vue.js. I wanted to see how hard it would be to use one custom component inside another. Since this was a toy example, I decided to try to draw a chess board.

In line 39, I had to cast a string as a number. I’m sure there’s a better way to do that, but I’m not sure what it is yet. I also needed to specify a :key attribute so that each element had a unique key… unfortunately, my key i+j is not unique. I should have specified i*Number(size)+j, but Vue.js did not complain, and this didn’t cause any bugs this time, so… ship it.

<html>
  <head>
    <title>Example Component</title>
  </head>
  <body>
    <p>Chess Board</p>
    <div id="app">
      <board size=8></board>
    </div>
    <script src="https://unpkg.com/vue"></script>
    <script>
      Vue.component('square', {
        template: '<span :style="style"></span>',
        props: ['row', 'col'],
        methods: {
          getColor() {
            if ((Number(this.row) + Number(this.col)) % 2 == 0) {
              return 'white';
            } else {
              return 'black';
            }
          }
        },
        computed: {
          style() {
            return {
              backgroundColor: this.getColor(),
              width: '50px',
              height: '50px',
              display: 'inline-block',
              border: 'solid black 1px',
              marginRight: '0px',
              marginTop: '-3px'
            };
          }
        }
      });
      Vue.component('board', {
        template: '<div><div v-for="i in Number(size)"><square v-for="j in Number(size)" :row=i :col=j :key=i+j></square></div></div>',
        props: ['size']
      });
      new Vue({
        el: "#app",
      });
    </script>
  </body>
</html>

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.