หมายเหตุคำตอบนี้ครอบคลุม React Router เวอร์ชัน 0.13.x - เวอร์ชัน 1.0 ที่กำลังจะมาถึงดูเหมือนว่าจะมีรายละเอียดการใช้งานที่แตกต่างกันอย่างมาก
เซิร์ฟเวอร์
นี่เป็นขั้นต่ำที่server.js
มี react-router:
var express = require('express')
var React = require('react')
var Router = require('react-router')
var routes = require('./routes')
var app = express()
// ...express config...
app.use(function(req, res, next) {
var router = Router.create({location: req.url, routes: routes})
router.run(function(Handler, state) {
var html = React.renderToString(<Handler/>)
return res.render('react_page', {html: html})
})
})
ที่routes
โมดูลส่งออกรายการเส้นทาง:
var React = require('react')
var {DefaultRoute, NotFoundRoute, Route} = require('react-router')
module.exports = [
<Route path="/" handler={require('./components/App')}>
{/* ... */}
</Route>
]
ทุกครั้งที่มีการร้องขอไปยังเซิร์ฟเวอร์คุณจะสร้างRouter
อินสแตนซ์แบบใช้ครั้งเดียวที่กำหนดค่าด้วย URL ขาเข้าเป็นตำแหน่งคงที่ซึ่งจะแก้ไขกับโครงสร้างของเส้นทางเพื่อตั้งค่าเส้นทางที่ตรงกันที่เหมาะสมเรียกกลับด้วยระดับบนสุด ตัวจัดการเส้นทางที่จะแสดงผลและบันทึกว่าเส้นทางย่อยใดที่ตรงกับแต่ละระดับ นี่คือสิ่งที่ได้รับการปรึกษาเมื่อคุณใช้<RouteHandler>
ส่วนประกอบภายในองค์ประกอบการจัดการเส้นทางเพื่อแสดงเส้นทางลูกที่ตรงกัน
หากผู้ใช้ปิดใช้งาน JavaScript หรือโหลดช้าลิงก์ใด ๆ ที่คลิกจะเข้าสู่เซิร์ฟเวอร์อีกครั้งซึ่งได้รับการแก้ไขอีกครั้งตามด้านบน
ลูกค้า
นี่เป็นขั้นต่ำที่client.js
มี react-router (ใช้โมดูลเส้นทางเดิมซ้ำ):
var React = require('react')
var Router = require('react-router')
var routes = require('./routes')
Router.run(routes, Router.HistoryLocation, function(Handler, state) {
React.render(<Handler/>, document.body)
})
เมื่อคุณโทรRouter.run()
มันจะสร้างอินสแตนซ์เราเตอร์สำหรับคุณอยู่เบื้องหลังซึ่งจะถูกนำมาใช้ใหม่ทุกครั้งที่คุณสำรวจรอบ ๆ แอพเนื่องจาก URL สามารถเป็นแบบไดนามิกบนไคลเอนต์ซึ่งตรงข้ามกับบนเซิร์ฟเวอร์ที่คำขอเดียวมี URL คงที่
ในกรณีนี้เรากำลังใช้สิ่งHistoryLocation
ที่ใช้History
APIเพื่อให้แน่ใจว่าสิ่งที่ถูกต้องจะเกิดขึ้นเมื่อคุณกดปุ่มย้อนกลับ / ไปข้างหน้า นอกจากนี้ยังมีHashLocation
การเปลี่ยนแปลง URL hash
เพื่อสร้างรายการประวัติและรับฟังwindow.onhashchange
เหตุการณ์เพื่อทริกเกอร์การนำทาง
เมื่อคุณใช้<Link>
ส่วนประกอบของ react-router คุณจะต้องให้to
prop ซึ่งเป็นชื่อของเส้นทางรวมทั้งข้อมูลใด ๆparams
และquery
ข้อมูลที่เส้นทางต้องการ การ<a>
แสดงผลโดยคอมโพเนนต์นี้มีonClick
ตัวจัดการซึ่งท้ายที่สุดจะเรียกrouter.transitionTo()
อินสแตนซ์ของเราเตอร์พร้อมกับอุปกรณ์ประกอบฉากที่คุณให้ลิงก์ซึ่งมีลักษณะดังนี้:
/**
* Transitions to the URL specified in the arguments by pushing
* a new URL onto the history stack.
*/
transitionTo: function (to, params, query) {
var path = this.makePath(to, params, query);
if (pendingTransition) {
// Replace so pending location does not stay in history.
location.replace(path);
} else {
location.push(path);
}
},
สำหรับลิงก์ปกติสิ่งนี้จะเรียกlocation.push()
ว่าตำแหน่งประเภทใดที่คุณใช้ในที่สุดซึ่งจะจัดการรายละเอียดของการตั้งค่าประวัติดังนั้นการนำทางด้วยปุ่มย้อนกลับและปุ่มไปข้างหน้าจะใช้งานได้จากนั้นโทรกลับไปที่router.handleLocationChange()
เพื่อแจ้งให้เราเตอร์ทราบว่าสามารถดำเนินการเปลี่ยนเป็น เส้นทาง URL ใหม่
จากนั้นเราเตอร์จะเรียกrouter.dispatch()
เมธอดของตัวเองด้วย URL ใหม่ซึ่งจัดการรายละเอียดของการกำหนดว่าเส้นทางใดที่กำหนดค่าไว้ตรงกับ URL จากนั้นจึงเรียกใช้การเปลี่ยนแปลงที่มีอยู่สำหรับเส้นทางที่ตรงกัน คุณสามารถใช้ตะขอการเปลี่ยนเหล่านี้กับตัวจัดการเส้นทางใด ๆ ของคุณเพื่อดำเนินการบางอย่างเมื่อเส้นทางกำลังจะถูกนำออกจากหรือไปที่โดยสามารถยกเลิกการเปลี่ยนแปลงได้หากสิ่งต่างๆไม่เป็นที่ต้องการของคุณ
หากการเปลี่ยนแปลงไม่ถูกยกเลิกขั้นตอนสุดท้ายคือการโทรกลับที่คุณให้Router.run()
ด้วยองค์ประกอบตัวจัดการระดับบนสุดและออบเจ็กต์สถานะพร้อมรายละเอียดทั้งหมดของ URL และเส้นทางที่ตรงกัน คอมโพเนนต์ตัวจัดการระดับบนสุดคือRouter
อินสแตนซ์เองซึ่งจัดการการเรนเดอร์ตัวจัดการเส้นทางบนสุดที่ตรงกัน
กระบวนการข้างต้นจะถูกเรียกใช้ใหม่ทุกครั้งที่คุณไปที่ URL ใหม่บนไคลเอนต์
ตัวอย่างโครงการ