Eno*_*noy 10 javascript reactjs
您好,感谢您的时间:
我正在学习以下教程:https : //app.pluralsight.com/library/courses/react-flux-building-applications/table-of-contents
目前我已经检测到,当您尝试创建作者时,它会尝试加载当前作者的 URL 的作者 ID。因为它正在被创建,它是未定义的,因此创建作者功能不起作用。
我已经阅读了一些关于在 JS 和 React 中检查未定义类型的主题: 如何确定变量是“未定义”还是“空”?
https://github.com/facebook/react/issues/3725
我尝试了以下方法:
在 manageAuthorForm 中,我们将作者的状态传递给 authorForm:
render() {
return (
<AuthorForm author={this.state.author}
onChange={this.setAuthorState}
onSave={this.saveAuthor}/>
);
};
Run Code Online (Sandbox Code Playgroud)
然后我尝试进入 AuthorForm:
import React from 'react';
import {Input} from "../common/textInput";
import Link from "react-router-dom/es/Link";
class AuthorForm extends React.Component {
componentWillReceiveProps(nextProps) {
if (nextProps.state.author === undefined) {
this.props.author = {
author: {
id: '',
firstName: '',
lastName: '',
}
};
}
}
render() {
return (
<form>
<h1>Manage author</h1>
<Input
name="firstName"
label="First Name"
value={this.props.author.firstName}
onChange={this.props.onChange}
/>
<Input
name="lastName"
label="Last Name"
value={this.props.author.lastName}
onChange={this.props.onChange}
/>
<button type="submit" value="Save" className="btn btn-default" onClick={this.props.onSave}><Link
to="/authors">Save
author</Link>
</button>
</form>
);
}
}
export {AuthorForm}
Run Code Online (Sandbox Code Playgroud)
它报告 nextProps 未定义:
Uncaught TypeError: Cannot read property 'author' of undefined
at AuthorForm.componentWillReceiveProps (authorForm.js:7)
at callComponentWillReceiveProps (react-dom.development.js:6389)
at updateClassInstance (react-dom.development.js:6575)
at updateClassComponent (react-dom.development.js:7848)
at beginWork (react-dom.development.js:8225)
at performUnitOfWork (react-dom.development.js:10224)
at workLoop (react-dom.development.js:10288)
at HTMLUnknownElement.callCallback (react-dom.development.js:542)
at Object.invokeGuardedCallbackDev (react-dom.development.js:581)
at invokeGuardedCallback (react-dom.development.js:438)
at renderRoot (react-dom.development.js:10366)
at performWorkOnRoot (react-dom.development.js:11014)
at performWork (react-dom.development.js:10967)
at requestWork (react-dom.development.js:10878)
at scheduleWorkImpl (react-dom.development.js:10732)
at scheduleWork (react-dom.development.js:10689)
at scheduleTopLevelUpdate (react-dom.development.js:11193)
at Object.updateContainer (react-dom.development.js:11231)
at react-dom.development.js:15226
at Object.unbatchedUpdates (react-dom.development.js:11102)
at renderSubtreeIntoContainer (react-dom.development.js:15225)
at Object.render (react-dom.development.js:15290)
at Object../src/index.js (index.js:17)
at __webpack_require__ (bootstrap 78b34f0f34b98a41c613:678)
at fn (bootstrap 78b34f0f34b98a41c613:88)
at Object.0 (authorStore.js:39)
at __webpack_require__ (bootstrap 78b34f0f34b98a41c613:678)
at bootstrap 78b34f0f34b98a41c613:724
at bootstrap 78b34f0f34b98a41c613:724
componentWillReceiveProps @ authorForm.js:7
callComponentWillReceiveProps @ react-dom.development.js:6389
updateClassInstance @ react-dom.development.js:6575
updateClassComponent @ react-dom.development.js:7848
beginWork @ react-dom.development.js:8225
performUnitOfWork @ react-dom.development.js:10224
workLoop @ react-dom.development.js:10288
callCallback @ react-dom.development.js:542
invokeGuardedCallbackDev @ react-dom.development.js:581
invokeGuardedCallback @ react-dom.development.js:438
renderRoot @ react-dom.development.js:10366
performWorkOnRoot @ react-dom.development.js:11014
performWork @ react-dom.development.js:10967
requestWork @ react-dom.development.js:10878
scheduleWorkImpl @ react-dom.development.js:10732
scheduleWork @ react-dom.development.js:10689
scheduleTopLevelUpdate @ react-dom.development.js:11193
updateContainer @ react-dom.development.js:11231
(anonymous) @ react-dom.development.js:15226
unbatchedUpdates @ react-dom.development.js:11102
renderSubtreeIntoContainer @ react-dom.development.js:15225
render @ react-dom.development.js:15290
./src/index.js @ index.js:17
__webpack_require__ @ bootstrap 78b34f0f34b98a41c613:678
fn @ bootstrap 78b34f0f34b98a41c613:88
0 @ authorStore.js:39
__webpack_require__ @ bootstrap 78b34f0f34b98a41c613:678
(anonymous) @ bootstrap 78b34f0f34b98a41c613:724
(anonymous) @ bootstrap 78b34f0f34b98a41c613:724
Run Code Online (Sandbox Code Playgroud)
在网络浏览器中,它报告:
×
TypeError: Cannot read property 'author' of undefined
AuthorForm.componentWillReceiveProps
C:/Users/YonePC/WebstormProjects/flux/src/components/authors/authorForm.js:7
4 |
5 | class AuthorForm extends React.Component {
6 | componentWillReceiveProps(nextProps) {
> 7 | if (nextProps.state.author === undefined) {
8 | this.props.author = {
9 | author: {
10 | id: '',
View compiled
? 15 stack frames were collapsed.
This screen is visible only in development. It will not appear if the app crashes in production.
Open your browser’s developer console to further inspect this error.
Run Code Online (Sandbox Code Playgroud)
完整代码,在github:https : //github.com/YoneMoreno/ReactFluxAuthorsPageTutorial
请问你能帮帮我吗?
谢谢;=)
简单的解决方案是:
<AuthorForm
author={this.state.author || {firstName:'', lastName:'', id:''}}
...
/>
Run Code Online (Sandbox Code Playgroud)
并componentWillReceiveProps
从子组件中删除该方法。
更好的方法是:
1-将状态的初始值分配author
为:
this.state = {
author: {firstName:'', lastName:'', id:''}
}
Run Code Online (Sandbox Code Playgroud)
2-或者在子组件的 render 方法中,这样写:
render(){
const {firstName='', lastName='', id=''} = this.props.author || {};
return(....)
}
Run Code Online (Sandbox Code Playgroud)
并firstName, lastName, id
直接使用而不是this.props.
您的代码中的问题:
1-应当nextProps.author
代替nextProps.state.author
在componentWillReceiveProps
生命周期方法。
2- props 是只读的,无论你将组件声明为函数还是类,它都不能修改自己的 props。您正在尝试更改 中的值componentWillReceiveProps
。
归档时间: |
|
查看次数: |
34286 次 |
最近记录: |