繁体   English   中英

使用反应将文件上传到 firebase-firestore

[英]uploading files to firebase-firestore with react

因此,我使用 React 应用程序设置了 Firebase,并尝试解决其 Firestore 云数据库的问题。 我想要做的是允许用户通过输入表单从他们的设备上传歌曲,然后这些歌曲存储在云 Firestore 数据库中,然后这些文件在列表中呈现,这就是代码。

import React, {useState, useEffect} from 'react';
import LoggedNav from './navLogged';
import db from '../firebase'

const SongListUI = () => {

    const [songs, setSongs] = useState([])
    const [oneSong, setSong] = useState('')
    const [Artist, setArtist] = useState('')
    const [src, setSrc] = useState('')


    const handleSubmit = (e) =>{
        e.preventDefault()

        let songbase = db.collection('Songs')
        let data = {oneSong, Artist, src}

        songbase
            .add(data);

        songbase.onSnapshot(snapshot =>{
            snapshot.docChanges().forEach(change =>{ 
                setSongs({title: change.doc.data().oneSong, aritst:change.doc.data().Artist, source: change.doc.data().src})
            })
        })
    }



    return ( 
        <div className="hi">

            <div>
                <LoggedNav />
            </div>
            <div>
                {
                    songs.map(song =>{
                        return(
                            <div key={song.id}>
                                <h4>{song.title}</h4>
                                <audio controls>
                                    <source src={song.source} type="audio/mpeg" />
                                </audio>
                                <h3>{song.artist}</h3>
                            </div>
                        )
                    })
                }
            </div>

            <div>
                <form onSubmit={handleSubmit}>
                    <label>addSong</label>
                    <input type="text" value={oneSong} onChange={(e) => setSong(e.target.value)}/>
                    <input type="text" value={Artist} onChange={(e) => setArtist(e.target.value)}/>
                    <input type="file" value={src} onChange={(e) => setSrc(e.target.value)}/>
                    <input type="submit" value="Add a Song"/>
                </form>
            </div>



        </div>
     );
}

export default SongListUI;

因此,当我输入歌曲并提交时,我收到一条错误消息,指出 TypeError: songs.map is not a function

尽管歌曲实际上已上传到数据库! 任何帮助解释,我该怎么做才能开始工作? 谢谢。

问题是,歌曲不是数组,所以它没有地图功能。 当你调用 setSongs 时,你用一个对象作为参数来调用它。 你应该用一个数组来调用它。 像这样的东西:

    songbase.onSnapshot(snapshot =>{
        const songs = [];
        snapshot.docChanges().forEach(change =>{ 
            songs.push({title: change.doc.data().oneSong, aritst:change.doc.data().Artist, source: change.doc.data().src})
        })
        setSongs(songs);
    })

暂无
暂无

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

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