REACTJS - 获取状态变量的类型错误
REACTJS - Getting a TypeError for state variable
我尝试从 Web 服务 api(通过 JSON)获取数组数据并遍历响应 - 但是当尝试 console.log()
来自渲染的状态数据时(),我收到此错误:
TypeError:this.state.jsonStr is undefined.
class TextFields extends React.Component {
constructor() {
super();
this.state = {
}
};
componentDidMount() {
const apiURL = myConstClass.apiURL;
var apiURL_ = apiURL + '/searchIdea';
fetch(apiURL_, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
// SEND
idea_uniqueid: '',
idea_name: '',
idea_description: '', // FIX: Get from Querystring
})
}).then((Response) => Response.json()).then((findresponse) => {
// RESPONSE
this.setState({ jsonStr: findresponse, });
console.log("SEARCHIDEARESULTS"); // Stopped here - Loop through array and populate below
console.log(this.state.jsonStr);
})
}
// RENDER
// ---------------------------------------------------------------
render() {
const { classes } = this.props;
const dataStr = this.state.jsonStr;
console.log("RENDER"); // Stopped here - Loop through array and populate below
console.log(this.state.jsonStr);
console.log(this.state.jsonStr[0]);
return (
<div></div>
)
}
}
看起来您在定义 this.state.jsonStr
之前试图访问它,结果您收到错误:
TypeError:this.state.jsonStr is undefined.
尝试在构造函数中设置它:
constructor() {
super();
this.state = {
jsonStr: ''
}
};
请尝试修改后的代码:
render() {
const { classes } = this.props;
const dataStr = this.state.jsonStr ? this.state.jsonStr : "" ;// I made a change here
console.log("RENDER"); // Stopped here - Loop through array and populate below
console.log(dataStr);
return (
<div></div>
)
}
}
最初 this.state.jsonStr
将是未定义的。所以当执行render()
方法时this.state.jsonStr[0]
会抛出错误。
尝试将 console.log(this.state.jsonStr[0]);
更改为 console.log(this.state.jsonStr && this.state.jsonStr[0]);
发生这种情况是因为第一次渲染组件时,fetch 返回的 promise 尚未解决,因此在状态中找不到 jsonStr
。要解决此问题,请将 jsonStr 添加到初始状态并为其分配一个值
TextFields extends React.Component {
constructor() {
super();
this.state = {
jsonStr: ''
}
}
}
否则你也可以添加条件来检查是否设置了 jsonStr
TextFields extends React.Component {
constructor() {
super();
this.state = {
jsonStr: undefined
}
}
render() {
const { classes } = this.props;
const dataStr = this.state.jsonStr;
console.log("RENDER");
if (this.state.jsonStr) {
console.log(this.state.jsonStr);
console.log(this.state.jsonStr[0]);
}
return (
<div></div>
)
}
}
}
大部分答案都涉及 default
状态值或 render
中的错误。但是我在你的数据获取函数中看到了另一个错误。
Calls to setState are asynchronous - don’t rely on this.state to reflect the new value immediately after calling setState.
在您的 componentDidMount
方法中,您犯了以下错误:
this.setState({ jsonStr: findresponse, });
console.log("SEARCHIDEARESULTS"); // Stopped here - Loop through array and populate below
console.log(this.state.jsonStr);
如果你想调试,我强烈推荐 devTools 扩展,或者将你的 console.log 语句作为对 setState 的回调或在 componentDidUpdate
生命周期中。
关于您的渲染方法的建议的一些注意事项,请考虑您的组件状态。对于 e.x。如果从外部服务获取数据,你可能有以下状态:
- 加载中
- 错误
- 未找到数据
- 找到数据
当您执行以下操作时:const dataStr = this.state.jsonStr ? this.state.jsonStr : ""
,您可能无法区分这些状态。
我建议使状态状态明确(有很多技术,为了简洁起见,我将它们排除在外),但至少我会建议智能默认值。对于 e.x.:
constructor() {
super();
this.state = {
jsonStr : undefined
}
};
您的 api 调用将是 return 值、null 或空数组(如果它是数组)。也可能会抛出一个错误,您可以使用 componentDidCatch
捕获该错误。
您现在可以在渲染方法中轻松处理这些情况。
我尝试从 Web 服务 api(通过 JSON)获取数组数据并遍历响应 - 但是当尝试 console.log()
来自渲染的状态数据时(),我收到此错误:
TypeError:this.state.jsonStr is undefined.
class TextFields extends React.Component {
constructor() {
super();
this.state = {
}
};
componentDidMount() {
const apiURL = myConstClass.apiURL;
var apiURL_ = apiURL + '/searchIdea';
fetch(apiURL_, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
// SEND
idea_uniqueid: '',
idea_name: '',
idea_description: '', // FIX: Get from Querystring
})
}).then((Response) => Response.json()).then((findresponse) => {
// RESPONSE
this.setState({ jsonStr: findresponse, });
console.log("SEARCHIDEARESULTS"); // Stopped here - Loop through array and populate below
console.log(this.state.jsonStr);
})
}
// RENDER
// ---------------------------------------------------------------
render() {
const { classes } = this.props;
const dataStr = this.state.jsonStr;
console.log("RENDER"); // Stopped here - Loop through array and populate below
console.log(this.state.jsonStr);
console.log(this.state.jsonStr[0]);
return (
<div></div>
)
}
}
看起来您在定义 this.state.jsonStr
之前试图访问它,结果您收到错误:
TypeError:this.state.jsonStr is undefined.
尝试在构造函数中设置它:
constructor() {
super();
this.state = {
jsonStr: ''
}
};
请尝试修改后的代码:
render() {
const { classes } = this.props;
const dataStr = this.state.jsonStr ? this.state.jsonStr : "" ;// I made a change here
console.log("RENDER"); // Stopped here - Loop through array and populate below
console.log(dataStr);
return (
<div></div>
)
}
}
最初 this.state.jsonStr
将是未定义的。所以当执行render()
方法时this.state.jsonStr[0]
会抛出错误。
尝试将 console.log(this.state.jsonStr[0]);
更改为 console.log(this.state.jsonStr && this.state.jsonStr[0]);
发生这种情况是因为第一次渲染组件时,fetch 返回的 promise 尚未解决,因此在状态中找不到 jsonStr
。要解决此问题,请将 jsonStr 添加到初始状态并为其分配一个值
TextFields extends React.Component {
constructor() {
super();
this.state = {
jsonStr: ''
}
}
}
否则你也可以添加条件来检查是否设置了 jsonStr
TextFields extends React.Component {
constructor() {
super();
this.state = {
jsonStr: undefined
}
}
render() {
const { classes } = this.props;
const dataStr = this.state.jsonStr;
console.log("RENDER");
if (this.state.jsonStr) {
console.log(this.state.jsonStr);
console.log(this.state.jsonStr[0]);
}
return (
<div></div>
)
}
}
}
大部分答案都涉及 default
状态值或 render
中的错误。但是我在你的数据获取函数中看到了另一个错误。
Calls to setState are asynchronous - don’t rely on this.state to reflect the new value immediately after calling setState.
在您的 componentDidMount
方法中,您犯了以下错误:
this.setState({ jsonStr: findresponse, });
console.log("SEARCHIDEARESULTS"); // Stopped here - Loop through array and populate below
console.log(this.state.jsonStr);
如果你想调试,我强烈推荐 devTools 扩展,或者将你的 console.log 语句作为对 setState 的回调或在 componentDidUpdate
生命周期中。
关于您的渲染方法的建议的一些注意事项,请考虑您的组件状态。对于 e.x。如果从外部服务获取数据,你可能有以下状态:
- 加载中
- 错误
- 未找到数据
- 找到数据
当您执行以下操作时:const dataStr = this.state.jsonStr ? this.state.jsonStr : ""
,您可能无法区分这些状态。
我建议使状态状态明确(有很多技术,为了简洁起见,我将它们排除在外),但至少我会建议智能默认值。对于 e.x.:
constructor() {
super();
this.state = {
jsonStr : undefined
}
};
您的 api 调用将是 return 值、null 或空数组(如果它是数组)。也可能会抛出一个错误,您可以使用 componentDidCatch
捕获该错误。
您现在可以在渲染方法中轻松处理这些情况。