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

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

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

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

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

JavaScript

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

React.js

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

Q&A

解決済

1回答

1499閲覧

解決できる方いません!firebase と Reactでtodoアプリを作成していますが、アイテムの削除ができません。

suzukitoshinari

総合スコア6

Firebase

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

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2021/04/06 06:52

編集2021/04/06 23:31

現在、firebaseとreactでtodoアプリを作成していますが、削除ボタンを押してアイテムを削除する機能の実装ができません。

エラーの内容は、deleteボタンを押すとid is not defined というエラーが出ます。

以下がコードになります。

よろしくお願いします。

import React, { useState, useEffect } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import { TextField, List, ListItem, Checkbox, Button } from '@material-ui/core'; import AudiotrackIcon from '@material-ui/icons/Audiotrack'; import AddBox from '@material-ui/icons/Add'; // import { v4 as uuidv4 } from 'uuid'; import { db } from '../../firebase'; import firebase 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 }, }); const StickyTable = () => { const classes = useStyles(); const [items, setItems] = useState([]), [newWord, setNewWord] = useState(''), [newMeaning, setNewMeaning] = useState(''); useEffect (() => { const unSub = db.collection("todo").orderBy('timestamp', 'desc').onSnapshot((snapshot) => { setItems( snapshot.docs.map((doc) => ({id: doc.id, word: doc.data().word, meaning: doc.data().meaning, isCompleted: doc.data().isCompleted})) // snapshot.docs.map((doc) => ({id: doc.id, item: doc.data().item, isCompleted: doc.data().isCompleted})) ); }); return () => unSub(); }, []); const handleNewWord = (e) => { setNewWord(e.target.value); // setItems(e.target.value); } const handleNewMeaning = (e) => { setNewMeaning(e.target.value); // setItems(e.target.value); }; const onClickAdd = () => { if (newWord === '' || newMeaning === '') { alert('単語と意味の両方を入力してください。'); return; } else if(newWord.match(/[^A-Za-z0-9]+/)) { alert('英語で入力してください。'); return; } else { handleAddWord(); } } const handleAddWord = () => { db.collection("todo").add({word: newWord, meaning: newMeaning, isCompleted: false, timestamp: firebase.firestore.FieldValue.serverTimestamp() }) .then((doc) => { console.log(`追加に成功しました (${doc.id})`); }) .catch((error) => { console.log(`追加に失敗しました (${error})`); }); setNewWord(''); setNewMeaning(''); }; const onClickDelete = () => { db.collection("todo").doc(id).delete(); // db.collection("todo").get().then(function(snapshot){ // snapshot.forEach(function(doc){ // db.collection("todo").doc(doc.id).delete(); // }) // }) }; // function toggleInProgress() { // db.collection("todo").doc(id).update({ // isCompleted: !isCompleted, // }); // } 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 disabled={!newWord|!newMeaning} type='button' onClick={onClickAdd}> <AddBox /> </Button> <div> {items.length} 単語 </div> </form> <div className={classes.container}> <List component='ul' className={classes.list} > {items.map((item) => ( <ListItem key={item.word} component='li' className={classes.item}> <Button onClick={onClickDelete()}> x </Button> {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.meaning} component='li' className={classes.item}> {item.meaning} </ListItem> ))} </List> </div> </div> </> ); } export default StickyTable;

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの内容は、deleteボタンを押すとid is not defined というエラーが出ます。

エラーの通り「どのidのレコードを削除するか」が明示されていないからです。
onClickDeleteの引数にidを追加して、実行側で渡すようにしてあげれば解消されるかと思います。

投稿2021/04/06 06:56

nekoniki

総合スコア2411

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

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

suzukitoshinari

2021/04/06 07:43

このidの追加の仕方が調べてもわからなくて困っています。 具体的に教えていただけますか?お願いします!!
nekoniki

2021/04/07 00:34

<Button onClick={onClickDelete()}> ↑これを <Button onClick={() => { onClickDelete(item.id) }}> こう直して渡す形式はどうでしょう?
suzukitoshinari

2021/04/07 01:15

返信ありがとうございます。 やはり、 const onClickDelete = () => { db.collection("todo").doc(id).delete(); ←ここの部分のidがundefinedとエラーが出てしまいます。 }; ここの部分でずっとつまずいてます。
nekoniki

2021/04/07 01:59

すいません忘れてました。 const onClickDelete = () => { を const onClickDelete = (id) => { にする必要があります。
suzukitoshinari

2021/04/07 02:12

できたーーー! ありがとうございます!!! フォローしました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問