2016-08-30 24 views
7

im sử dụng phản ứng và tôi có một thành phần chỉ đơn giản là cần hiển thị các con và thêm chúng vào một lớp theo điều kiện. Whats cách tốt nhất để làm điều đó?Phản ứng - thêm lớp học cho các thành phần con

+0

[This] (http://stackoverflow.com/questions/26863938/modify-attributes-of-children-in-reactjs-component) sẽ giúp bạn. –

Trả lời

10

I figured it out một tuần trước đây, đây là những gì tôi muốn:

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

Tôi đã thử giải pháp này, tuy nhiên tôi nhận được một lỗi từ hàm render, "con không được định nghĩa." Nếu tôi thay đổi sang một hàm ẩn danh ở đó, thay vì gọi một phương thức lớp (this.modifyChildren trong ví dụ của bạn), lỗi sẽ biến mất và mọi thứ hoạt động tốt. Điều này làm việc với cả hai "mũi tên béo" và các hàm ẩn danh JS truyền thống. Không thể tìm ra lý do tại sao nó hoạt động cho bạn và không cho tôi khi mã của chúng tôi gần như giống hệt nhau. –

0

Bên trong làm cho phương pháp thành phần của bạn:

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

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

Tôi không muốn làm điều đó trong mỗi thành phần, tôi muốn các thành phần có chứa chúng để làm thử nghiệm và thêm các lớp học nếu cần thiết – Pachu

+0

Không chắc chắn chính xác những gì bạn đang cố gắng để đạt được. Thành phần cha mẹ của bạn có thể tính tất cả các lớp cần thiết và chuyển chúng làm đạo cụ cho trẻ em. – Maggie

1

Bạn có thể vượt qua một prop xuống cho đứa trẻ và nó có thể chọn những gì lớp để áp dụng (hoặc chỉ cần vượt qua tên lớp nhưng đây là ngữ nghĩa hơn):

Trong con bạn render:

const classes = []; 

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

<div className={classes.join(' ')} /> 
Các vấn đề liên quan