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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

1232閲覧

firebaseのデータの削除ができない。

suzukitoshinari

総合スコア6

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/03/22 22:06

ただいま、reactとfirebaseを使って、todoアプリを作成しています。
チェックボックスにチェックを入れたtodoを削除したいのですができません。
いろいろ調べたのですが、思うような対処外できなかったので、質問させていただきます。

以下がコードになります。
よろしくお願いします。
緑の//は実際のコードではコメントアウトしています。

import React, { useState, useEffect } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import { TextField, List, ListItem, Checkbox } from '@material-ui/core'; import AudiotrackIcon from '@material-ui/icons/Audiotrack'; import AddBox from '@material-ui/icons/Add'; import DeleteForeverIcon from '@material-ui/icons/DeleteForever'; import { v4 as uuidv4 } from 'uuid'; import { db } from '../../firebase'; const useStyles = makeStyles({ root: { width: '100%', }, modal: { display: 'flex', alignItems: 'center', justifyContent: 'center', }, paper: { backgroundColor: 'white', border: '2px solid #000', boxShadow: 5, padding: 3 }, btn: { width: '100%' }, main: { width: '70%', height: '70%' }, list: { width: '80%', padding: 0, backgroundColor: 'white', border: '1px solid black' }, container: { display: 'flex', }, item: { borderBottom: '1px solid black', height: 40 }, // check: { // marginRight: 20 // }, // .app__logout { // cursor: pointer; // background-color: transparent; // border: none; // outline: none; // color: dimgray; // margin-left: 10px; // } }); const StickyTable = (props) => { const classes = useStyles(); const [items, setItems] = useState([]), [newWord, setNewWord] = useState(''), [newMeaning, setNewMeaning] = useState(''); // useEffect(() => { // (async () => { // const resTodo = await db.collection("e-todo").doc("rrYNojj9IQaczCNVeLSc").get(); // setItems(resTodo.data().items); // // const resFinishedTodo = await db.collection("e-todo").doc("w3werKruvoimxVN64d3P").get(); // })() // }, [db]) useEffect (() => { const unSub = db.collection('e-todo').onSnapshot((snapshot) => { setItems( snapshot.docs.map((doc) => ({id: doc.id, word: doc.data().word, meaning: doc.data().meaning, isCompleted: doc.data().isCompleted})) ); }); return () => unSub(); }, []); const handleNewWord = (e) => { setNewWord(e.target.value); } const handleNewMeaning = (e) => { setNewMeaning(e.target.value); }; const onClickAdd = () => { if (newWord === '' || newMeaning === '') { alert('単語と意味の両方を入力してください。'); return; } else if(newWord.match(/[^A-Za-z0-9]+/)) { alert('英語で入力してください。'); return; } else { handleAddWord(); } } // const handleAddWord = () => { // setItems([...items, { // id: uuidv4(), word: newWord, meaning: newMeaning, isCompleted: false // }]); // setNewWord(''); // setNewMeaning(''); // } const handleAddWord = () => { db.collection("e-todo").add({id: uuidv4(), word: newWord, meaning: newMeaning, isCompleted: false }); setNewWord(''); setNewMeaning(''); }; // const onClickDelete = () => { // setItems(items.filter((item) => !item.isCompleted)); // } const onClickDelete = () => { db.collection("e-todo").doc(id).delete(); }; const toggleCompleted = (id) => { setItems(items.map(item => { if (item.id === id) { return {...item, isCompleted: !item.isCompleted} } return item })); } const speak = (setNewWord) => { let options = new SpeechSynthesisUtterance(setNewWord); options.lang = 'en-US'; speechSynthesis.speak(options); console.log('options') }; return ( <> <div className={classes.main}> <form className={classes.paper} autoComplete='off'> <TextField label='単語' value={newWord} onChange={handleNewWord}/> <TextField label='意味' value={newMeaning} onChange={handleNewMeaning}/> <button type='button' onClick={onClickAdd}> <AddBox /> </button> <button type='button' onClick={onClickDelete}> <DeleteForeverIcon /> </button> <div> {items.length} items </div> </form> <div className={classes.container}> <List component='ul' className={classes.list} > {items.map((item) => ( <ListItem key={item.id} component='li' className={classes.item}> {items.length} <Checkbox // className={classes.check} color="primary" inputProps={{ 'aria-label': 'secondary checkbox' }} onClick={e => toggleCompleted(item.id)} value={item.isCompleted} /> {item.word} <button type='button' onClick={() => speak(item.word)}> <AudiotrackIcon fontSize='small'/> </button> </ListItem> ))} </List> <List component='ul' className={classes.list}> {items.map((item) => ( <ListItem key={item.id} component='li' className={classes.item}> {item.meaning} </ListItem> ))} </List> </div> </div> </> ); } export default StickyTable;

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

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

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

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

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

hoshi-takanori

2021/03/23 00:02

onClickDelete の id が現在は不明な値になってますが、チェックした項目の id それぞれに対して delete する必要があるのでは。
suzukitoshinari

2021/04/01 20:19

すみません、それができなくて困ってます。
guest

回答1

0

チェックしたアイテムのidを使って削除すればOKです
items.filter(item => item.isCompleted).map(item => item.id)
チェックしたidの配列で順次削除です

投稿2021/04/05 07:43

komasan1

総合スコア257

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問