2016-07-20 30 views
5

Umarım bu çok basit bir soru:Tepki-redux olsun sitesi taban URL/window.location

ben gibi sitemde bir sayfaya tam URL'yi içeren bir dize oluşturmak istiyorum:

https://example.com/documents/1

İdeal mapStateToProps() içinde, bir reaksiyona-Redux connect() -ed kap içinde bu elde etmek istiyorum. Sayfa tarayıcıHistory kullanarak bir tepki-yönlendirici Route bir torun nerede (belki bir şekilde tepki-yönlendirici veya browserHistory bir şekilde alabilir miyim?) Gerekirse tam bir React sınıfında yapacağım.

Ama bana süresince bunu nasıl bulamıyor. (window.location olduğu gibi) windowmapStateToProps() (orada hiçbir büyük bir sürpriz) ve benim bakış bileşenlerinin render() işlevinde hep undefined olduğunu.

Bugüne kadar yalnızca örneğin şimdiki rotayı erişmek için yollar buldular "/ documents/1", yalnızca bir göreli yoldur ve site tabanı URL'sini içermez (https://example.com/)

+0

sunucuya ya da sadece istemci üzerinde bu güçlü oluşturmak gerekiyor mu? –

+0

Sadece istemci tarafında. – stone

cevap

9

İlk olarak, kodunuzun istemciye ve sunucuya çalıştığını unutmayın, böylece pencereye herhangi bir erişimin Kontrol.

if (typeof window !== 'undefined') { 
    var path = location.protocol + '//' + location.host + '/someting'; // (or whatever) 
    } else { 
    // work out what you want to do server-side... 
    } 

Eğer DOM gösterileri oluşturmak ve istemci üzerinde daha önce bu URL ile mağaza doldurmak URL ilk defa bir sağlama toplamı hatası alacağız, işlemek. Eğer gerçekten hatayı önlemek istiyorsanız/almak URL'sini girmek için kök bileşeninde componentDidMount() kadar bekleyebilir.

+0

Teşekkürler, componentDidMount içinde 'window.location 'okudu. Bunu, uygulamanın en üst düzeydeki bileşeninden yapıyorum ve bunu eyalette saklıyorum. A) neden sunucu tarafında yapmayı önerdiğinizi sorabilir miyim? Sunucu tarafı oluşturma işlemi de bu şekilde çalışabilir mi? ve b) url'yi sunucu tarafından istemcinin okuyabileceği şekilde nasıl saklamanız gerektiğini nasıl/nerede önerirsiniz? – stone

+0

@skypecakes şimdi bunun hakkında düşündüm, evet sunucuda almak için iyi bir sebep yok, bu yüzden bu yorumu cevabımdan kaldırdım. –