質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

604閲覧

javaScriptで制作したToDoアプリをlocalストレージで管理したい

uratarosu

総合スコア49

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/12/27 01:00

編集2022/02/25 07:09

前提・実現したいこと

javaScriptでHTML上ではToDOアプリが完成しました。
ストレージに入れて管理する際に、追加ボタンを押したらストレージにpushして、削除ボタンを押したらspliceしたいです。
pushで1個ずつ入れることはできてもspliceの際に、該当のデータと紐づけすることができませんでした。
HTML上とストレージが同じになるようにしたいです。

発生している問題・エラーメッセージ

spliceに与えるデータとして、data.indexなどとしてみましたが
定義されていない、undefindなどが出てきます。

該当のソースコード

HTML

1<!DOCTYPE html> 2<html> 3 <head> 4 <title>To Do アプリ</title> 5 <link rel="stylesheet" href="src/styles.css"> 6 <meta charset="UTF-8" /> 7 </head> 8 9 <body> 10 <div class="input-area"> 11 <input id="add-text" type="text" placeholder="TODOを入力"> 12 <button id = "add-button">追加</button> 13 </div> 14 15 <div class="imcomplete-area"> 16 <p class="title">未完了のTODOです</p> 17 <div id="imcomplete-list"> 18 <ul> 19 20 </ul> 21 </div> 22 </div> 23 <div class="complete-area"> 24 <p class="title">完了したTODO</p> 25 <div id="complete-list"> 26 <ul> 27 28 </ul> 29 </div> 30 </div> 31 32 <script src="src/index.js"></script> 33 </body> 34</html> 35
import "./styles.css"; const onClickAdd = () => { // テキストを取得 const inputText = document.getElementById("add-text").value; document.getElementById("add-text").value = ""; creteIncompleteList(inputText); addStrage(); } // 未完了リストに追加する関数 const creteIncompleteList = (text) => { // divタグの生成 const div = document.createElement("div"); div.className = "list-row"; // liタグの生成 const li = document.createElement("li"); li.innerText = text // divタグの子要素にliを設定 div.appendChild(li); //未完了のリストに追加 document.getElementById("imcomplete-list").appendChild(div); // button(完了)タグを生成 const completeButton = document.createElement("button"); completeButton.innerText = "完了"; completeButton.addEventListener("click", ()=>{ // 押された完了ボタンの親divを未完了リストから削除 deleteFromCompleteButton(completeButton.parentNode); deleteStrage(); //完了リストに追加 const addTarget = completeButton.parentNode; //TODO内容のテキストの取得 const text = addTarget.firstElementChild.innerText; //div以下を初期化 addTarget.textContent = null; // liを生成 const li = document.createElement("li"); li.innerText = text; // 戻るボタン const backButton = document.createElement("button") backButton.innerText = "戻す"; // // backButtonにイベントを追加 backButton.addEventListener("click",()=>{ const backTarget = backButton.parentNode; const text = backTarget.firstChild.innerText; // 削除 document.getElementById("complete-list").removeChild(backTarget); creteIncompleteList(text); }) const IncompleteButton = document.createElement("button"); IncompleteButton.innerText ="削除"; // backButtonにイベントを追加 IncompleteButton.addEventListener("click",()=>{ // 削除 document.getElementById("complete-list").removeChild(IncompleteButton.parentNode); }) // divタグの子要素に各要路を追加 addTarget.appendChild(li); addTarget.appendChild(backButton); addTarget.appendChild(IncompleteButton); //完了のリストに追加 document.getElementById("complete-list").appendChild(addTarget); }) const deleteButton = document.createElement("button"); deleteButton.innerText = "削除"; deleteButton.addEventListener("click", ()=>{ // 押された削除ボタンの親divを未完了リストから削除 deleteFromCompleteButton(deleteButton.parentNode); }) div.appendChild(completeButton); div.appendChild(deleteButton); }; // 未完了リストから指定の要素を削除 const deleteFromCompleteButton = (target)=>{ document.getElementById("imcomplete-list").removeChild(target); } document.getElementById("add-button").addEventListener("click", () => onClickAdd()); function getStrage() { let list = localStorage.getItem("TodoList"); if (list === null) { return []; } else { return JSON.parse(list); } } function addStrage(item) { let list = getStrage(); list.push(item); setLocal(list); } function deleteStrage(index) { let list = getStrage(); list.splice(index, 1); localStorage.setItem("TodoList", JSON.stringify(list)); } function setStrage(list) { localStorage.setItem("TodoList", JSON.stringify(list)); }

試したこと

deleteStrage()の引数を与えるために
forで回してdata-indexの値を取得して、
data.indexで値を取得できればと考えましたが、undefindや定義されてないと出ていきます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/12/27 02:29

「ストレージ」という曖昧な言葉は使わないほうがよいでしょう localStorageなら文書中もそう書いてください
guest

回答1

0

ベストアンサー

とりあえず完了/未完了は割愛しこんな感じで

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const data=localStorage.data?JSON.parse(localStorage.data):[]; 4 const add=document.querySelector('#add-text'); 5 const viewData=()=>{ 6 const ul=document.querySelector('#list ul'); 7 ul.innerHTML=""; 8 data.map(x=>[ 9 document.createTextNode(x), 10 Object.assign(document.createElement('input'),{type:'button',value:'del',className:'del'}), 11 ].reduce((x,y)=>(x.appendChild(y),x),document.createElement('li'))).forEach(x=>ul.appendChild(x)); 12 } 13 viewData(); 14 document.addEventListener('click',e=>{ 15 const t=e.target; 16 if(t.closest('.del')){ 17 const idx=[...document.querySelectorAll('.del')].indexOf(t); 18 data.splice(idx,1); 19 } 20 if(add.value!=="" && t.id=='add-button'){ 21 data.push(add.value); 22 } 23 if(t instanceof HTMLInputElement){ 24 localStorage.data=JSON.stringify(data); 25 viewData(); 26 } 27 }); 28}); 29</script> 30<input id="add-text" type="text" placeholder="TODOを入力"> 31<input type="button" id="add-button" value="追加"> 32<div id="list"> 33<ul></ul> 34</div>

※viewData()の引数を毎回渡すのも無駄でしたので調整しました

投稿2021/12/27 03:43

編集2021/12/27 05:04
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uratarosu

2021/12/27 04:52

早急にお返事いただきありがとうございます。ストレージではなくLocal Storageの記述に関してもご指摘ありがとうございます。 ifで分岐することやmap関数を使用する所は思いもつかなかったです。 一度これですすめてみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問