Todo គឺជា App សម្រាប់ឲ្យយើងកំណត់ចំណាំថាយើងត្រូវធ្វើអ្វី ហើយយើងបានធ្វើអ្វីរួចហើយ។

បន្ទាប់ពីយើងបាន install project រួចហើយយើងចាប់ផ្ដើមអនុវត្តន៍
Card
មុនដំបូងធ្វើ Card មួយយកមកប្រើ ដោយយើងបង្កើត file មួយឈ្មោះថា Card.vue
<template> <div class="card"> <div class="txt">{{ content }}</div> <div class="btn-box"> <button class="btn-check">✓</button> <button class="btn-cross">✗</button> </div> </div> </template> <script setup> name: 'Card' const props = defineProps({ content: { type: String } }) </script> <style> .card{ width: 100%; background-color: #ecf0f1; color: black; border-radius: 8px; display: flex; margin: 5px; } .card .txt,.btn-box{ display: flex; padding: 10px; font-size: 18px; align-items: center; } .card .btn-box{ margin-left: auto; } .card .btn-box button{ font-size: 18px; margin-left: 5px; cursor: pointer; padding: 5px; border-radius: 5px; border: 0px; padding-left: 20px; padding-right: 20px; } .card .btn-box .btn-check{ background-color: #c3c3c3; color: white; } .card .btn-box .btn-cross{ background-color: #eb3b5a; color: white; } </style>

ចំពោះ file Card.vue យើងប្រើ slot ជំនួស button វិញ
<template> <div class="card"> <div class="txt">{{ content }}</div> <slot></slot> </div> </template>
File App.vue
នៅផ្នែកខាងនេះយើងហៅ file Card.vue មកប្រើ
<template> <Card>dfdf</Card> </template> <script setup> import Card from '@/components/Card.vue'; </script>

Custom Input
យើងធ្វើ input ទិន្ន័យនៅក្នុង file App.vue
<template> <div class="contain"> <form class="form-input"> <input type="text" placeholder="Add todo"> <button class="btn-gb">Add</button> </form> </div> </template> <script setup> import Card from '@/components/Card.vue'; </script> <style> body{ background-color: rgba(0, 0, 0, 0.69); } .contain{ width: 500px; margin: 0 auto; } .form-input{ padding: 8px; } .form-input input{ padding: 10px; border-radius: 8px; width: 79%; margin-right: 10px; border: 1px solid; font-size: 18px; } .form-input button{ /* padding: 10px; */ font-size: 16px; padding: 10px 20px 10px 20px; border: 0px; background-color: #4b7bec; color: white; border-radius: 8px; cursor: pointer; } </style>

Custom Card របស់យើង នៅ file App.vue
<template> <div class="contain"> <form class="form-input"> <input type="text" placeholder="Add todo"> <button class="btn-gb">Add</button> </form> <!--MARK: Custom Card--> <card> <div class="txt">Hello</div> <div class="btn-box"> <button class="btn-check">✓</button> <button class="btn-cross">✗</button> </div> </card> </div> </template>

ការងារជាមួយ javaScript vue
យើង import ref និង បង្កើតទិន្ន័យជា Array មួយសម្រាប់ហៅមកប្រើ
<script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref } from 'vue'; //MARK: To Do const todos = ref([ { id: 'id1', article: 'Cooking Rice', done: false }, { id: 'id2', article: 'Read book', done: false }]) </script>
ទាញទិន្ន័យទៅដាក់នៅ Card ដោយប្រើ v-for
<card v-for="todo in todos" > <div class="txt">{{ todo.article }}</div> <div class="btn-box"> <button class="btn-check">✓</button> <button class="btn-cross">✗</button> </div> </card>

Add todo
បញ្ចូលទិន្ន័យ ឬ add to do ពីខាងក្រៅ។ នៅចំនុចនេះខ្ញុំសុំ install npm uuid ដើម្បីធ្វើជា id auto
បិទទិន្ន័យពី Array todos សិន
<script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref } from 'vue'; import { v4 as uuidv4 } from 'uuid'; //MARK: To Do const todos = ref([ // { // id: 'id1', // article: 'Cooking Rice', // done: false // }, // { // id: 'id2', // article: 'Read book', // done: false // } ]) //MARK: Add To Do const newArticleTodo = ref() const addTodo = ()=>{ const newTodo ={ id: uuidv4(), article: newArticleTodo.value, done: false } todos.value.unshift(newTodo) newArticleTodo.value = '' } </script>
<form class="form-input" @submit.prevent="addTodo"> <input v-model="newArticleTodo" type="text" placeholder="Add todo"> <button class="btn-gb">Add</button> </form>

Disable button Add
ធ្វើការបិទនៅពេលប្រអប់បញ្ចូលទទេគឺមិនអាចចុច button Add បានទេ
<button :disabled="!newArticleTodo" class="btn-gb">Add</button>
Delete To Do
លុបទិន្ន័យពី Array ដោយយើងលុបតាមរយៈ id
<script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref } from 'vue'; import { v4 as uuidv4 } from 'uuid'; //MARK: To Do const todos = ref([ { id: 'id1', article: 'Cooking Rice', done: false }, { id: 'id2', article: 'Read book', done: false } ]) //MARK: Delete To Do const deleteTodo = id =>{ todos.value = todos.value.filter(todo => todo.id !== id) } </script>
<button @click="deleteTodo(todo.id)" class="btn-cross">✗</button> </div> </card>

