Построение Todo-List с нуля с помощью Html, CSS и Javascript(LocalStorage).

Как дела у технарей, вы когда-нибудь создавали список дел с помощью Javascript, и элементы в приложении удалялись сразу после перезагрузки или вы когда-нибудь задавались вопросом, как можно создать список дел с помощью Javascript?

Если да, то эта статья для вас, в ней мы создадим список дел с нуля, используя Html, CSS и Javascript, мы также воспользуемся преимуществами Javascript’s LocalStorage API для сохранения данных.

Давайте приступим,

ПРЕОБРАЗОВАТЕЛИ

  1. Редактор кода: Чтобы продолжить, пожалуйста, убедитесь, что у вас установлен любой редактор кода на ваш выбор, в этой статье использовался Visual Studio Code (VS Code), но вы можете использовать любой редактор кода на ваш выбор.
  2. Веб-браузер: Нам также понадобится веб-браузер, вы можете использовать любой веб-браузер на ваш выбор, в этой статье использовался Brave.
  3. Live Server (необязательно): Live Server — это расширение Visual Studio Code, которое перезагружает вашу веб-страницу при каждом изменении статических файлов. Вам не обязательно использовать это расширение, особенно если вы не используете VS Code.

Установка

  • Создайте папку на вашем компьютере и откройте ее с помощью редактора кода.
  • Создайте 3 файла в рабочей области: index.html, style.css и src.js. После этого ваше рабочее пространство должно выглядеть как на картинке ниже (для пользователей vs Code).

  • Откройте файл index.html в удобном для вас браузере, если вы используете vscode и у вас установлен live server, нажмите на ссылку Go Live в правом нижнем углу редактора кода. Live server откроет ваш проект в браузере и будет автоматически перезагружать веб-страницу при внесении изменений в ваш код.

Теперь давайте писать код!

  • В ваш файл index.html добавьте следующий код
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Todo App</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="main-wrapper">
        <div class="action-wrapper">
            <input type="text" id="input"> <button id="add_btn">Add</button>
        </div>
        <div class="list-wrapper" id="item_list_container">

        </div>
    </div>
    <script src="src.js"></script>
</body>
</html>
Вход в полноэкранный режим Выйти из полноэкранного режима

Что происходит здесь?

Ничего особенного, приведенный выше код представляет собой базовую HTML-страницу, которая отражает структуру нашей веб-страницы.
Однако есть несколько моментов, на которые следует обратить внимание. В теге head нашего кода есть <link rel="stylesheet" href="style.css">, он используется для ссылки файла style.css, который мы создали изначально, на нашу HTML страницу, чтобы мы могли использовать CSS файл для оформления нашей HTML страницы, также прямо перед закрывающим тегом body у нас есть <script src="src.js"></script> он используется для загрузки src.js файла в нашу HTML страницу.

  • В файл style.css добавьте следующий код
