javascript - 为什么 ComponentWillMount 中声明的变量未定义?
问题描述
我有这种类型的组件。为简单起见,我删除了所有不必要的代码。
这个组件在点击时会显示一个按钮,我声明的变量的值ComponentWillMount
应该显示在控制台中,但是点击时,控制台显示未定义,为什么?
'use strict';
class LoginFormComponent extends React.Component {
handleSubmit() {
console.log(this.model); //undefined
}
componentWillMount() {
this.model = 123;
}
render() {
console.log(this.model); //123
var styles = this.props.styles;
return (
<CM.MUI.FlatButton
style={styles.buttonStyle}
onClick={this.handleSubmit}
label={CM.gettext('Login')}/>
);
}
};
module.exports = LoginFormComponent;
解决方案
您应该componentDidMount
用于设置实例属性,因为其中的内容componentWillMount
不会在实例范围内,因为组件尚未安装。
此外,使用=>
粗箭头函数来访问this
组件的实例。
更新代码:
class LoginFormComponent extends React.Component {
handleSubmit = () => {
console.log(this.model); // 123
}
componentDidMount() {
this.model = 123;
}
render() {
console.log(this.model); //123
var styles = this.props.styles;
return (
<CM.MUI.FlatButton
style={styles.buttonStyle}
onClick={this.handleSubmit}
label={CM.gettext("Login")}
/>
);
}
}
export default LoginFormComponent;
安慰
演示:agitated-solomon-3rrow - CodeSandbox
更多信息
正如这个演示中所解释的:summer-violet-g4pyd - CodeSandbox,看起来 React 的工作方式如下:
- 构造函数
- 组件WillMount
- 使成为
- 组件DidMount
因此,在执行之后,render()
正在执行,componentDidMount
并且在任何状态更改后都没有更改。
如果你想要一些东西在那里,请把它们放进去constructor()
。
此外,componentWillMount
已弃用,您不应在下一个版本中使用它。
推荐阅读
- c# - 如何将 Azure AD SAML 连接到我现有的 .net webforms 应用程序?
- r - Levenshtein 距离:解决字符串变量拼写不一致的问题
- ionic-framework - 如何在关联的 Bitbucket 帐户中使用“离子登录”?
- javascript - 在 Odoo-12 POS UI Book Orders 中出现未知的 CORS 错误
- spring - 看不到 spring mvc 验证错误消息
- excel-2007 - 在一个excel文件中,我想从左边重写一个字符串来写
- python - 创建用于创建 .zip 文件的脚本文件的最佳方法是什么?
- react-hooks - 使用 useRef 动态关注输入(子组件)不起作用
- android - 使用最新 API 30 (Android 10) 构建的 Android 应用程序仅在 Android 10 中运行,在 Android 8 (OREO) 中运行时应用程序崩溃
- ios - 如何设置文本字段字符限制 SwiftUI?