简体   繁体   English

单击删除按钮时从本地存储中删除特定表行

[英]Removing specific table Row from local storage when clicking a delete button

I am pretty new to programming (just a few weeks) and was trying to do a small practise project where you can create jokes and then have them stored in localstorage along with you name and age.我对编程很陌生(只有几个星期),并且正在尝试做一个小型练习项目,您可以在其中创建笑话,然后将它们与您的姓名和年龄一起存储在本地存储中。 There is also a garbage can to the right where you can delete the joke.右侧还有一个垃圾桶,您可以在其中删除笑话。

You can see the site here: https://nostalgic-poitras-17b692.netlify.app/您可以在此处查看该站点: https://nostalgic-poitras-17b692.netlify.app/

Here you can find the files: https://github.com/Dannus90/JavaScript_Practise_Own_Project_Unfinished在这里您可以找到文件: https://github.com/Dannus90/JavaScript_Practise_Own_Project_Unfinished

So faar you can enter everything and it detects if you have entered or not.到目前为止,您可以输入所有内容,它会检测您是否已输入。 Then the joke gets stored in local storage and displays on the screen in the table.然后笑话被存储在本地存储中并显示在表格的屏幕上。

There are two problems at the moment: - If i click any trash can it removes all rows from local storage and I know why its doing it in the code, but I dont know how to target a specifik row and only delete that row from local storage when I click the trash can.目前有两个问题: - 如果我点击任何垃圾桶,它会从本地存储中删除所有行,我知道它为什么在代码中这样做,但我不知道如何定位特定行并且只从本地删除该行当我点击垃圾桶时存储。

  • The second problem is that when I made like 2 jokes and then refreshed the page.第二个问题是,当我做了 2 个笑话然后刷新页面时。 They are still there so everything is working.他们还在那里,所以一切正常。 However if I then after refresh type in new jokes they overwrite the old local storage instead of adding to it, so if I refresh again only the recent jokes show.但是,如果我在刷新后输入新的笑话,它们会覆盖旧的本地存储而不是添加到它,所以如果我再次刷新,只会显示最近的笑话。

The problems should be found in the following pictures: Problem1 Problem2问题应该在以下图片中找到:问题1问题2

This is my code so faar (In the documents from GitHub you also see the random ID generator. Took it away to decrease confusion:-)):这是我到目前为止的代码(在 GitHub 的文档中,您还可以看到随机 ID 生成器。把它拿走以减少混乱:-)):

// Variables

const jokeInput = document.getElementById("text-1");
const nameInput = document.getElementById("text-2");
const ageInput = document.getElementById("number");
const submitBtn = document.querySelector(".btn");
const output = document.querySelector(".output-container");

// Eventlisteners
submitBtn.addEventListener("click", validateFields);

// Error
function showError(input) {
  const formControl = input;
  formControl.style.border = "3px solid red";

  removeStyle(formControl);
}

// Show Error message
function showErrorMessage(input, message) {
  input.classList.add("error");
  input.innerText = message;
  setTimeout(() => {
    input.classList.remove("error");
  }, 3000);
}

// Show success
function showSuccess() {
  jokeInput.style.border = "3px solid green";
  nameInput.style.border = "3px solid green";
  ageInput.style.border = "3px solid green";

  const small = document.querySelector(".small-3");

  small.classList.add("success");
  small.innerText = "You have successfully entered all fields";
  setTimeout(() => {
    small.classList.remove("success");
  }, 3000);

  removeStyle(jokeInput, nameInput, ageInput);
}

// Remove Style
function removeStyle(input, input2, input3) {
  setTimeout(() => {
    input.style.removeProperty("border");
    input2.style.removeProperty("border");
    input3.style.removeProperty("border");
  }, 3000);
}

// Main Function
function validateFields(e) {
  e.preventDefault();

  if (jokeInput.value === "") {
    showError(jokeInput);
    const small = document.querySelector(".small-1");
    showErrorMessage(small, "Please provide a joke");
  }

  if (nameInput.value === "") {
    showError(nameInput);
    const small = document.querySelector(".small-2");
    showErrorMessage(
      small,
      "Please fill in your name with alpabetical characters only"
    );
  }

  if (ageInput.value === "") {
    showError(ageInput);
    const small = document.querySelector(".small-3");
    showErrorMessage(small, "Please enter your age");
  }

  if (
    jokeInput.value !== "" &&
    nameInput.value !== "" &&
    ageInput.value !== ""
  ) {
    showSuccess();
    updateDOM(jokeInput.value, nameInput.value, ageInput.value);
  }
}

// Save DOM Data
let savedLocalStorage1 = [];
let savedLocalStorage2 = [];
let savedLocalStorage3 = [];
let savedLocalStorage4 = [];

// Update local storage

function updateLocalStorage() {
  localStorage.setItem(
    "savedLocalStorage1",
    JSON.stringify(savedLocalStorage1)
  );
  localStorage.setItem(
    "savedLocalStorage2",
    JSON.stringify(savedLocalStorage2)
  );
  localStorage.setItem(
    "savedLocalStorage3",
    JSON.stringify(savedLocalStorage3)
  );
  localStorage.setItem(
    "savedLocalStorage4",
    JSON.stringify(savedLocalStorage4)
  );
}

