2014-02-13 5 views
21

Есть ли рекомендуемый шаблон для передачи реквизита для компонентов-потомков в React?Реагирование: Передача реквизит потомкам

Ниже, я передаю опору callback дочерней компоненты:

Master = React.createClass({ 
    render: function() { 
    return (
     <div> 
     <ListComp items={this.props.items} callback={this.handleClick} /> 
     </div> 
    ); 
    } 
}); 

ListComp = React.createClass({ 
    render: function() { 

    this.props.items.forEach(function(item) { 
     items.push(<ItemView item={item} callback={this.props.callback} />); 
    }, this); 

    return (
     <ul>{items}</ul> 
    ); 
    } 
}); 

И тогда callback пропеллера получает дошедший до компонента потомка:

ItemComp = React.createClass({ 
    render: function() { 
    return (
     <li><a onClick={this.handleClick} href="#">Link</a></li> 
    ); 
    }, 

    handleClick: function(e) { 
    e.preventDefault(); 
    this.props.callback(); 
    } 
}); 

это правильно передать опора вниз дважды, как это, или я должен как-то ссылаться на ее наследование?

Я вижу способ transferPropsTo в документации, и от входа, похоже, я мог добраться до callback из потомка через this.props.__owner__.props но эти дабл-дабл подчёркивания заставляют меня думать, что я не должен.

+0

Я не вижу проблем с передачей обратного вызова дважды. Это требует немного большего набора текста, но явственно и легко понять. – NVI

ответ

23

Да, это идиоматично. Подумайте о каждом компоненте как о функции, аргументы которой являются реквизитами - с этой точки зрения, прохождение вокруг реквизита явно кажется намного более нормальным. Мы обнаружили, что это делает вещи более удобными для того, чтобы все было явным, чтобы вы могли видеть, что все входы в компонент и что именно вы передаете.

(Будущая версия React, вероятно, будет включать функцию, называемую «контексты», которая позволяет передавать вещи неявно, но, вероятно, это сделает код сложнее рассуждать, поэтому я по-прежнему предпочитаю очевидность почти всех . время)

UPDATE (не оригинальным автором)

наконец была добавлена ​​документация (она была добавлена ​​где-то между летом 2015 и летом 2016 года, вероятно, с выпуском 0,14):

Official React Context Documentation.

Обратите внимание, что это также то, как react-redux упрощает прохождение магазинов через иерархию.

+3

Работая с Угловым JS-приложением умеренного размера, функция «контекста» звучит как механика масштаба Angular и звучит запутанно. $ scope vs. $ rootScope, объем вложения ... Очевидность текущей версии React (0.8.0) выиграла меня и позволила установить обычное правило масштаба JS. –

+2

@ssorallen Мы очень осознаем это. Контексты в настоящее время доступны в главном, но они не документированы и могут быть изменены, потому что мы хотим, чтобы все было ясно. Контексты, вероятно, всегда будут в большинстве случаев дополнительными, расширенными функциями. –

+0

Отлично. Я уверен, что в рамках он полезен и в некоторых случаях использования случайного использования. –

Смежные вопросы