React TypeError: 无法读取未定义的属性 ‘props’
React TypeError: Cannot read property ‘props’ of undefined
当在没有将正确的上下文绑定到关键字的情况下调用类方法时,会发生“无法读取未定义的属性‘props’”错误this
。
要解决该错误,请将类方法定义为箭头函数或使用
bind
类的构造方法中的方法。
如果您在功能组件中遇到错误,请向下滚动到下一部分。
下面是错误如何发生的示例。
应用程序.js
import React, {Component} from 'react'; class App extends Component { logProps() { // ⛔️ Uncaught TypeError: Cannot read properties of undefined (reading 'props') console.log(this.props); } render() { return ( <div> <button onClick={this.logProps}>Log props</button> </div> ); } } export default App;
请注意,我们定义了logProps
方法,但没有绑定this
关键字的上下文。
因此,方法
this
中的关键字logProps
的值为undefined
。使用箭头函数而不是命名函数
要解决该错误,请将logProps
方法切换为使用箭头函数。
应用程序.js
import React, {Component} from 'react'; class App extends Component { // 👇️ now using arrow function logProps = () => { console.log(this.props); }; render() { return ( <div> <button onClick={this.logProps}>Log props</button> </div> ); } } export default App;
这是可行的,因为箭头函数使用this
封闭范围的关键字——在我们的示例中,封闭范围是特定的组件实例。
不要this
在功能组件中使用关键字
如果您在功能组件中遇到错误,请确保您没有props
使用this
关键字进行访问,例如 use props.myProp
instead of
this.props.myProp
。
应用程序.js
function Button(props) { return ( <button onClick={() => console.log('button clicked')}> {props.text} </button> ); } function App() { return ( <div> <Button text="Click" /> </div> ); } export default App;
请注意,该Button
组件用于props.text
访问text
传递给它的道具。
解构你的道具
或者,您可以解构 prop 以不必在
props
对象上访问它。
应用程序.js
function Button({text}) { return ( <button onClick={() => console.log('button clicked')}> {text} </button> ) } function App() { return ( <div> <Button text="Click" /> </div> ); } export default App;
我们解构了对象text
的属性props
,因此Button
组件现在可以直接访问它。
您可以根据需要对尽可能多的道具执行此操作。
应用程序.js
function Button({text, disabled}) { return ( <button disabled={disabled} onClick={() => console.log('button clicked')}> {text} </button> ); } function App() { return ( <div> <Button text="Click" disabled={false} /> </div> ); } export default App;