firebase 在onClick事件上删除文档不起作用

olmpazwi  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(146)

我正在制作一个聊天应用程序,并尝试实现一个函数,该函数可删除onClick事件中的已单击消息,但我收到错误“index.esm2017.js:1032 Uncaught(in promise)TypeError:无法读取undefined(阅读'indexOf')"的属性。我正在为数据库使用firebase。有人能看看我的代码有什么问题吗?谢谢。

const [messages, setMessages] = useState([]);
const adminUid = "";

    useEffect(() => {
        const colRef = collection(db, "messages");
        const colRefOrdered = query(colRef, orderBy("createdAt"));

        onSnapshot(colRefOrdered, (snapshot) => {
            setMessages(
                snapshot.docs.map((doc) => {
                    return {
                        id: doc.id,
                        message: doc.data()
                    };
                })
            )
        })
    })

    const deleteHandle = async() => {
        const docRef = doc(db, "messages", messages.id);
        await deleteDoc(docRef);
    }

    if (adminUid === auth.currentUser.uid) {
        return (
            <div className="Chatroom">
                <div className="chatsChatroom">
                    {messages.map(({ message, id }) => (
                        <div>
                            <div key={id}
                                className={`msg ${message.uid === auth.currentUser.uid ? "sent" : "received"}`}>
                                <img src={message.photoURL} className="senderProfilePicture" />
                                <div className="senderName">
                                    <p> {message.displayName} </p>
                                </div>
                                <div className="text">
                                    <p> {message.text} </p>
                                </div>
                                <div className="deleteChat">
                                    <h3 onClick={deleteHandle}> Delete </h3>
                                </div>
                            </div>
                        </div>
                    ))}
                </div>

                <SendMessage />
            </div>
        )
    }
2vuwiymt

2vuwiymt1#

出现此错误的原因是messages.id的值可能未定义,这是因为您试图访问整个messages数组的键id。您需要的只是要删除的消息的id
当你Mapmessages数组来显示每一条消息时,你的message对象必须有一个键id。你需要把这个值传递给你的deleteHandle方法:

<div className="deleteChat">
    <h3 onClick={() => deleteHandle(id)}> Delete </h3>
</div>

在此之后,您需要接受函数参数中的message.id值:

const deleteHandle = async(msgId) => {
 docRef = doc(db, "messages", msgId);
 deleteDoc(docRef);
}

这只会传递您要删除的消息的ID,希望这对您有所帮助。如果有帮助,请接受这个答案!谢谢

相关问题