React - Redux a history go back bez react-router rubrika: Programování: JavaScript

5 anti.cz
položil/-a 13.4.2016

Ahoj,

Snažím se vyřešit jak dostat state History.pushState do Reactu. Co jsem koulal,tak se to řeší přes react-router, který nepoužívám.

Popis appky a proč to je tak jak to je. Velká většina appky je po pořád na klasických requestech. Reactová část používá stejné URL, ale akorát se volá přes ajax. Serverová část je stejná pro oba případy, ale samozřejmě je to upravené pro ajax požadavky. Je to sice hybrid, ale výhoda je, že se to dá postupně převádět a daná část může běžet po staru na Latte nebo nově na Reactu(React má jen frotend část. V latte je akorát script tag).

Doteď je celé state v url. A i v Ractu je state totožný s url. Ale url jsou enormně dlouhá a to je problém. Tak se rozhodlo, že se budou vytvářet pro uživatele zkrácená URL a to pouze na vyžádání uživatele, že si chce daný výpočet uložit a někomu poslat.

Doteď jsem go back nemusel moc řešit. Vzhledem k tomu, že state byl v URL, tak stačilo po go back dát reaload(). Není to optimální, ale je to jednoduché a uživateli se to nerozbije, když si sám dá F5.

Teď je to pouze takto:

  window.addEventListener('popstate', function(event) {
        if (event.state === 'kalkulackaGoBack') {
            location.reload();
        }
    }, false);

Je nějaká šance jak odtud poslat state Reactu a donutit ho přerendrovat se?

Co jsem koukal, tak by to mělo jít přes Router a mít jen jednu routu, ale apka je na podstránce webu a trochu mám strach co to bude vyvádět. Ale i tak mu budu muset nějak říct, že teď jsem udělal krok, který chci mít v historii. Z toho co jsem pochopil, tak toto se pravě děje když se přistoupí na jinou routu. Sice by jsem mohl mít dvě routy co budou zobrazovat komponentu APP a přeskakovat mezi němi, ale to přijde dost uchylný.

odkaz
6 vojta.tranta
odpověděl/-a 13.4.2016
 
upravil/-a 13.4.2016

Zrovna tohle jsem implementil, prakticky je to do reduxu
https://github.com/vojtatranta/supertiny-app-lib/blob/master/app.js

Jinými slovy - jediná šance, jak změnit state je přes dispatch(). Úplně nejsprávnější řešení (lepší než to moje) by bylo mít službu, která by poslouchala store a nastavovala by url přesně podle toho, jak se mění klíč 'location' ve statu.

To se dá snadno napsat. Já to taky tak brzo udělám (pak by nebylo potřeba spojovat dispatch a history v createHistory, ale history by byla v samostatném modulu a jen by poslouchala store bez závislostí)

Komentáře

  • anti.cz : Diky, zkusim. Kazda rada dobra. 13.4.2016

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.