.main-wrapper{
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 100%;
    padding: 20px 0%;
}
.action-wrapper{
    padding: 30px;
}
.action-wrapper input{
    font-size: 1rem;
    padding: 10px;
    border: blue 1px solid;
}
.action-wrapper button, .item-actions button{
    padding: 12px;
    background-color: blue;
    color: white;
    font-weight: bolder;
    border: solid 1px rgb(112, 153, 153);
}
.action-wrapper button:hover, .item-actions button:hover{
    background-color: white;
    color: black;
    border: blue 1px solid;
    cursor: pointer;
}
.list-item{  
    width: 100%;
    margin: 20px 0%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.item-name{
    padding: 10px;
    font-size: 1.2rem;
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Что здесь происходит?

Это просто базовый код CSS для добавления некоторых простых стилей на нашу веб-страницу.

  • В файл src.js добавьте следующий код
const id = (x) => {
    return document.getElementById(x);
}
let input = id('input');
let addBtn = id('add_btn');
let listContainer = id('item_list_container');
let itemList = localStorage.itemList ? JSON.parse(localStorage.itemList) : [];


const renderList = () => {
    listContainer.innerHTML = ``;
    for (let i = itemList.length - 1; i > 0; i--) {
        listContainer.innerHTML += `
            <div class="list-item">
                <div class="item-name">
                    ${itemList[i]}
                </div>
                <div class="item-actions">
                    <button onclick="editItem(${i})">Edit</button>
                    <button onclick="deleteItem(${i})">Delete</button>
                </div>
            </div>
        `;
    }
}

const addEvent = () => {
    let value = input.value;
    if (value.length > 0) {
        itemList.push(value);
        input.value = "";
    } else {
        alert("Please specify a name for your task");
    }
    localStorage.itemList = JSON.stringify(itemList);
    renderList();
}

const deleteItem = (index)=>{
    let item = itemList[index];
    if(item != undefined){
        itemList.splice(index, 1);
        localStorage.itemList = JSON.stringify(itemList);
        renderList();
    }else{
        alert("Item has already been deleted.");
    }
}

const editItem = (index)=>{
    let item = itemList[index];
    if(item != undefined){
        let ask = prompt(`Change "${item}" to : `);
        if(ask.length > 0){
            itemList[index] = ask;
            localStorage.itemList = JSON.stringify(itemList);
            renderList();
        }
    }else{
        alert("Item not available in list.");
    }
}

addBtn.addEventListener("click", (e) => {
    e.preventDefault();
    addEvent();
})

renderList();
Войти в полноэкранный режим Выйти из полноэкранного режима

Что происходит здесь?

Приведенный выше код отвечает за обработку всех действий, выполняемых на нашей веб-странице. Это объяснение кода по блокам. :

В начале нашего файла мы имеем

const id = (x) => {
    return document.getElementById(x);
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Функция id — это сокращение, используемое для получения элементов из DOM путем передачи id элемента. Функция была создана для того, чтобы просто сократить метод document.getElementById().

Объявления переменных

let input = id('input');
let addBtn = id('add_btn');
let listContainer = id('item_list_container');
let itemList = localStorage.itemList ? JSON.parse(localStorage.itemList) : [];
Вход в полноэкранный режим Выход из полноэкранного режима

Переменные input, addBtn и listContainer назначаются функции id с дополнением в виде соответствующего id элемента, который мы хотим им присвоить.

  • Переменная input представляет собой <input type="text" id="input"> из нашего html-файла.
  • Переменная addBtn представляет собой <button id="add_btn">Add</button> из нашего html-файла.
  • Переменная listContainer представляет собой <div class="list-wrapper" id="item_list_container"></div> из нашего html-файла.
  • Переменная itemList содержит список пунктов дел из localStorage, мы использовали троичный оператор для проверки наличия ltemList в localStorage, затем мы разбираем строку и присваиваем ее нашей переменной или просто присваиваем пустой массив. Это делается для того, чтобы гарантировать, что переменной будет присвоен как минимум массив.

Функция renderList.

const renderList = () => {
    listContainer.innerHTML = ``;
    for (let i = itemList.length - 1; i > 0; i--) {
        listContainer.innerHTML += `
            <div class="list-item">
                <div class="item-name">
                    ${itemList[i]}
                </div>
                <div class="item-actions">
                    <button onclick="editItem(${i})">Edit</button>
                    <button onclick="deleteItem(${i})">Delete</button>
                </div>
            </div>
        `;
    }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Функция renderList просто используется для заполнения списка дел на нашей веб-странице.
Ниже приведен список действий, выполняемых внутри этой функции.

  • Во-первых, мы очищаем все элементы внутри listContainer, добавляя listContainer.innerHTML =;.
  • Затем мы перебираем массив itemList в порядке убывания и добавляем HTML-разметку в listContainer для каждой итерации. Цикл был написан в порядке возрастания, так что более новые элементы будут находиться в верхней части списка.

функция addEvent

const addEvent = () => {
    let value = input.value;
    if (value.length > 0) {
        itemList.push(value);
        input.value = "";
    } else {
        alert("Please specify a name for your task");
    }
    localStorage.itemList = JSON.stringify(itemList);
    renderList();
}

Вход в полноэкранный режим Выход из полноэкранного режима

Функция addEvent, как следует из названия, используется для добавления новых событий в наш список дел.

  • Сначала мы попытаемся получить доступ к значению, введенному в наш ввод, используя let value = input.value;.
  • Затем мы напишем условие, чтобы проверить, было ли что-то введено в поле ввода. Если значение истинно, мы добавляем новый элемент в массив itemList с помощью itemList.push(value);, затем мы очищаем поле ввода с помощью input.value = "";. Если в поле ввода ничего не было введено, мы показываем предупреждение о том, что ничего не было введено.
  • После условного оператора мы обновляем список itemList в нашем локальном хранилище с помощью localStorage.itemList = JSON.stringify(itemList);, затем запускаем renderList(); для обновления веб-страницы новым элементом.

Функция deleteItem.

const deleteItem = (index)=>{
    let item = itemList[index];
    if(item != undefined){
        itemList.splice(index, 1);
        localStorage.itemList = JSON.stringify(itemList);
        renderList();
    }else{
        alert("Item has already been deleted.");
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Функция deleteItem используется для удаления определенного элемента из списка дел.

  • Функция получает один параметр index, который представляет собой позицию элемента, который мы хотим удалить из списка дел.
  • Затем мы пишем условие, чтобы проверить, доступен ли элемент, который мы пытаемся удалить. Если true, мы удаляем элемент, но добавляем itemList.splice(index, 1); затем обновляем список элементов localStorage, используя localStorage.itemList = JSON.stringify(itemList); после этого мы запускаем renderList(); для обновления элементов в нашем списке дел. Если элемент не найден, мы отправляем оповещение о том, что элемент уже был удален.

Функция editItem.

const editItem = (index)=>{
    let item = itemList[index];
    if(item != undefined){
        let ask = prompt(`Change "${item}" to : `);
        if(ask.length > 0){
            itemList[index] = ask;
            localStorage.itemList = JSON.stringify(itemList);
            renderList();
        }
    }else{
        alert("Item not available in the list.");
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Эта функция очень похожа на функцию deleteItem(), с той лишь разницей, что вместо удаления из списка itemList мы обновляем значение списка itemList по определенному индексу.

  • После написания условия, идентичного условию функции deleteItem(), мы открываем приглашение, спрашивающее пользователя, на что он хочет изменить элемент, используяlet ask = prompt(`Change "${item}" to : `);;
  • Затем мы подтверждаем, что пользователь ввел что-то в подсказку, если да, то обновляем значение itemList по указанному индексу с помощью itemList[index] = ask;, обновляем localStorage itemList с помощью localStorage.itemList = JSON.stringify(itemList);, и запускаем renderList(); для обновления пунктов в нашем списке дел.

В конце нашего файла

  • Сначала мы добавляем слушатель события click на элемент addBtn, используя
  • Затем мы запускаем функцию renderList(), чтобы отобразить наш список после загрузки страницы и выполнения всего Javascript.
addBtn.addEventListener("click", (e) => {
    e.preventDefault();
    addEvent();
})

renderList();

Вход в полноэкранный режим Выход из полноэкранного режима

Посмотрите, как я это делаю на youtube.

ПРИМЕЧАНИЕ

В нашем коде, когда мы хотим прочитать из localStorage, мы всегда используем JSON.parse() и когда мы хотим записать в него, мы всегда используем JSON.stringify, это потому, что мы пытаемся сохранить и получить массив из localStorage, а localStorage принимает только строки. Кроме того, максимальный лимит использования localStorage составляет 5 Мб.

Оцените статью
devanswers.ru
Добавить комментарий