2015-08-26 6 views
14

Я хотел бы знать, есть ли лучший способ условно передать опору, чем использовать оператор if.Реагировать: inline условно передать опору компоненту

Например, прямо сейчас у меня есть:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    if(this.props.editable) { 
     return (
     <Child editable={this.props.editableOpts} /> 
    ); 
    } else { 
     // In this case, Child will use the editableOpts from its own getDefaultProps() 
     return (
     <Child /> 
    ); 
    } 
    } 
}); 

Есть ли способ, чтобы написать это без Условный оператор? Я думал что-то вдоль линий типа рядных, если-заявления в JSX:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    return (
     <Child 
     {this.props.editable ? editable={this.props.editableOpts} : null} 
     /> 
    ); 
    } 
}); 

Чтобы обернуть вверх: Я пытаюсь найти способ, чтобы определить опору для Child, но проход значение (или сделать что-то еще), так что Child по-прежнему тянет эту ценность от Child собственных getDefaultProps().

+0

Можете вставить код для 'Child' также? Кроме того, вы имели в виду сказать '' вместо ''? –

+0

@ JimSkerritt Я не путал реквизит, хотя я знаю, что это выглядит так. Я пытаюсь использовать ['реакция-bootstrap-table'] (http://allenfang.github.io/react-bootstrap-table/example.html), и это тот формат, который они используют. Я не уверен, что код «Child» действительно имеет значение для того, что я прошу, поэтому я его не включил. Я действительно просто ищу способ опционально передать или не передать подсказку «Child», которая не требует наличия большого количества аналогичного кода в if-statement в «Parent». –

+1

Gotcha, просто проверяю :) У меня будет ответ для вас в ближайшее время –

ответ

31

Вы были близки к своей идее. Оказывается, что прохождение undefined для пропеллера такое же, как его вообще не включает, которое по-прежнему будет вызывать значение пропущенного значения по умолчанию. Таким образом, вы могли бы сделать что-то вроде этого:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    return <Child 
     editable={this.props.editable ? 
        this.props.editableOpts : 
        undefined} 
    />; 
    } 
}); 
+0

О, потрясающе! Вы нашли это в документации где-нибудь? Я искал это, но ничего не мог найти во время быстрого поиска. –

+0

не уверен, что это в документации или нет, только что я узнал при использовании React :). –

+1

'null' не имеет такой мощности, как' undefined ', BTW. – Season

1

Определить props переменную:

let props = {}; 
if (this.props.editable){ 
    props.editable = this.props.editable; 
} 

, а затем использовать его в JSX:

<Child {...props} /> 

Вот решение в вашем коде:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    let props = {}; 
    if (this.props.editable){ 
     props.editable = this.props.editable; 
    } 
    return (
     <Child {...props} /> 
    ); 
    } 
}); 

Source, React documentation: https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes

-1
const CleaningItem = ({ disabled = false }) => (
<View 
    style={[styles.container, disabled && styles.disabled]} 
    pointerEvents={disabled ? 'none' : 'auto'} 
> 
    <Button 
     disabled={disabled || null} 
     title="SELECT" 
    /> 
</View> 
); 
+0

Было бы неплохо, если вы напишете несколько слов в дополнение к объяснению своего кода – Yannick

+0

, если вы передадите отключенную ссылку на компонент CleaningItem, компонент будет отключен и применит стиль отключения (styles.disabled) – Denis

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