我有一个React应用程序,该应用程序从json文件中获取产品,顶部有2个按钮,每个按钮将显示另一个json / menuitems,因此,与某些json即时通讯一起使用的类别为空,该应用程序崩溃了,我想要什么只要有条件循环,只要条件不会崩溃,它就会跳过该类别或显示为空。
您可以在应用程序中单击菜单2时看到它崩溃。
这是实时代码段:https://codesandbox.io/embed/j29k59x4ly?fontsize=14
这是ItemList.js第139> 149行中的映射函数本身
{activelist.children[this.state.selected].children.map(
(item, index) => (
<Item
className="person"
key={index}
Title={item.name}
onClick={this.handleClick}
index={index}
/>
)
)}
答案 0 :(得分:0)
我在第123
和124
行发现了该错误
const selectedChild = activelist.children[this.state.selected];
const selectedItem = selectedChild.children[this.state.itemSelected];
selectedChild
的数据是类别的集合,但是第一项没有children
属性,然后使selectcedChild.children
得到undefined
并引起问题。
[
{
name: "Empty Category"
type: "category", //<-- No `children` attribute
}, {
children: [{…}, {…}, {…}]
name: "Burgers"
type: "category"
}, {
children: (2) [{…}, {…}]
name: "Sets"
type: "category"
}
]
我的解决方法是:
selectedChild
具有children
属性的所有项目。 children: []
(无数据案例)。return
没有子代的消息。为了防止获取undefined
const selectedChild = activelist.children[this.state.selected];
if (!selectedChild.children) return <span>Out of stock...</span> // handle issue here
const selectedItem = selectedChild.children[this.state.itemSelected];
答案 1 :(得分:0)
调试后。我发现您的2个API返回的格式不同。 this.state.items
的API响应均具有children
属性。 this.state.items2
的第二个项目的第一项没有children
属性。
您可以在items2
函数中将setState
的数据响应格式设置为Active2
之前。
这样就可以解决问题。
Active2() {
/* This is the way you clone a nested object. You can read here:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Deep_Clone */
let newActivelist = JSON.parse(JSON.stringify(this.state.items2))
// Filter item has children only (remvoe "Empty Category")
let newChildren = this.state.items2.children.filter(item => item.children)
// Mutation new activelist
newActivelist.children = newChildren
this.setState({ activelist: newActivelist}); //CHANGED
}
克隆_.cloneDeep()库的lodash的另一种克隆对象的方法
import _ from 'lodash'
let newActivelist = _.cloneDeep(this.state.items2)