Mark Done
នៅចំណុចនេះធ្វើឲ្យមាន highlingh នៅពេល Array done is true។ ដើម្បីធ្វើឧទាហរណ៍ យើងដាក់ Array done យើង true មួយ។
custome style background នៃ Card
<card v-for="todo in todos" :class="{sucess: todo.done}" >

Custome Button Check ដោយយើងប្រើ tourney។ សូមលុបឈ្មោះ class style ចោលសិន
<button :class="todo.done? 'btnSucess': 'btn-check' " class=" ">✓</button> <button

ការឆ្នូតអក្សរ
<div :class="{line: todo.done}" class="txt">{{ todo.article }}</div>

Style css
.btnSucess{ background-color: #4834d4; color: white; } /* MARK Done */ .sucess{ /* Change BG*/ background-color: #7ed6df; color: rgb(255, 255, 255); } .btnSucess{ background-color: #4834d4; color: white; } .line{ text-decoration: line-through; text-decoration-color: rgb(164, 176, 190); } </style>
Toggle button
បន្ទាប់ពីយើង custome style រួចហើយយើងមកធ្វើ Action ជាមួយ JavaScript
<script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref } from 'vue'; import { v4 as uuidv4 } from 'uuid'; //MARK: To Do const todos = ref([ { id: 'id1', article: 'Cooking Rice', done: false }, { id: 'id2', article: 'Read book', done: true } ]) //MARK: Mark Done const toggleBtn = id =>{ const index = todos.value.findIndex(todo =>todo.id == id) todos.value[index].done = !todos.value[index].done } </script>
<button @click="toggleBtn(todo.id)" :class="todo.done? 'btnSucess': 'btn-check' " class=" ">✓</button>

All code
Card.vue
<template> <div class="card"> <div class="txt">{{ content }}</div> <slot></slot> </div> </template> <script setup> name: 'Card' const props = defineProps({ content: { type: String } }) </script> <style> .card{ width: 100%; background-color: #ecf0f1; color: black; border-radius: 8px; display: flex; margin: 5px; } .card .txt,.btn-box{ display: flex; padding: 10px; font-size: 18px; align-items: center; } .card .btn-box{ margin-left: auto; } .card .btn-box button{ font-size: 18px; margin-left: 5px; cursor: pointer; padding: 5px; border-radius: 5px; border: 0px; padding-left: 20px; padding-right: 20px; } .card .btn-box .btn-check{ background-color: #c3c3c3; color: white; } .card .btn-box .btn-cross{ background-color: #eb3b5a; color: white; } </style>
App.vue
<template> <div class="contain"> <form class="form-input" @submit.prevent="addTodo"> <input v-model="newArticleTodo" type="text" placeholder="Add todo"> <button :disabled="!newArticleTodo" class="btn-gb">Add</button> </form> <!--MARK: Custom Card--> <card v-for="todo in todos" :class="{sucess: todo.done}" > <div :class="{line: todo.done}" class="txt">{{ todo.article }}</div> <div class="btn-box"> <button @click="toggleBtn(todo.id)" :class="todo.done? 'btnSucess': 'btn-check' " class=" ">✓</button> <button @click="deleteTodo(todo.id)" class="btn-cross">✗</button> </div> </card> </div> </template> <script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref } from 'vue'; import { v4 as uuidv4 } from 'uuid'; //MARK: To Do const todos = ref([ { id: 'id1', article: 'Cooking Rice', done: false }, { id: 'id2', article: 'Read book', done: true } ]) //MARK: Add To Do const newArticleTodo = ref() const addTodo = ()=>{ const newTodo ={ id: uuidv4(), article: newArticleTodo.value, done: false } todos.value.unshift(newTodo) newArticleTodo.value = '' } //MARK: Delete To Do const deleteTodo = id =>{ todos.value = todos.value.filter(todo => todo.id !== id) } //MARK: Mark Done const toggleBtn = id =>{ const index = todos.value.findIndex(todo =>todo.id == id) todos.value[index].done = !todos.value[index].done } </script> <style> body{ background-color: rgba(0, 0, 0, 0.69); } .contain{ width: 500px; margin: 0 auto; } .form-input{ padding: 8px; } .form-input input{ padding: 10px; border-radius: 8px; width: 79%; margin-right: 10px; border: 1px solid; font-size: 18px; } .form-input button{ /* padding: 10px; */ font-size: 16px; padding: 10px 20px 10px 20px; border: 0px; background-color: #4b7bec; color: white; border-radius: 8px; cursor: pointer; } .btn-gb{ background-color: red; } .btnSucess{ background-color: #4834d4; color: white; } /* MARK Done */ .sucess{ /* Change BG*/ background-color: #7ed6df; color: rgb(255, 255, 255); } .btnSucess{ background-color: #4834d4; color: white; } .line{ text-decoration: line-through; text-decoration-color: rgb(164, 176, 190); } </style>
មេរៀនបន្ទាប Vue to do ជាមួយ google firebase
0 Comments