Vue

by inser

HTML

<div id="app">
    <todo :item="item"></todo>
</div>

<script type="text/x-template" id="todo-item">
  <label>
    <div>{{ item.text }}</div>
    <div><b>{{ isDone }}</b></div>
  </label>
</script>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}

Vue

Vue.component('todo', {
	props: ['item'],
  template: '#todo-item',
  computed: {
  	isDone () {
    	return this.item.done ? 'It\'s already done' : 'To be done'
    }
  }
})

new Vue({
  el: "#app",
  data: () => ({ item: null }),
  mounted () {
  	this.item = {
      text: 'New item added after `mounted`. Error in console, but rendered correctly.',
      done: false
    }
  }
})