JSFiddle - React, Tailwind, and code Playground
by Atinux
HTML
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<div id="my-app">
<!--<task-list :tasks="my_tasks"></task-list>-->
<!--
Replace the line above with the following line (WARINING Does NOT work with Vue 2.0.1)
-->
<task-list :tasks-data="[{body: 'Hello all', completed: false},{body: 'Goodbye all', completed: false}]"></task-list>
</div>
<!-- Template for custom component -->
<template id="task-list-template">
<div>
<h3>Remaining task {{ remaining }}</h3>
<ul>
<li v-for="task in tasks" @click="toggleCompletedStatus(task)">
{{ task.body }}
</li>
</ul>
</div>
</template>
JavaScript
/*****************
* Component *
* ***************/
Vue.component('task-list', {
template: '#task-list-template',
props: ['tasks-data'],
data: function () {
return { tasks: [] };
},
computed: {
remaining: function () {
return this.tasks.filter(
this.inProgress
).length;
}
},
created: function () {
this.tasks = this.tasksData; // Set default properties
},
methods: {
/**
* Toggle the completed status of a task
* @param item
*/
toggleCompletedStatus: function (item) {
return item.completed = !item.completed;
},
/**
* Returns true when task is in progress (not completed)
* @param item
*/
inProgress: function (item) {
return !item.completed;
}
}
});
/*************
* Model *
* ***********/
var data = {
my_tasks: [
{body: "Go to the doctor", completed: false},
{body: "Go to the bank", completed: false},
{body: "Go to the zoo", completed: false}
],
};
/*************
* ViewModel *
* ***********/
new Vue({
el: '#my-app',
data: data
});