我正在尝试教程:https://facebook.github.io/react/docs/tutorial.html
import React, { PropTypes } from 'react';
import classnames from 'classnames';
import styles from './CommentBox.css';
import withStyles from '../../decorators/withStyles';
import Link from '../../utils/Link';
import $ from 'jquery';
@withStyles(styles)
class CommentBox extends React.Component {
constructor() {
super();
this.state = {data: []};
}
loadCommentsFromServer() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
})
}
componentDidMount() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
}
render() {
let url="/public/comments.json"
return (
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm />
</div>
);
}
}
class CommentList extends React.Component {
render() {
let data = this.props.data
var commentNodes = data.map(function (comment) {
return (
<Comment author={comment.author}>
{comment.text}
</Comment>
);
});
return (
<div className="commentList">
{commentNodes}
</div>
);
}
};
class Comment extends React.Component {
render() {
return(
<div className="comment">
<h2 className="commentAuthor">
{this.props.author}
</h2>
{this.props.children}
</div>
);
}
}
class CommentForm extends React.Component {
render() {
return (
<div className="commentForm">
Hello, world! I am a CommentForm.
</div>
);
}
};
export default CommentBox;
但是,本教程有点过时,我使用的是带有ES6语法的React 0.14-rc1。我已尽力遵循教程并以0.14方式实现它。能够达到这一点,但现在得到错误:
TypeError: this.props is undefined
无法弄清楚问题。知道为什么吗?感谢
答案 0 :(得分:40)
使用React和ES6 classes时,React不会在您的课程中声明自动绑定功能。
因此,请使用this.loadCommentsFromServer.bind(this)
或使用箭头功能
loadCommentsFromServer = () => {}
答案 1 :(得分:9)
随着React从createClass转移到ES6 classes
,我们需要自己处理this
到我们方法的正确值,如下所述:http://www.newmediacampaigns.com/blog/refactoring-react-components-to-es6-classes
更改您的代码,使方法限制为在consructor中更正此值:
export default class ComponentClass extends React.Component {
constructor(props) {
super(props);
this._myHandler = this._myHandler.bind(this);
}
_myHandler(props) {
console.log(props);
}
render() {
return (
<div className="col-xs-6 col-md-4">
<button type="button" className="btn btn-danger" onClick={this._myHandler}><i className="fa fa-trash"> Delete</i></button>
</div>
)
}
}
no autobinding
是React家伙为ES6课程刻意迈出的一步。 React.createClass
提供了自动绑定到正确的上下文。有关详细信息,请访问:https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding
因此,基于此,您还可以将代码更改为:
export default class ComponentClass extends React.Component {
_myHandler = (props) => {
console.log(props);
}
render() {
return (
<div className="col-xs-6 col-md-4">
<button type="button" className="btn btn-danger" onClick={this._myHandler}><i className="fa fa-trash"> Delete</i></button>
</div>
)
}
}
答案 2 :(得分:4)
将props
传递给构造函数将有所帮助:
constructor(props) {
super(props);
}
答案 3 :(得分:1)
尽管上述所有答案在技术上都是正确的,但在我的情况下它们并不起作用。我收到了一些疯狂的错误'缺少类属性转换'所以,而不是试图弄清楚我在事件中正确定义了处理程序,如下所示:
export class ComponentClass extends React.Component{
_myHandler(event) {
event.preventDefault();
console.log(this.props.thingIPassedIn);
}
render() {
return <Button onClick={(event) => this._myHandler(event)} type="button" className="btn btn-danger">Click Me!</Button>;
}
}
您也可以通过这种方式传递参数。
export class ComponentClass extends React.Component{
_myHandler(thingIPassedIn) {
console.log(thingIPassedIn);
}
render() {
return <MyOtherComponent defNotAnEvent={(thingIPassedIn) => this._myHandler(thingIPassedIn)} />;
}
}
答案 4 :(得分:1)
可以使用箭头功能像下面那样改进ajax代码,以避免范围问题并访问内部的道具
loadCommentsFromServer = () => {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: (data) => {
this.setState({data: data});
},
error: (xhr, status, err) => {
console.error(this.props.url, status, err.toString());
}
})
}
答案 5 :(得分:0)
我也是React的新手,在功能中使用状态和道具时,值得注意的一件事是USE FUNCTION VARIABLE即。
func(){this.setState}
结果错误
func=()=>{this.setState}
可以工作
情况也是如此
this.props
内部函数
请注意,即使您没有在构造函数内部使用function.bind(this)及其上下文。