2016-08-05 14 views
58

Używam poniższego kodu do ustawiania domyślnych rekwizytów w komponencie React, ale to nie działa. W metodzie render() widzę, jak wyjście "niezdefiniowane rekwizyty" zostało wydrukowane na konsoli przeglądarki. Jak mogę zdefiniować wartość domyślną dla rekwizytów komponentów?Jak ustawić domyślne rekwizyty komponentu na komponencie React

export default class AddAddressComponent extends Component { 

render() { 
    let {provinceList,cityList} = this.props 
    if(cityList === undefined || provinceList === undefined){ 
     console.log('undefined props') 
    } 
    ... 
} 

AddAddressComponent.contextTypes = { 
    router: React.PropTypes.object.isRequired 
} 

AddAddressComponent.defaultProps = { 
    cityList: [], 
    provinceList: [], 
} 

AddAddressComponent.propTypes = { 
    userInfo: React.PropTypes.object, 
    cityList: PropTypes.array.isRequired, 
    provinceList: PropTypes.array.isRequired, 
} 

Odpowiedz

57

zapomniałeś zamknąć wspornik Class.

class AddAddressComponent extends React.Component { 
 
    render() { 
 
    let {provinceList,cityList} = this.props 
 
    if(cityList === undefined || provinceList === undefined){ 
 
     console.log('undefined props') 
 
    } else { 
 
     console.log('defined props') 
 
    } 
 

 
    return (
 
     <div>rendered</div> 
 
    ) 
 
    } 
 
} 
 

 
AddAddressComponent.contextTypes = { 
 
    router: React.PropTypes.object.isRequired 
 
}; 
 

 
AddAddressComponent.defaultProps = { 
 
    cityList: [], 
 
    provinceList: [], 
 
}; 
 

 
AddAddressComponent.propTypes = { 
 
    userInfo: React.PropTypes.object, 
 
    cityList: React.PropTypes.array.isRequired, 
 
    provinceList: React.PropTypes.array.isRequired, 
 
} 
 

 
ReactDOM.render(
 
    <AddAddressComponent />, 
 
    document.getElementById('app') 
 
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app" />

9

Najpierw trzeba oddzielić swoją klasę z dalszych rozszerzeń ex nie można przedłużyć AddAddressComponent.defaultProps w class zamiast przenieść ją na zewnątrz.

Ja też zalecamy, aby przeczytać o Constructor i reagują na cykl: patrz Component Specs and Lifecycle

Oto co chcesz:

class AddAddressComponent extends React.Component { 

render() { 
    let { provinceList, cityList } = this.props; 
    if(cityList === undefined || provinceList === undefined){ 
     console.log('undefined props'); 
    } 
    } 
} 

AddAddressComponent.contextTypes = { 
    router: React.PropTypes.object.isRequired 
}; 

AddAddressComponent.defaultProps = { 
    cityList: [], 
    provinceList: [], 
}; 

AddAddressComponent.propTypes = { 
    userInfo: React.PropTypes.object, 
    cityList: PropTypes.array.isRequired, 
    provinceList: PropTypes.array.isRequired, 
} 

export default AddAddressComponent; 
+0

Czy jesteś pewien, że potrzebują one 'constructor' i' componentWillReceiveProps'? Wydaje mi się, że PO po prostu zapomniał o końcowym nawiasie na deklarację klasową. – ivarni

+0

@ivarni niekoniecznie, ale ważne jest, aby zrozumieć cykl życia, konstruktora i rozszerzenia klasy. więc będzie wiedział, co robi. więc dodałem kilka zewnętrznych linków. –

+0

Uczciwie, po prostu myślę, że mówienie * "musisz" * nie jest ściśle poprawne. Wolałbym powiedzieć coś w stylu: * "możesz dodać te metody do obserwacji cyklu życia" *. W przeciwnym razie dobra odpowiedź :) – ivarni

49

Dla tych szuka rozwiązania ES7 (etap 1):

import React, { PropTypes, Component } from 'react'; 

export default class ExampleComponent extends Component { 
    static contextTypes = { 
     // some context types 
    }; 

    static propTypes = { 
     prop1: PropTypes.object 
    }; 

    static defaultProps = { 
     prop1: { foobar: 'foobar' } 
    }; 

    ... 

} 

Aktualizacja

Na React v15.5, PropTypes został mov ed z głównym Reaguj Package (link):

import PropTypes from 'prop-types'; 
+0

dziękuję za odpowiedź, ale chciałem dowiedzieć się trochę więcej o tym, więc spojrzałem na 'react' /' native' dokument i nie mogłem ich znaleźć, gdzie jest dokument? – farmcommand2

+0

Nie sądzę, że jest to wyraźnie zawarte w dokumentach React, ale jeśli zrozumiesz, jakie zmienne klasy "statyczne" mają sens, sugeruję przeczytanie o nich [na MDN] (https://developer.mozilla.org/en -US/docs/Web/JavaScript/Reference/Classes/static).Zasadniczo, składnia w dokumentacji jest równoważna, ponieważ oba dodają informacje o rekwizytach do samej klasy, a nie do poszczególnych instancji. – treyhakanson

+1

import został zmieniony na: import PropTypes z 'prop-types'; – tibi

1

używać statycznego defaultProps jak:

export default class AddAddressComponent extends Component { 
    static defaultProps = { 
     provinceList: [], 
     cityList: [] 
    } 

render() { 
    let {provinceList,cityList} = this.props 
    if(cityList === undefined || provinceList === undefined){ 
     console.log('undefined props') 
    } 
    ... 
} 

AddAddressComponent.contextTypes = { 
    router: React.PropTypes.object.isRequired 
} 

AddAddressComponent.defaultProps = { 
    cityList: [], 
    provinceList: [], 
} 

AddAddressComponent.propTypes = { 
    userInfo: React.PropTypes.object, 
    cityList: PropTypes.array.isRequired, 
    provinceList: PropTypes.array.isRequired, 
} 

albumu: https://github.com/facebook/react-native/issues/1772

Jeśli chcesz sprawdzić typy zobacz jak używać PropTypes w odpowiedzi treyhakansona lub Ilana Hasanowa, lub przejrzeć wiele odpowiedzi w powyższym łączu.

1

Możesz także użyć zadania Destructuring.

class AddAddressComponent extends React.Component { 
    render() { 

    const { 
     province="insertDefaultValueHere1", 
     city="insertDefaultValueHere2" 
    } = this.props 

    return (
     <div>{province}</div> 
     <div>{city}</div> 
    ) 
    } 
} 

Podoba mi się to podejście, ponieważ nie trzeba pisać dużo kodu.

Powiązane problemy