React.js,如何正确使用map()函数显示数据?
React.js, how to properly use the map() function to display data?
我想在电子应用程序的一个页面中显示用户数据。我从 firebase/firestore 获取数据,然后将其放入数组中,然后,我想在 table 中显示该数据,但我无法在页面上显示数据。
这是我的代码:
function Home() {
const [allUsers] = useState([]);
useEffect(() => {
const fetchData = async () => {
try {
const querySnapshot = await getDocs(collection(db, 'users'));
let allDocs = [];
querySnapshot.forEach((doc) => {
allDocs.push({ ...doc.data(), id: doc.id });
});
for (const item of allDocs) {
allUsers.push(item);
}
} catch (err) {
console.log(err);
}
console.log(allUsers)
};
fetchData();
}, []);
return <div className="home">
{Object.keys(allUsers).map((keyName) => (
<p>{allUsers[keyName].firstname}</p>
))}
</div>;
}
数据如下:
您应该使用状态 setter 来更新 allUsers
。您正在改变数据(反 React 模式)。尝试这样做(我在代码中添加了注释):
function Home() {
const [allUsers, setAllUsers] = useState([]); // line I changed
useEffect(() => {
const fechedUsers =[]; // line I added
const fetchData = async () => {
try {
const querySnapshot = await getDocs(collection(db, 'users'));
let allDocs = [];
querySnapshot.forEach((doc) => {
allDocs.push({ ...doc.data(), id: doc.id });
});
for (const item of allDocs) {
fechedUsers.push(item);
}
} catch (err) {
console.log(err);
}
setAllUsers(fechedUsers) // line I added
};
fetchData();
}, []);
// lines I changed
return <div className="home">
{allUsers.map(user => <p>{user.firstname}</p>)}
</div>;
}
目前您使用 Object.keys()
映射数组。当您使用此函数时,您会收到一个数组,其中包含数组中的所有索引。因此,这意味着您将根据数据的长度获得一个包含数据 [0, 1, ... ]
的数组。
但是因为您使用数组,所以您可以立即映射数组中的所有对象。像这样:
return <div className="home">
{allUsers.map((user) => (
<p>{user.firstname}</p>
))}
</div>
用户变量将是您推入 allUsers 数组的对象。您还应该使用状态 setter,例如 useState
您不需要使用索引来迭代响应。当您使用 map 函数时,您可以访问作为 map 函数内部参数的索引,并可以在需要时使用它。
return (
<div className="home">
{allUsers.map((user, index) => {
return(
<div key={index} className='user-data'>
//if you're using a table might need to change the `p` tag with `td` inside a `tr`
<p>{user.firstname} </p>
</div>
)
}
)}
</div>);
我想在电子应用程序的一个页面中显示用户数据。我从 firebase/firestore 获取数据,然后将其放入数组中,然后,我想在 table 中显示该数据,但我无法在页面上显示数据。
这是我的代码:
function Home() {
const [allUsers] = useState([]);
useEffect(() => {
const fetchData = async () => {
try {
const querySnapshot = await getDocs(collection(db, 'users'));
let allDocs = [];
querySnapshot.forEach((doc) => {
allDocs.push({ ...doc.data(), id: doc.id });
});
for (const item of allDocs) {
allUsers.push(item);
}
} catch (err) {
console.log(err);
}
console.log(allUsers)
};
fetchData();
}, []);
return <div className="home">
{Object.keys(allUsers).map((keyName) => (
<p>{allUsers[keyName].firstname}</p>
))}
</div>;
}
数据如下:
您应该使用状态 setter 来更新 allUsers
。您正在改变数据(反 React 模式)。尝试这样做(我在代码中添加了注释):
function Home() {
const [allUsers, setAllUsers] = useState([]); // line I changed
useEffect(() => {
const fechedUsers =[]; // line I added
const fetchData = async () => {
try {
const querySnapshot = await getDocs(collection(db, 'users'));
let allDocs = [];
querySnapshot.forEach((doc) => {
allDocs.push({ ...doc.data(), id: doc.id });
});
for (const item of allDocs) {
fechedUsers.push(item);
}
} catch (err) {
console.log(err);
}
setAllUsers(fechedUsers) // line I added
};
fetchData();
}, []);
// lines I changed
return <div className="home">
{allUsers.map(user => <p>{user.firstname}</p>)}
</div>;
}
目前您使用 Object.keys()
映射数组。当您使用此函数时,您会收到一个数组,其中包含数组中的所有索引。因此,这意味着您将根据数据的长度获得一个包含数据 [0, 1, ... ]
的数组。
但是因为您使用数组,所以您可以立即映射数组中的所有对象。像这样:
return <div className="home">
{allUsers.map((user) => (
<p>{user.firstname}</p>
))}
</div>
用户变量将是您推入 allUsers 数组的对象。您还应该使用状态 setter,例如 useState
您不需要使用索引来迭代响应。当您使用 map 函数时,您可以访问作为 map 函数内部参数的索引,并可以在需要时使用它。
return (
<div className="home">
{allUsers.map((user, index) => {
return(
<div key={index} className='user-data'>
//if you're using a table might need to change the `p` tag with `td` inside a `tr`
<p>{user.firstname} </p>
</div>
)
}
)}
</div>);