2016-08-30 2 views
7

im использование реакции, и у меня есть компонент, который просто нужно отображать дочерние элементы и добавлять их в класс в соответствии с условием. Каков наилучший способ сделать это?React - добавление класса к дочерним компонентам

+0

[Это] (http://stackoverflow.com/questions/26863938/modify-attributes-of-children-in-reactjs-component) должен помочь вам. –

ответ

10

Я понял это неделю назад, это то, что я хотел:

export default class ContainerComponent extends React.Component { 
    constructor(props) { 
     super(props); 

     this.modifyChildren = this.modifyChildren.bind(this); 
    } 

    modifyChildren(child) { 
     const className = classNames(
      child.props.className, 
      {...otherClassses} 
     ); 

     const props = { 
      className 
     }; 

     return React.cloneElement(child, props); 
    } 
    render() { 
     return (<div> 
      {React.Children.map(this.props.children, this.modifyChildren(child))} 
     </div>); 
    } 
} 
+1

Я пробовал это решение, однако я получаю ошибку от функции рендеринга, «ребенок не определен». Если я перейду на анонимную функцию, вместо вызова метода класса (this.modifyChildren в вашем примере) ошибка исчезнет, ​​и все работает нормально. Это работает как с «жирной стрелкой», так и с традиционными анонимными функциями JS. Не могу понять, почему он работает для вас, а не для меня, когда наш код почти идентичен. –

0

Внутри делает метод компонента:

var childClasses = [], 
    childClassNames; 
if (condition) { 
    childClasses.push('my-class-name'); 
} 
childClassNames = childClasses.join(' '); 

return (<div className={childClassNames}> 
    .... (your component here) 
</div>); 
+0

Я не хочу делать это в каждом из компонентов, я хочу, чтобы компонент, содержащий их, выполнял тестирование и добавлял класс, если необходимо – Pachu

+0

Не знаете, чего именно вы пытаетесь достичь. Ваш родительский компонент может рассчитать все необходимые классы и передать их в качестве реквизита для детей. – Maggie

1

Вы можете пройти опору вниз к ребенку, и он может выбрать, какой класс применить (или просто передать имя класса, но это более семантическое):

В вашем ребенке оказывают:

const classes = []; 

if (props.contentVisible) 
    classes.push('visible'); 

<div className={classes.join(' ')} /> 
Смежные вопросы