// Update DOM
function updateDOM(input1, input2, input3) {
  const outputContainer = document.querySelector(".output-container");

  const row = outputContainer.insertRow(1);
  const cell1 = row.insertCell(0);
  const cell2 = row.insertCell(1);
  const cell3 = row.insertCell(2);
  const cell4 = row.insertCell(3);

  cell1.innerHTML = `${input1}`;
  cell2.innerHTML = `${input2}`;
  cell3.innerHTML = `${input3}`;
  cell4.innerHTML = `<i class="fas fa-trash-alt id4"></i>`;

  savedLocalStorage1.push({ id: uuidv4(), cell_1: `${input1}` });
  savedLocalStorage2.push({ id: uuidv4(), cell_2: `${input2}` });
  savedLocalStorage3.push({ id: uuidv4(), cell_3: `${input3}` });
  savedLocalStorage4.push({
    id: uuidv4(),
    cell_4: `<i class="fas fa-trash-alt id4"></i>`,
  });

  updateLocalStorage();

  const rows = document.querySelectorAll("tr");
  if (rows.length > 2) {
    resetBounce();
  }
}

window.onload = (e) => {
  function DOMOutput() {
    const sto1 = JSON.parse(localStorage.getItem("savedLocalStorage1"));
    const sto2 = JSON.parse(localStorage.getItem("savedLocalStorage2"));
    const sto3 = JSON.parse(localStorage.getItem("savedLocalStorage3"));
    const sto4 = JSON.parse(localStorage.getItem("savedLocalStorage4"));

    const outputContainer = document.querySelector(".output-container");

    for (let i = 0; i < sto1.length; i++) {
      const row = outputContainer.insertRow(1);

      const cell1 = row.insertCell(0);
      cell1.innerHTML = sto1[i].cell_1;

      const cell2 = row.insertCell(1);
      cell2.innerHTML = sto2[i].cell_2;

      const cell3 = row.insertCell(2);
      cell3.innerHTML = sto3[i].cell_3;

      const cell4 = row.insertCell(3);
      cell4.innerHTML = sto4[i].cell_4;

    }
  }

  DOMOutput();
};

// Delete from local Storage

// Reset bounce function
function resetBounce() {
  setTimeout(() => {
    const cell4 = document.querySelectorAll(".fas");
    cell4.forEach((element) => element.classList.remove("fas", "fa-trash-alt"));
  }, 50);

  setTimeout(() => {
    const cell4 = document.querySelectorAll(".id4");
    console.log(cell4);
    cell4.forEach((element) => element.classList.add("fas", "fa-trash-alt"));
  }, 75);
}

// Delete Function
output.addEventListener("click", function clearRow(e) {
  if (e.target.className.includes("fas")) {
    e.target.parentElement.parentElement.remove();

    // Needs to be fixed!

    localStorage.removeItem("savedLocalStorage1");
    localStorage.removeItem("savedLocalStorage2");
    localStorage.removeItem("savedLocalStorage3");
    localStorage.removeItem("savedLocalStorage4");
  }
});

Your problem - as you have correctly realized - is that you delete the whole item.您的问题 - 正如您正确意识到的那样 - 是您删除了整个项目。 But what you need to do instead, is copy over the contents from the old input and add the new on top of it.但是您需要做的是从旧输入中复制内容并在其上添加新内容。

First step would be to declare let sto1, sto2, sto3, sto4;第一步是声明let sto1, sto2, sto3, sto4; as global variables, so that every one of your functions always have access to it.作为全局变量,以便您的每个函数始终可以访问它。 You populate these variables in your onload function, basically the same way you did before, you only have to remove the const keyword in front of them.你在你的 onload function 中填充这些变量,基本上和你之前做的一样,你只需要删除它们前面的 const 关键字。

When you add a new item to the local storage, you access the global stored variable and use the spread operator to add all the old items to the newly created array:当您将新项目添加到本地存储时,您将访问全局存储变量并使用扩展运算符将所有旧项目添加到新创建的数组中:

 savedLocalStorage1 = [...sto1, { id: uuidv4(), cell_1: `${input1}` }];
  savedLocalStorage2 = [...sto2, { id: uuidv4(), cell_2: `${input2}` }];
  savedLocalStorage3 = [...sto3, { id: uuidv4(), cell_3: `${input3}` }];
  savedLocalStorage4 = [
    ...sto4,
    {
      id: uuidv4(),
      cell_4: `<i class="fas fa-trash-alt id4"></i>`
    }
  ];

For removing an item, you basically do the same, but you have to remove the item you do no longer need, maybe with a filter function (do this alone for practice, ask if you need a hint).对于删除一个项目,你基本上做同样的事情,但你必须删除你不再需要的项目,也许使用过滤器 function (单独做这个练习,询问你是否需要提示)。

Thanks for help!感谢帮助!

It did not work completely but it gave me the right idea of what to do.它没有完全工作,但它让我知道该怎么做。 I first set the sto to global variables as you said but I could not use the spread on savedLocalStorage it gave me the following message: enter image description here如您所说,我首先将 sto 设置为全局变量,但我无法在 savedLocalStorage 上使用传播它给了我以下消息:在此处输入图像描述

The garbage cans also started to jump out of sync.垃圾桶也开始不同步。

Not sure why it did not work as intended because I think the solution looked good.不知道为什么它没有按预期工作,因为我认为解决方案看起来不错。 Maybe the length of savedLocalStorage could not be null as of first when I only stored it in sto1, sto2, sto3, sto4 on window load.当我在 window 加载时仅将其存储在 sto1、sto2、sto3、sto4 中时,savedLocalStorage 的长度可能不能是 null。

I used the spread operator down here instead and then it seemed to work(also initialized sto1-2-3-4 as empty arrays also - that might have been a problem also): Working我在这里使用了扩展运算符,然后它似乎可以工作(也将 sto1-2-3-4 初始化为空 arrays - 这也可能是一个问题):

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM