2015-09-29 10 views
41

Używam Redux, redux-router i reactjs.Jak pobrać nowe dane w odpowiedzi na zmianę routera za pomocą Redux?

Próbuję zrobić aplikację, gdzie pobierał informacje o zmianie trasy, tak, mam coś takiego:

<Route path="/" component={App}> 
    <Route path="artist" component={ArtistApp} /> 
    <Route path="artist/:artistId" component={ArtistApp} /> 
</Route> 

Kiedy ktoś wchodzi do artist/<artistId> chcę szukać artysty, a następnie renderowanie Informacja. Pytanie brzmi, jaki jest najlepszy sposób na zrobienie tego?

Znalazłem kilka odpowiedzi na ten temat, używając RxJS lub próbując pośrednika zarządzać żądaniami. Teraz moje pytanie brzmi: czy to naprawdę konieczne, czy po prostu sposób, aby architektura nie reagowała na agnostykę? Czy mogę po prostu pobrać potrzebne informacje, aby zamiast tego reagować z komponentami componentDidMount() i componentDidUpdate()? Teraz robię to, uruchamiając akcję w tych funkcjach, które żądają informacji, a komponent ponownie renderuje się, gdy dotrze informacja. Komponent ma pewne właściwości informujące mnie:

{ 
    isFetching: true, 
    entity : {} 
} 

Dzięki!

+0

Czy próbowałeś zapytać o pokój luzu Reactiflux? mają bardzo aktywny kanał Redux –

+0

Nie zrobiłem! Zrobię teraz, dzięki ludziom! –

+0

@FrancoRisso proszę napisać, co powiedzieli ludzie z luzu, to naprawdę może pomóc. 10x – udidu

Odpowiedz

56

Teraz moje pytanie brzmi: Czy to naprawdę konieczne, czy tylko sposób, aby utrzymać architektura-agnostyk? Czy mogę po prostu pobrać potrzebne informacje, aby zamiast tego reagować z komponentami componentDidMount() i componentDidUpdate()?

Możesz to całkowicie zrobić w componentDidMount() i componentWillReceiveProps(nextProps).
To co robimy w real-world example w Redux:

function loadData(props) { 
    const { fullName } = props; 
    props.loadRepo(fullName, ['description']); 
    props.loadStargazers(fullName); 
} 

class RepoPage extends Component { 
    constructor(props) { 
    super(props); 
    this.renderUser = this.renderUser.bind(this); 
    this.handleLoadMoreClick = this.handleLoadMoreClick.bind(this); 
    } 

    componentWillMount() { 
    loadData(this.props); 
    } 

    componentWillReceiveProps(nextProps) { 
    if (nextProps.fullName !== this.props.fullName) { 
     loadData(nextProps); 
    } 

    /* ... */ 

} 

Można uzyskać bardziej wyrafinowane z Rx, ale to nie jest w ogóle konieczne.

+1

czy to "idiomatyczne Redux" do używania rekwizytów OnEnter/onLeave w React Router? –

+5

@VictorSuzdalev Sure, Redux nie ma tutaj żadnej opinii. –

+4

OMG ten sam Dan odpowiada, dzięki stary! Kocham twoją pracę. (przepraszam, jestem trochę tech groupie) –

17

ja zrobiłem to z niestandardowych wiążące prostych rekwizytów Router onEnter/onLeave zwrotnych tak:

const store = configureStore() 

//then in router 
<Route path='/myRoutePath' component={MyRouteHandler} onEnter={()=>store.dispatch(myRouteEnterAction())} /> 

To trochę hacky ale działa i nie wiem lepsze rozwiązanie teraz.

+0

Dzięki za rozwiązanie! To działa, chociaż wolę podejście Dana do utrzymywania rzeczy w tym samym komponencie, myślę, że jest czystszy. –

+0

@FrancoRisso jako kwestia gustu, i nie do dyskutowania tutaj)))) –

+1

To jest dobra alternatywa (którą wolę przez większość czasu). Jeśli chcesz, aby Twoje komponenty były na tyle głupie, aby nie wiedzieć, jak pobrać dane, tak to robisz. Lubię, gdy komponenty tylko renderują i "reagują" na zmiany rekwizytów.Jeśli zamiast tego składnik jako stan, który obejmuje wywołanie API, które jest nieprzejrzyste dla reszty aplikacji (np. Licznik github, który publikujesz na npm), ma więcej sensu dla componentWillMount() => loadData. Twoje zdrowie! – kilianc

Powiązane problemy