2015-11-26 2 views
0

Следовал по учебнику ReactJS со своего сайта.ReactJS issue:() => vs function()

var Comment = React.createClass({ 
    render: function() { 
    return (
     <div className="comment"> 
     <h2 className="commentAuthor"> 
      {this.props.author} 
     </h2> 
     {this.props.children} 
     </div> 
    ); 
    } 
}); 

var CommentList = React.createClass({ 
    render:() => { 
    return (
     <div className="commentList"> 
     <Comment author="Pete Hunt">This is one comment</Comment> 
     <Comment author="Jordan Walke"> This is *another* comment</Comment> 
     </div> 
    ); 
    } 
}); 

var CommentForm = React.createClass({ 
    render:() => { 
    return (
     <div className="commentForm"> 
     Comment Form 
     </div> 
    ); 
    } 
}); 

var CommentBox = React.createClass({ 
    render:() => { 
    return (
     <div className="commentBox"> 
     <h1>Comments</h1> 
     <CommentList /> 
     <CommentForm/> 
     </div> 
    ); 
    } 
}); 

ReactDOM.render(
    <CommentBox />, 
    document.getElementById("content") 
); 

Однако, если использовать стрелки обозначения в первом компоненте Комментарии, а именно:

(* PARAMS *) => {}

вместо нормальной функции декларации обозначений, а именно:

функция (* Титулы *) {}

интерпретатор хром выложит следующее сообщение об ошибке:

Uncaught TypeError: Не удается прочитать свойство «реквизита» неопределенных


Может кто-нибудь пролить свет на этот вопрос?

+1

Функции стрелки имеют статическую лексическую форму, которая может быть определена путем чтения их декларации. На английском языке их значение не может быть изменено посредством вызова, вызова, применения или привязки метода. Поскольку «это» не было определено, когда функция была создана, она всегда будет неопределенной независимо от того, как ее вызвал. – Shashank

+1

Вы не можете использовать 'this' с' => 'так, как вы предполагаете,' ({foo: x => this}). Foo(); // === window' –

ответ

4

Функции стрелки не свяжутся this. Поэтому, если вы создаете функцию render как функцию стрелки, то this не будет привязан к текущему компоненту.

Итак, для render и других методов, принадлежащих вашему компоненту, и вам нужен доступ к компоненту как this, вам необходимо использовать реальные функции. Вы можете использовать функции стрелок для вложенных функций (и там имеет смысл использовать их).

+0

Делает прекрасный смысл. Многочисленный. –

+0

Сторона примечания: если реальные функции кажутся тяжелыми для записи, тогда используйте классы ES6 и напишите компоненты React как классы. Немного меньше набралось. – Fdr