【发布时间】:2021-07-09 03:51:01
【问题描述】:
在 JSX 中映射数组时,我试图以某种方式显示一些 html 元素。我希望它是这样的:
标题
链接
标题
链接
但是当我尝试时,我总是以这样的方式结束它:
标题
标题
链接
链接
这就是数组的结构。
在我的代码中,这就是我映射数组的方式。
{audioInfo.map((item, index) => {
return ( <div key={index}>
<div>{item.filename[0].name}</div>
{
item.url.map((u,i)=>(
<div key={i}>
<audio controls src={u}> </audio>
</div>
))
}
</div> )
})}
这是我遇到问题的部分。
item.filename[0].name
这只会获取第一个文件名,但我不确定如何迭代到下一个文件名,同时仍然像我想要的那样呈现 html。在每次映射迭代中,它应该与filename 和url 成对出现。我希望这是有道理的。
完整代码:
import React, { useState, useEffect, useRef } from 'react';
import firebase from "firebase/app";
import storage from "firebase/storage";
import firebaseConfig from "../dropzone/config";
import {
BrowserRouter as Router,
Switch,
Route,
Link,
useRouteMatch,
BrowserRouter,
useParams
} from "react-router-dom";
import { isElement } from 'react-dom/test-utils';
if (!firebase.apps.length) {
firebase.initializeApp(firebaseConfig);
}else {
firebase.app(); // if already initialized, use that one
}
// router is getting the current path name
const FolderPage = () => {
let {folder} = useParams();
let fb_storage = firebase.storage();
let storageRef = fb_storage.ref();
let rootRef = storageRef.child(folder);
const [files, setFiles] = useState([]);
const [audioInfo, setAudioInfo] = useState([]);
const fileNames = () =>{
let temp = [];
rootRef.listAll().then( function(res) {
let promises = res.items.map(item => item.getDownloadURL());
Promise.all(promises).then((downloadURLs)=>{
setAudioInfo([
{
filename:res.items,
url: downloadURLs
}
])
})
}).catch(function(error) {
});
}
useEffect(()=>{
fileNames();
},[])
console.log(audioInfo)
return (
<>
<div>hello {folder}</div>
<div>
{audioInfo.map((item, index) => {
return ( <div key={index}>
<div>{item.filename[0].name}</div>
{
item.url.map((u,i)=>(
<div key={i}>
<span>{u.name}</span>
<audio controls src={u}> </audio>
</div>
))
}
</div> )
})}
</div>
</>
)
}
export default FolderPage
【问题讨论】:
-
res.items是一堆未解决的承诺。为什么将文件名设置为res.items?
标签: javascript reactjs firebase iteration jsx