reactjs - React 组件:出现语法错误:尝试将函数添加到我的代码时无法读取未定义的属性(读取“地图”)(0:未定义)
问题描述
当我尝试向我的代码中添加新函数时,出现此错误:语法错误:无法读取未定义的属性(读取“地图”)(0:未定义)
我创建另一个文件,然后尝试查找导致问题的部分在哪里?
这是我运行的代码:
import TreeView from '@mui/lab/TreeView';
import TreeItem from '@mui/lab/TreeItem';
import * as React from 'react';
import { Component } from 'react';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import ChevronRightIcon from '@mui/icons-material/ChevronRight';
interface IProps {
}
class TreeNodeInfo {
Children: TreeNodeInfo[];
HasChildren: boolean;
NodeID: string;
NodeType: string;
Status: string;
Text: string;
}
interface IState {
TreeRoot?: TreeNodeInfo;
Controllers: [];
Loading: boolean;
LoginToken?: string;
}
export class FetchData extends Component<IProps, IState>{
static DisplayName = FetchData.Name;
constructor(props: IProps) {
super(props);
this.state = { TreeRoot: null, Controllers: null, Loading: true, LoginToken: null };
}
componentDidMount() {
this.PopulateData();
}
async PopulateData() {
const loginResponse = await fetch('Ajax/Login', {
body: JSON.stringify({ User: "Test", Password: "Test!234!!", Customer: "bacsoft"
}),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
method: "post",
});
var loginToken = await loginResponse.json();
this.setState({ ...this.state, LoginToken: loginToken });
var tree = await this.get('Ajax/tree?depth=2');
var controllers = await this.get('Ajax/controllers');
this.setState({ TreeRoot: tree.Root, Controllers: controllers, Loading: false });
}
// TODO: need to handle session
async get(url: string): Promise<any> {
var response = await fetch(url, {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Bacsoft-Login': this.state.LoginToken
},
});
if (response.ok) {
return await response.json();
} else {
throw new Error(response.statusText);
}
}
render() {
if (this.state.Loading) {
return (<p>Loading... </p>);
}
else {
var TreeData = this.state.TreeRoot;
var ControllersData = this.state.Controllers;
const renderTree = (nodes: TreeNodeInfo) => (
<TreeItem nodeId={nodes.NodeID} label={nodes.Text}>
{Array.isArray(nodes.Children)
? nodes.Children.map((node) => renderTree(node))
: null}
</TreeItem>
);
const renderTreeNewLevel = async (nodes: TreeNodeInfo) => {
if (nodes.HasChildren == true) {
//var nextLevel = await this.readTree(nodes.NodeID, 2);
<div>{renderTree(nodes)}</div>
}
else {
null
}
}
return (
<TreeView
aria-label="rich object"
defaultCollapseIcon={<ExpandMoreIcon />}
defaultExpanded={['root']}
defaultExpandIcon={<ChevronRightIcon />}
sx={{ height: 840, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }}
>
{renderTree(TreeData)}
</TreeView>
);
}
当我尝试添加功能甚至像这样的功能时,我收到错误:
test(){
return true;
}
解决方案
该错误意味着无法访问nodes
它undefined
的道具。Children
您将为此添加一个检查或使用可选的链接运算符?
:
const renderTree = (nodes: TreeNodeInfo) => (
<TreeItem nodeId={nodes.NodeID} label={nodes.Text}>
{Array.isArray(nodes?.Children) ? nodes.Children.map((node) => renderTree(node)) : null}
</TreeItem>
);
推荐阅读
- windows - WinMerge:如何递归地比较文件夹名称和文件名?
- snowflake-cloud-data-platform - 具有给定开始日期和结束日期的月份中的天数
- winapi - 将 tchar 数组打印为 unicode 字符串 rust winapi
- twilio - 为什么我的消息不能使用 Twilio 消息服务和 Twilio 函数发送?
- python - 尝试使用 pyqt5 读取 qml 文件时未导入 Qt.SafeRenderer 1.1 和 QtStudio3D 2.3
- javascript - 如何停止 JavaScript 元素在点击时清除所有内容
- python - 将一个类的输出共享给另一个类python
- python-3.x - ScrollView 不允许我滚动
- javascript - 我想使用 supabase 设置身份验证
- sql - 如何改进多边形 postgis 查询