这是我第一次从 API 获取数据,而且我对 React 还是很陌生。如果有人可以提供帮助,将不胜感激!
我无法访问表格行中的某些数据。我正在尝试通过单击该行来访问 name 属性。我想要的是通过单击特定行来复制名称属性。
此外,我useEffect一直在不停地获取数据。我试图更改依赖项,但无论我做什么,它都会继续这样做。我通过单击按钮将端点传递给 API。
另一件事是,当我获取数据时,我想访问数组成员的每个索引,但我尝试过但无法弄清楚。所以我只访问index[1](resp.guild.members[1].characters)。
我的代码:
import React, { useState, useEffect } from "react";
const Tabledata = ({ guildName }) => {
const [members, setMembers] = useState([]);
const [membersOnline, setMembersOnline] = useState([]);
useEffect(() => {
fetch(`https://api.tibiadata.com/v2/guild/${guildName}.json`)
.then((res) => res.json())
.then((resp) => {
console.log(resp);
setMembers(resp.guild.members[1].characters);
setMembersOnline(() =>
members.filter((player) => player.status !== "offline")
);
})
.catch((err) => console.log(err));
}, [members, guildName]);
return (
<div className="container">
<h1>Enemies Online</h1>
<table className="table table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Level</th>
<th>Vocation</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{membersOnline.map((d, id) => (
<tr
key={d.id}
onClick={(e) => {
console.log(this.d.name);
navigator.clipboard.writeText(`exiva "${e.target.value}`);
}}
>
<td>{d.name}</td>
<td>{d.level}</td>
<td>{d.vocation}</td>
<td>{d.status}</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default Tabledata;
代码工作:
import React, { useState, useEffect } from "react";
const Tabledata = ({ guildName }) => {
// const [members, setMembers] = useState([]);
const [membersOnline, setMembersOnline] = useState([]);
const [header, setHeader] = useState("");
useEffect(() => {
fetch(`https://api.tibiadata.com/v2/guild/${guildName}.json`)
.then((res) => res.json())
.then((resp) => {
const members = resp.guild;
setHeader(resp.guild.data.name);
const allCharacters = members.reduce((accum, iter) => {
accum.push(...iter.characters);
return accum;
}, []);
console.log(members);
console.log(allCharacters);
setMembersOnline(() =>
allCharacters.filter((player) => player.status !== "offline")
);
})
.catch((err) => console.log(err));
}, [guildName]);
return (
<div className="container">
<h1>{header}</h1>
<table className="table table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Level</th>
<th>Vocation</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{membersOnline.map((d) => (
<tr
key={d.id}
onClick={(e) => {
navigator.clipboard.writeText(
`exiva "${e.currentTarget.children[0].innerText}`
);
}}
>
<td>{d.name}</td>
<td>{d.level}</td>
<td>{d.vocation}</td>
<td>{d.status}</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default Tabledata;
但是,如果我尝试以某种方式将 resp.guild 分配给成员,则 reduce 将不起作用..像这样:
import React, { useState, useEffect } from "react";
const Tabledata = ({ guildName }) => {
const [members, setMembers] = useState([]);
const [membersOnline, setMembersOnline] = useState([]);
useEffect(() => {
fetch(`https://api.tibiadata.com/v2/guild/${guildName}.json`)
.then((res) => res.json())
.then((resp) => {
setMembers(resp.guild);
setHeader(resp.guild.data.name);
const allCharacters = members.reduce((accum, iter) => {
accum.push(...iter.characters);
return accum;
}, []);
setMembersOnline(() =>
allCharacters.filter((player) => player.status !== "offline")
);
})
.catch((err) => console.log(err));
}, [members, guildName]);
return (
<div className="container">
<h1>Enemies Online</h1>
<table className="table table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Level</th>
<th>Vocation</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{membersOnline.map((d, id) => (
<tr
key={d.id}
onClick={(e) => {
console.log(this.d.name);
navigator.clipboard.writeText(
`exiva "${e.target.value.innerText}`
);
}}
>
<td>{d.name}</td>
<td>{d.level}</td>
<td>{d.vocation}</td>
<td>{d.status}</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default Tabledata;
它会在reduce处抛出一个异常,说它不是一个函数