.container{     max-width: 700px;     margin-inline: auto;     display: flex;     align-items: center;     justify-content: center;     flex-direction: column;}form #inputTodo{     padding: 8px 15px;}form #btnSubmit{     padding: 8px 15px;}.todos-container{     padding: 10px;     width: 100%;     width: fit-content;}.todo-item{     padding: 5px;     border: 1px solid gray;     gap: 20px;     width: 100%;     display: flex;     align-items: center;}.textCut{     text-decoration: line-through;}
interface Todo{     content: string,     isComplete: boolean,     readonly id:string}let todos:Todo[] = [];const todosContainer = document.querySelector(\\'.todos-container\\')!;function genrateTodo(id: string, content:string, isComplete:boolean){     const itemContainer:HTMLDivElement = document.createElement(\\'div\\');     itemContainer.classList.add(\\'todo-item\\');     // checkbox     const checkbox: HTMLInputElement = document.createElement(\\'input\\');     checkbox.type = \\\"checkbox\\\";     checkbox.checked = isComplete     checkbox.onchange = () => {          todos.find(todo => {               if(todo.id === id) todo.isComplete = checkbox.checked;               // save updated todo               localStorage.setItem(\\'todos\\', JSON.stringify(todos));          })          todoText.className = checkbox.checked ? \\'textCut\\' : \\'\\';     }     // paragraph content     const todoText:HTMLParagraphElement = document.createElement(\\'p\\');     todoText.innerHTML = content;     todoText.className = isComplete ? \\'textCut\\' : \\'\\';     // delete button     const btnDelete: HTMLButtonElement = document.createElement(\\'button\\');     btnDelete.textContent = \\'X\\';     btnDelete.onclick = () => {          todos = todos.filter(todo => todo.id !== id);          localStorage.setItem(\\'todos\\', JSON.stringify(todos));          renderTodos(todos);     }     itemContainer.append(checkbox, todoText, btnDelete);     todosContainer.appendChild(itemContainer);}// add todoconst form = document.getElementById(\\'myForm\\')!;form.onsubmit = (e: SubmitEvent) => {     e.preventDefault();     const inputElement = document.getElementById(\\'inputTodo\\') as HTMLInputElement;     let value:string = inputElement.value;     const newTodo:Todo = {          id: String(Math.random() * 1000),          content: value,          isComplete: false     }     todos.push(newTodo);     inputElement.value = \\\"\\\";     localStorage.setItem(\\'todos\\', JSON.stringify(todos));     renderTodos(todos);}function renderTodos(todos: Todo[]){     todosContainer.innerHTML = \\\"\\\";     todos.forEach(todo => {          genrateTodo(todo.id, todo.content, todo.isComplete);     })}const jsonTodos = localStorage.getItem(\\'todos\\')!;const storedTodos : Todo[] = JSON.parse(jsonTodos);todos = storedTodos;renderTodos(todos);
","image":"http://www.luping.net/uploads/20240729/172225188366a77a6bd96e6.jpg","datePublished":"2024-07-29T19:18:03+08:00","dateModified":"2024-07-29T19:18:03+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 로컬 저장소에 Todos 저장을 사용하여 Typescript에서 Todo 애플리케이션을 생성합니다.

로컬 저장소에 Todos 저장을 사용하여 Typescript에서 Todo 애플리케이션을 생성합니다.

2024-07-29에 게시됨
검색:947

I create a Todo Application in Typescript With Save Todos in Local Storage

우리는 TypeScript를 이해하기 위해 TypeScript가 포함된 바닐라 vite 프로젝트를 사용하고 할 일을 저장하기 위해 로컬 저장소를 사용합니다.




     
     
     
     Vite   TS
     



     

My Todo List

.container{
     max-width: 700px;
     margin-inline: auto;
     display: flex;
     align-items: center;
     justify-content: center;
     flex-direction: column;
}

form #inputTodo{
     padding: 8px 15px;
}

form #btnSubmit{
     padding: 8px 15px;
}

.todos-container{
     padding: 10px;
     width: 100%;
     width: fit-content;
}

.todo-item{
     padding: 5px;
     border: 1px solid gray;
     gap: 20px;
     width: 100%;
     display: flex;
     align-items: center;
}

.textCut{
     text-decoration: line-through;
}
interface Todo{
     content: string,
     isComplete: boolean,
     readonly id:string
}

let todos:Todo[] = [];

const todosContainer = document.querySelector('.todos-container')!;

function genrateTodo(id: string, content:string, isComplete:boolean){
     const itemContainer:HTMLDivElement = document.createElement('div');
     itemContainer.classList.add('todo-item');

     // checkbox
     const checkbox: HTMLInputElement = document.createElement('input');
     checkbox.type = "checkbox";
     checkbox.checked = isComplete
     checkbox.onchange = () => {
          todos.find(todo => {
               if(todo.id === id) todo.isComplete = checkbox.checked;

               // save updated todo
               localStorage.setItem('todos', JSON.stringify(todos));
          })
          todoText.className = checkbox.checked ? 'textCut' : '';
     }

     // paragraph content
     const todoText:HTMLParagraphElement = document.createElement('p');
     todoText.innerHTML = content;
     todoText.className = isComplete ? 'textCut' : '';

     // delete button
     const btnDelete: HTMLButtonElement = document.createElement('button');
     btnDelete.textContent = 'X';
     btnDelete.onclick = () => {
          todos = todos.filter(todo => todo.id !== id);
          localStorage.setItem('todos', JSON.stringify(todos));
          renderTodos(todos);
     }

     itemContainer.append(checkbox, todoText, btnDelete);
     todosContainer.appendChild(itemContainer);

}

// add todo
const form = document.getElementById('myForm')!;
form.onsubmit = (e: SubmitEvent) => {
     e.preventDefault();
     const inputElement = document.getElementById('inputTodo') as HTMLInputElement;
     let value:string = inputElement.value;

     const newTodo:Todo = {
          id: String(Math.random() * 1000),
          content: value,
          isComplete: false
     }

     todos.push(newTodo);
     inputElement.value = "";

     localStorage.setItem('todos', JSON.stringify(todos));

     renderTodos(todos);
}


function renderTodos(todos: Todo[]){
     todosContainer.innerHTML = "";
     todos.forEach(todo => {
          genrateTodo(todo.id, todo.content, todo.isComplete);
     })
}

const jsonTodos = localStorage.getItem('todos')!;
const storedTodos : Todo[] = JSON.parse(jsonTodos);
todos = storedTodos;
renderTodos(todos);
릴리스 선언문 이 글은 https://dev.to/akram6t/i-create-a-todo-application-in-typescript-with-save-todos-in-local-storage-2ej3?1에서 재현됩니다. 침해가 있는 경우 , [email protected]로 문의해주세요.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3