Saya memiliki struktur berikut untuk aplikasi React.js saya menggunakan React Router :
var Dashboard = require('./Dashboard');
var Comments = require('./Comments');
var Index = React.createClass({
render: function () {
return (
<div>
<header>Some header</header>
<RouteHandler />
</div>
);
}
});
var routes = (
<Route path="/" handler={Index}>
<Route path="comments" handler={Comments}/>
<DefaultRoute handler={Dashboard}/>
</Route>
);
ReactRouter.run(routes, function (Handler) {
React.render(<Handler/>, document.body);
});
Saya ingin melewatkan beberapa properti ke dalam Comments
komponen.
(biasanya saya akan melakukan ini seperti <Comments myprop="value" />
)
Apa cara termudah dan tepat untuk melakukannya dengan React Router?
javascript
properties
reactjs
react-router
Kosmetika
sumber
sumber
<ComponentA x={<ComponentB y={<ComponentC z={} />} />} />
ATAU<ComponentA x={ComponentB(ComponentC()) } />
Jika tidak, masalah kombinasi abstraksi ini akan muncul kembali dan akan membutuhkan beberapa solusi yang kurang optimal dan tidak langsung yang disebut workarounds seperti pembungkus, dll.Jawaban:
MEMPERBARUI
Sejak rilis baru, dimungkinkan untuk melewatkan alat peraga secara langsung melalui
Route
komponen, tanpa menggunakan Wrapper. Misalnya dengan menggunakanrender
prop .Komponen:
Pemakaian:
Contoh Codesandbox
VERSI LAMA
Cara pilihan saya adalah membungkus
Comments
komponen dan meneruskan pembungkus sebagai pengendali rute.Ini adalah contoh Anda dengan perubahan yang diterapkan:
sumber
<Route path="comments" component={() => (<Comments myProp="value" />)}/>
Jika Anda lebih suka tidak menulis pembungkus, saya kira Anda bisa melakukan ini:
sumber
route
objek polos di komponen Anda. Inilah jawaban dari masalah github: github.com/rackt/react-router/issues/615#issuecomment-100432086Menyalin dari komentar oleh ciantic dalam tanggapan yang diterima:
Ini adalah solusi paling anggun menurut saya. Berhasil. Membantuku.
sumber
_ref
component={(props) => (<Comments myProp="value" location={ props.location } />)}
tetapi semuanya menjadi berantakan lagicomponent={(props) => (<Comments {...props} myProp="value" />)}
untuk menjaga alat suntik yang disuntikkanIni adalah solusi dari Rajesh , tanpa komentar tidak nyaman dari yuji , dan diperbarui untuk React Router 4.
Kode akan seperti ini:
Perhatikan bahwa saya menggunakan
render
bukancomponent
. Alasannya adalah untuk menghindari remounting yang tidak diinginkan . Saya juga meneruskanprops
ke metode itu, dan saya menggunakan alat peraga yang sama pada komponen Komentar dengan operator penyebaran objek (ES7 proposal).sumber
Hanya tindak lanjut dari jawaban ColCh. Sangat mudah untuk abstrak pembungkus komponen:
Saya belum menguji solusi ini sehingga umpan balik apa pun penting.
Penting untuk dicatat bahwa dengan metode ini, semua alat peraga yang dikirim melalui Router (seperti params) akan ditimpa / dihapus.
sumber
return React.createElement(Component, _.assign({}, this.props, props));
(Yang ini menggunakan _.assign untuk menyusun objek gabungan ... metode lain tentu saja tersedia).render
,component
danchildren
metode untukRoute
. Perhatikan bahwa sebagaimana dijawab oleh @dgrcode , Anda harus menggunakanrender
sebagai ganticomponent
Anda bisa melewatkan props dengan meneruskannya ke
<RouteHandler>
(di v0.13.x) atau komponen Route itu sendiri di v1.0;(dari panduan peningkatan di https://github.com/rackt/react-router/releases/tag/v1.0.0 )
Semua penangan anak akan menerima set alat peraga yang sama - ini mungkin berguna atau tidak tergantung pada keadaan.
sumber
React.cloneElement
diteruskan beberapa elemen tetapi tanda tangan fungsi tampaknya hanya mengambil satu elemen reaksi. Saya pikir cuplikan ini dapat dibuat lebih mudah untuk dipahami.React.cloneElement(this.props.children, {myprop: "value"})
atauReact.cloneElement(this.props.children, {myprop: this.props.myprop})
dll.Menggunakan ES6 Anda bisa membuat pembungkus komponen inline:
<Route path="/" component={() => <App myProp={someValue}/>} >
Jika Anda harus melewati anak-anak:
<Route path="/" component={(props) => <App myProp={someValue}>{props.children}</App>} >
sumber
render
sebagai ganticomponent
React-router v4 alpha
sekarang ada cara baru, untuk melakukan ini, walaupun sangat mirip dengan metode sebelumnya.
PS Ini hanya berfungsi dalam versi alpha, dan telah dihapus setelah rilis alpha v4. Di v4 terbaru, sekali lagi, dengan path dan alat peraga yang tepat.
bereaksi-lego contoh aplikasi berisi kode yang melakukan hal ini tepat di route.js pada cabang react-router-4-nya
sumber
Inilah solusi terbersih yang saya buat (React Router v4):
MyComponent
masih memilikiprops.match
danprops.location
, dan telahprops.foo === "lol"
.sumber
Bungkus dengan komponen fungsi stateless:
sumber
Anda juga bisa menggunakan mixin RouteHandler untuk menghindari komponen pembungkus dan lebih mudah menurunkan status induk sebagai alat peraga:
sumber
Anda dapat mengirimkan alat peraga melalui yang
<RouterHandler/>
seperti ini:Kelemahan dari ini adalah Anda melewati alat peraga tanpa pandang bulu. Jadi
Comments
mungkin pada akhirnya menerima alat peraga yang benar-benar ditujukan untuk komponen yang berbeda tergantung pada konfigurasi rute Anda. Ini bukan masalah besar karenaprops
tidak dapat diubah, tetapi ini bisa menjadi masalah jika dua komponen berbeda mengharapkan prop bernamafoo
tetapi dengan nilai yang berbeda.sumber
{...props}
Dalam 1.0 dan 2.0 Anda dapat menggunakan
createElement
penyanggaRouter
untuk menentukan bagaimana tepatnya untuk membuat elemen target Anda. Sumber dokumentasisumber
Anda juga dapat menggabungkan fungsi es6 dan stateless untuk mendapatkan hasil yang jauh lebih bersih:
sumber
this.props
fungsi, yang saya yakin tidak akan berfungsi. Jika Anda menggunakan fungsi murni alih-alih memperluas,React.Component
maka Anda harusprops
memasukkannya sebagai argumen, lihat Bereaksi dokumen tentang Komponen dan Alat PeragaReact Router v 4 solution
Saya menemukan pertanyaan ini sebelumnya hari ini, dan di sini adalah pola yang saya gunakan. Semoga ini bermanfaat bagi siapa saja yang mencari solusi yang lebih terkini.
Saya tidak yakin apakah ini solusi terbaik , tetapi ini adalah pola saya saat ini. Saya biasanya memiliki direktori Core di mana saya menyimpan komponen yang biasa saya gunakan dengan konfigurasi yang relevan (loader, modals, dll), dan saya menyertakan file seperti ini:
Kemudian, dalam file yang dimaksud, saya akan melakukan hal berikut:
Anda akan melihat saya mengimpor ekspor default komponen saya sebagai case camel sederhana, yang memungkinkan saya memberi nama komponen baru yang sadar lokasi di CamelCase sehingga saya dapat menggunakannya secara normal. Selain jalur impor tambahan dan jalur penugasan, komponen berperilaku seperti yang diharapkan dan menerima semua alat peraga secara normal, dengan penambahan semua alat peraga rute. Jadi, saya dengan senang hati dapat mengarahkan kembali dari metode siklus hidup komponen dengan this.props.history.push (), memeriksa lokasi, dll.
Semoga ini membantu!
sumber
Untuk router reaksi 2.x.
dan di rute Anda ...
pastikan param 3 adalah sebuah objek seperti:
{ checked: false }
.sumber
Masalahnya dengan React Router adalah ia merender komponen-komponen Anda sehingga Anda berhenti menggunakan props. The router Navigasi , di sisi lain, memungkinkan Anda membuat komponen sendiri. Itu berarti Anda tidak harus melompati rintangan apa pun untuk melewati alat peraga sebagai kode berikut dan menyertai acara JsFiddle .
sumber
Gunakan komponen dengan atau tanpa router berdasarkan jawaban Rajesh Naroth.
Atau Anda bisa melakukannya dengan cara ini:
sumber
untuk router reaksi 2.5.2, solusinya sangat mudah:
sumber
Menggunakan komponen rute kustom , ini dimungkinkan di React Router v3.
Adapun
<MyRoute>
kode komponen, itu harus seperti:Untuk detail lebih lanjut tentang pendekatan komponen rute kustom, lihat posting blog saya pada subjek: http://marmelab.com/blog/2016/09/20/custom-react-router-component.html
sumber
ini mungkin cara terbaik untuk menggunakan react-router-dom dengan sebuah cookie handler
di index.js
dan gunakan CookieCheck
sumber
sumber
Gunakan solusi seperti di atas dan ini berfungsi di v3.2.5.
atau
sumber