2016-08-30 19 views
7

im za pomocą reakcji i mam element, który po prostu musi renderować dzieci i dodać je klasy zgodnie z warunkiem. Jaki jest najlepszy sposób robienia tego?React - dodawanie klasy do komponentów dla dzieci

+0

[To] (http://stackoverflow.com/questions/26863938/modify-attributes-of-children-in-reactjs-component) powinno pomóc. –

Odpowiedz

10

wyobraziłem go tydzień temu, to co ja chciał:

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

Próbowałem tego rozwiązania, jednak dostaję błąd z funkcji renderowania, "dziecko nie jest zdefiniowane." Jeśli zmienię tę funkcję na anonimową, zamiast wywoływania metody klasy (this.modifyChildren w twoim przykładzie), błąd zniknie i wszystko działa poprawnie. Działa to zarówno z "grubą strzałką" i tradycyjnymi anonimowymi funkcjami JS. Nie mogę zrozumieć, dlaczego działa on dla ciebie, a nie dla mnie, gdy nasz kod jest prawie identyczny. –

0

Wewnątrz czyni metodę komponentu:

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

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

Nie chcę tego robić w każdym z komponentów, chcę komponent, który je zawiera, do testowania i dodać klasę, jeśli jest to konieczne. – Pachu

+0

Nie jestem pewien, co dokładnie próbujesz osiągnąć. Twój element macierzysty może obliczyć wszystkie potrzebne klasy i przekazać je jako rekwizyty dla dzieci. – Maggie

1

można przekazać rekwizyt do dziecka i może wybrać to, co klasa zastosować (lub po prostu przekazać nazwę klasy, ale to jest bardziej semantyczny):

W swoim dzieckiem render:

const classes = []; 

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

<div className={classes.join(' ')} /> 
Powiązane problemy