2015-03-22 16 views
12

Mam track rekwizyt z następującą definicję:React: zagnieżdżone defaultProps głęboko scalić

propTypes: { 
    track: React.PropTypes.shape({ 
     cover: React.PropTypes.string, 
     title: React.PropTypes.string, 
     artist: React.PropTypes.string 
    }) 
    } 

Chciałbym track.cover aby uzyskać wartość domyślną, jeśli niezdefiniowany:

getDefaultProps: function() { 
    return { 
     track: { 
      cover: 'placeholder.png' 
     } 
     } 
    } 

jakaś szansa Mogę to zrobić na poziomie widoku? Czy getDefaultProps dokonuje głębokiego scalenia? Czy muszę to zrobić na poziomie modelu?

Dzięki

Odpowiedz

7

getDefaultProps nie łączą przekazywane wartości nieruchomości o wartości powrotnej określony. Jeśli właściwość nie istnieje, React użyje obiektu zwróconego przez getDefaultProps, aby zainicjować instancję składnika.

Poniższy kod na przykład produkuje:

Test Cover and 

Kod:

var TrackItem = React.createClass({ 
    render: function() { 
    var track = this.props.track; 
    return (<div>{track.cover} and {track.artist}</div>); 
    }, 
    getDefaultProps: function() { 
    return { 
     track: { 
      artist: 'def artist' 
     } 
     } 
    }   
}); 

var track = { 
    cover: 'Test Cover'  
}; 
React.render(<TrackItem track={ track } />, mountNode); 

Należy również pamiętać, że obiekty zwrócone w getDefaultProps są wspólne dla wszystkich instancji składnika (reference).

+0

Yup. Znalazłem ten problem wymagający tej samej funkcji: https://github.com/facebook/react/issues/2568 Czekam teraz na dyskusję, jeśli chcesz to sprawdzić. Myślę, że sensowne jest dodanie głębokiego scalenia w niektórych przypadkach! –

+0

Nie jestem pewien, czy złożoność obsługi różnych przypadków jest naprawdę warta. – WiredPrairie

+0

To jednak nie brzmi zbyt skomplikowanie. Myślę, że mógłbym to zrobić, gdyby to zostało zatwierdzone. –

Powiązane problemy