获取TypeError:在ReactJs

时间:2015-09-23 06:58:58

标签: javascript reactjs

我正在尝试教程: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

无法弄清楚问题。知道为什么吗?感谢

6 个答案:

答案 0 :(得分:40)

使用ReactES6 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)及其上下文。