getTests()
- это асинхронная функция c, которая всегда будет возвращать объект обещания. React жалуется, потому что вы передаете объект обещания методу рендеринга.
Вы можете сохранить ответ API в состоянии и установить состояние в методе getTests
. React обновит ui
при обновлении состояния.
Несколько изменений в коде.
- Создание состояния
- Запуск метода
getTests()
in componentDidMount
. - L oop над значениями в методе рендеринга.
Пример:
class Tests extends React.Component {
constructor(props) {
super(props);
this.state = {
buttons: []
}
}
async getTests() {
var url = "http://127.0.0.1:100/getTestList"
var buttons = [];
const resp = await fetch(url);
const data = await resp.json();
for (let pkg in data) {
console.log(pkg);
for (let cls in data[pkg]) {
console.log(cls);
for (var i = 0; i < data[pkg][cls].length; i++) {
let m = data[pkg][cls][i];
buttons.push({ value: cls, displayName: m });
}
}
}
this.setState( () => {
return {
buttons
}
});
}
async componentDidMount() {
await getTests();
}
render() {
return (
<div>
<h4>Using .map()</h4>
{this.state.buttons.map(button => <button key={button.value} value={button.value}>{button.displayName}</button>) }
</div>
)
}
}//fine classe
// ========================================
ReactDOM.render(
<Tests />,
document.getElementById('root')
);
Или вы можете использовать функционал компонент для этого.
const ButtonGroup = () => {
const [buttons, setButtons] = useState([]);
useEffect(() => {
await getTests();
}, []);
async function getTests() {
const url = 'http://127.0.0.1:100/getTestList';
const resp = await fetch(url);
const data = await resp.json();
const buttonData = [];
for (let pkg in data) {
for (let cls in data[pkg]) {
for (var i = 0; i < data[pkg][cls].length; i++) {
let m = data[pkg][cls][i];
buttonData.push({ value: cls, displayName: m });
}
}
}
setButtons(buttonData);
}
return (
<div>
<h4>Using.map()</h4>
{buttons.map(button =>
(
<button key={button.value} value={button.value}>{button.displayName}</button>
)
)}
</div>
);
}
export default ButtonGroup;