Uncaught TypeError: Cannot read property 'state or props' of undefined
Uncaught TypeError: Cannot read property 'state or props' of undefined
所以我开始将我的应用程序从 ES2015 转换为使用 React 的 ES6。
我有一个 parent class 和一个 child class 像这样,
export default class Parent extends Component {
constructor(props) {
super(props);
this.state = {
code: ''
};
}
setCodeChange(newCode) {
this.setState({code: newCode});
}
login() {
if (this.state.code == "") {
// Some functionality
}
}
render() {
return (
<div>
<Child onCodeChange={this.setCodeChange} onLogin={this.login} />
</div>
);
}
}
Child class,
export default class Child extends Component {
constructor(props) {
super(props);
}
handleCodeChange(e) {
this.props.onCodeChange(e.target.value);
}
login() {
this.props.onLogin();
}
render() {
return (
<div>
<input name="code" onChange={this.handleCodeChange.bind(this)}/>
</div>
<button id="login" onClick={this.login.bind(this)}>
);
}
}
Child.propTypes = {
onCodeChange: React.PropTypes.func,
onLogin: React.PropTypes.func
};
但是这会导致以下错误,
this.state 未定义
指的是,
if (this.state.code == "") {
// Some functionality
}
知道是什么原因造成的吗?
你可以使用箭头函数来绑定你的函数。您需要在 child 和 parent 组件中绑定函数。
Parent:
export default class Parent extends Component {
constructor(props) {
super(props);
this.state = {
code: ''
};
}
setCodeChange = (newCode) => {
this.setState({code: newCode});
}
login = () => {
if (this.state.code == "") {
// Some functionality
}
}
render() {
return (
<div>
<Child onCodeChange={this.setCodeChange} onLogin={this.login} />
</div>
);
}
}
Child
export default class Child extends Component {
constructor(props) {
super(props);
}
handleCodeChange = (e) => {
this.props.onCodeChange(e.target.value);
}
login = () => {
this.props.onLogin();
}
render() {
return (
<div>
<input name="code" onChange={this.handleCodeChange}/>
</div>
<button id="login" onClick={this.login}>
);
}
}
Child.propTypes = {
onCodeChange: React.PropTypes.func,
onLogin: React.PropTypes.func
};
还有其他方法可以绑定函数,例如您正在使用的方法,但您也需要为 parent 组件执行此操作,因为 <Child onCodeChange={this.setCodeChange.bind(this)} onLogin={this.login.bind(this)} />
或者您可以在构造函数中指定绑定为
Parent:
constructor(props) {
super(props);
this.state = {
code: ''
};
this.setCodeChange = this.setCodeChange.bind(this);
this.login = this.login.bind(this);
}
Child
constructor(props) {
super(props);
this.handleCodeChange = this.handleCodeChange.bind(this);
this.login = this.login.bind(this);
}
我同意@Shubham Kathri 给出的所有不同的解决方案,除了渲染中的直接绑定。
不建议直接在render中绑定函数。建议您始终在构造函数中绑定它,因为如果您直接在渲染中进行绑定,那么每当您的组件渲染时,Webpack 都会在捆绑文件中创建一个新的 function/object,因此 Webpack 捆绑文件的大小会增加。由于多种原因,您的组件会重新呈现,例如:执行 setState 但如果将它放在构造函数中,它只会被调用一次。
不推荐以下实现方式
<Child onCodeChange={this.setCodeChange.bind(this)} onLogin={this.login.bind(this)} />
始终在构造函数中执行并在需要时使用 ref
constructor(props){
super(props);
this.login = this.login.bind(this);
this.setCodeChange = this.setCodeChange.bind(this);
}
<Child onCodeChange={this.setCodeChange} onLogin={this.login} />
如果您使用的是 ES6,则不需要手动绑定,但如果您愿意,也可以。如果你想远离范围相关问题和手动 function/object 绑定,你可以使用箭头函数。
抱歉,如果我在手机上回答有任何拼写错误
所以我开始将我的应用程序从 ES2015 转换为使用 React 的 ES6。
我有一个 parent class 和一个 child class 像这样,
export default class Parent extends Component {
constructor(props) {
super(props);
this.state = {
code: ''
};
}
setCodeChange(newCode) {
this.setState({code: newCode});
}
login() {
if (this.state.code == "") {
// Some functionality
}
}
render() {
return (
<div>
<Child onCodeChange={this.setCodeChange} onLogin={this.login} />
</div>
);
}
}
Child class,
export default class Child extends Component {
constructor(props) {
super(props);
}
handleCodeChange(e) {
this.props.onCodeChange(e.target.value);
}
login() {
this.props.onLogin();
}
render() {
return (
<div>
<input name="code" onChange={this.handleCodeChange.bind(this)}/>
</div>
<button id="login" onClick={this.login.bind(this)}>
);
}
}
Child.propTypes = {
onCodeChange: React.PropTypes.func,
onLogin: React.PropTypes.func
};
但是这会导致以下错误,
this.state 未定义
指的是,
if (this.state.code == "") {
// Some functionality
}
知道是什么原因造成的吗?
你可以使用箭头函数来绑定你的函数。您需要在 child 和 parent 组件中绑定函数。
Parent:
export default class Parent extends Component {
constructor(props) {
super(props);
this.state = {
code: ''
};
}
setCodeChange = (newCode) => {
this.setState({code: newCode});
}
login = () => {
if (this.state.code == "") {
// Some functionality
}
}
render() {
return (
<div>
<Child onCodeChange={this.setCodeChange} onLogin={this.login} />
</div>
);
}
}
Child
export default class Child extends Component {
constructor(props) {
super(props);
}
handleCodeChange = (e) => {
this.props.onCodeChange(e.target.value);
}
login = () => {
this.props.onLogin();
}
render() {
return (
<div>
<input name="code" onChange={this.handleCodeChange}/>
</div>
<button id="login" onClick={this.login}>
);
}
}
Child.propTypes = {
onCodeChange: React.PropTypes.func,
onLogin: React.PropTypes.func
};
还有其他方法可以绑定函数,例如您正在使用的方法,但您也需要为 parent 组件执行此操作,因为 <Child onCodeChange={this.setCodeChange.bind(this)} onLogin={this.login.bind(this)} />
或者您可以在构造函数中指定绑定为
Parent:
constructor(props) {
super(props);
this.state = {
code: ''
};
this.setCodeChange = this.setCodeChange.bind(this);
this.login = this.login.bind(this);
}
Child
constructor(props) {
super(props);
this.handleCodeChange = this.handleCodeChange.bind(this);
this.login = this.login.bind(this);
}
我同意@Shubham Kathri 给出的所有不同的解决方案,除了渲染中的直接绑定。
不建议直接在render中绑定函数。建议您始终在构造函数中绑定它,因为如果您直接在渲染中进行绑定,那么每当您的组件渲染时,Webpack 都会在捆绑文件中创建一个新的 function/object,因此 Webpack 捆绑文件的大小会增加。由于多种原因,您的组件会重新呈现,例如:执行 setState 但如果将它放在构造函数中,它只会被调用一次。
不推荐以下实现方式
<Child onCodeChange={this.setCodeChange.bind(this)} onLogin={this.login.bind(this)} />
始终在构造函数中执行并在需要时使用 ref
constructor(props){
super(props);
this.login = this.login.bind(this);
this.setCodeChange = this.setCodeChange.bind(this);
}
<Child onCodeChange={this.setCodeChange} onLogin={this.login} />
如果您使用的是 ES6,则不需要手动绑定,但如果您愿意,也可以。如果你想远离范围相关问题和手动 function/object 绑定,你可以使用箭头函数。
抱歉,如果我在手机上回答有任何拼写错误