reactjs - 使用 React 以嵌套菜单的形式显示数组响应
问题描述
我对 React 还很陌生,并且对一个非常小的问题感到困惑。我编写了一个 UI,它本质上调用了一个服务,该服务以数组的形式返回响应。现在,我需要以嵌套菜单的形式显示来自服务的响应。前面。g.,我的一个 axios 调用返回 [1,2,3,4] 的响应,而另一个 axios 调用返回 [1.1,1.2,1.3,..]。我希望这些响应以以下形式对齐
1
1.1
1.2
1.3
2
2.1
等等,我。e. UI 应该显示 1,2,3,4 .. 当用户点击 1 时,应该显示 1.1,1.2 等。
我正在为此使用 React、material-ui 的组件和 redux。我有一个功能来做上面提到的..但我不确定我是否做对了。
handleMenuData() {
var applist = this.props.menuData;
var appNames = [];
var moduleNames = [];
applist.forEach(app => {
app.moduleNames.forEach(module => {
try {
return axios.get(
'service url' + app.name + '/' + module,
);
} catch (error) {
console.error(error);
}
});
appNames.push({
name: app.name,
moduleNames: moduleNames,
});
moduleNames = [];
});
this.setState({
appNames: appNames,
});
}
在我的状态下,
this.state = {
appList: [],
appNames: [],
moduleNames: [],
};
应用程序名称是 1,2,3,模块名称是 1.1,1.2,我正在考虑使用 Material UI 中的 ListItemText 组件。
解决方案
我认为你在做什么是不正确的。axios.get 是一个异步函数,您无需等待来自服务器的响应。这就是为什么您将所有数组都设为空的原因。尝试调用这样的递归函数。
const getModuleNames = (i) => {
axios.get('service url' + applist[i].name + '/' + module)
.then((response) => {
if(i < applist.length){
applist[i].moduleNames = response.data;
appNames.push({
name: applist[i].name,
moduleNames: applist[i].moduleNames
});
getModuleNames(i++);
}
else {
// code you want to execute after adding data to appNames
}
}).catch((err) => {
// error handling
});
}
getModuleNames(0);
推荐阅读
- dart - 使用 Swift 和 Kotlin 重新创建 Flutter 的 ios 和 android 文件夹
- javascript - 关于不完整变量的 Javascript 警报
- cumulocity - 如何使用 azure devOps 自动将 Web 应用上传到 cumlocity
- javascript - 如何替换对象中键的值
- java - 无法导入 com.google.android.gms:play-services-ads:17.1.1
- kubernetes - 无法运行 kubeadm init
- php - 如何在 .net 核心应用程序中运行 PHP 应用程序
- javascript - 未捕获的 SyntaxError:使用 js 添加 onmouseclick 属性时出现意外标识符
- javascript - TypeError:无法设置未定义的属性“电子邮件”
- jquery - 如何解决 IE 10 + & IE Edge 闪烁滚动问题