หากคุณกำหนดเป้าหมายสภาพแวดล้อมที่เบราว์เซอร์ที่คุณต้องใช้แพคเกจแทนreact-router-dom
react-router
พวกเขาปฏิบัติตามวิธีเดียวกันกับที่ React ทำเพื่อแยกคอร์ ( react
) และโค้ดเฉพาะแพล็ตฟอร์ม ( react-dom
, react-native
) ที่มีความแตกต่างเล็กน้อยที่คุณไม่จำเป็นต้องติดตั้งสองแพ็คเกจแยกกันดังนั้นแพ็คเกจสภาพแวดล้อมจึงมีทุกสิ่ง คุณต้องการ. คุณสามารถเพิ่มลงในโครงการของคุณเป็น:
yarn add react-router-dom
หรือ
npm i react-router-dom
สิ่งแรกที่คุณต้องทำคือจัดให้มี<BrowserRouter>
ส่วนประกอบหลักที่เป็นพาเรนต์สูงสุดในแอปพลิเคชันของคุณ <BrowserRouter>
ใช้ HTML5 history
API และจัดการให้กับคุณดังนั้นคุณไม่ต้องกังวลเกี่ยวกับการสร้างอินสแตนซ์ด้วยตนเองและส่งผ่านไปยัง<BrowserRouter>
คอมโพเนนต์ในรูปแบบ prop (ตามที่คุณจำเป็นต้องทำในเวอร์ชันก่อนหน้า)
ใน V4 สำหรับการนำทางโดยทางโปรแกรมคุณจำเป็นต้องเข้าถึงhistory
ออบเจกต์ซึ่งมีให้ผ่าน React context
ตราบใดที่คุณมีส่วนประกอบของ<BrowserRouter>
ผู้ให้บริการเป็นพาเรนต์สูงสุดในแอปพลิเคชันของคุณ ไลบรารีจะเปิดเผยตามบริบทที่router
วัตถุนั้นมีอยู่history
เป็นคุณสมบัติ history
อินเตอร์เฟซที่นำเสนอวิธีการนำทางต่างๆเช่นpush
, replace
และgoBack
อื่น ๆ ในกลุ่ม ท่านสามารถตรวจสอบรายชื่อทั้งหมดของคุณสมบัติและวิธีการที่นี่
หมายเหตุสำคัญสำหรับผู้ใช้ Redux / Mobx
หากคุณกำลังใช้ redux หรือ mobx เป็นไลบรารีการจัดการสถานะของคุณในแอปพลิเคชันของคุณคุณอาจพบปัญหาเกี่ยวกับส่วนประกอบที่ควรทราบตำแหน่ง แต่จะไม่ถูกแสดงผลซ้ำหลังจากเรียกการอัพเดต URL
เกิดขึ้นเพราะreact-router
ส่งผ่านlocation
ไปยังส่วนประกอบโดยใช้โมเดลบริบท
ทั้งการเชื่อมต่อและผู้สังเกตการณ์สร้างส่วนประกอบที่มีวิธีการ ComponentUpdate ทำการเปรียบเทียบตื้น ๆ ของอุปกรณ์ประกอบฉากในปัจจุบันและอุปกรณ์ประกอบฉากต่อไปของพวกเขา ส่วนประกอบเหล่านั้นจะแสดงผลซ้ำเมื่อเปลี่ยนเสาอย่างน้อยหนึ่งเสา ซึ่งหมายความว่าเพื่อให้แน่ใจว่าพวกเขาอัปเดตเมื่อมีการเปลี่ยนแปลงสถานที่พวกเขาจะต้องได้รับเสาที่เปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงสถานที่
2 แนวทางสำหรับการแก้ปัญหานี้คือ:
- ห่อของคุณเชื่อมต่อ
<Route />
องค์ประกอบในไม่มีทางไป location
วัตถุปัจจุบันเป็นหนึ่งในอุปกรณ์ประกอบฉากที่<Route>
ผ่านไปยังส่วนประกอบที่มันแสดงผล
- ห่อส่วนประกอบที่เชื่อมต่อของคุณด้วยส่วนประกอบลำดับ
withRouter
สูงกว่าซึ่งอันที่จริงมีผลเหมือนกันและlocation
ใช้เป็นเสาแทน
นอกจากนั้นยังมีสี่วิธีในการนำทางโดยเรียงลำดับตามคำแนะนำ:
1.- การใช้<Route>
ชิ้นส่วน
มันส่งเสริมสไตล์ที่เปิดเผย ก่อนหน้า v4
<Route />
ส่วนประกอบถูกวางไว้ที่ด้านบนสุดของลำดับชั้นส่วนประกอบของคุณโดยไม่ต้องคิดถึงโครงสร้างเส้นทางของคุณก่อน อย่างไรก็ตามตอนนี้คุณสามารถมี
<Route>
ส่วนประกอบ
ได้ทุกที่ในทรีของคุณเพื่อให้คุณสามารถควบคุมการแสดงผลได้อย่างมีเงื่อนไขขึ้นอยู่กับ URL
Route
อัดฉีด
match
,
location
และ
history
เป็นอุปกรณ์ประกอบฉากเข้าไปในคอมโพเนนต์ของคุณ วิธีนำทาง (เช่น
push
,
replace
,
goBack
... ) มีอยู่เป็นคุณสมบัติของ
history
วัตถุ
มี 3 วิธีที่จะทำให้สิ่งที่มีอยู่Route
โดยใช้อย่างใดอย่างหนึ่งcomponent
, render
หรือchildren
อุปกรณ์ประกอบฉาก Route
แต่ไม่ได้ใช้มากกว่าหนึ่งในเดียวกัน ตัวเลือกขึ้นอยู่กับกรณีการใช้งาน แต่โดยทั่วไปแล้วสองตัวเลือกแรกจะแสดงองค์ประกอบของคุณหากpath
ตรงกับตำแหน่ง URL ในขณะchildren
ที่องค์ประกอบจะถูกแสดงว่าเส้นทางตรงกับตำแหน่งหรือไม่ (มีประโยชน์สำหรับการปรับ UI ตาม URL การจับคู่)
หากคุณต้องการที่จะกำหนดผลลัพธ์การแสดงผลของคุณองค์ประกอบคุณจะต้องห่อคอมโพเนนต์ของคุณในการทำงานและใช้render
ตัวเลือกเพื่อที่จะผ่านไปยังส่วนของอุปกรณ์ประกอบฉากอื่น ๆ ที่คุณต้องการนอกเหนือจากmatch
, และlocation
history
ตัวอย่างที่แสดงให้เห็น:
import { BrowserRouter as Router } from 'react-router-dom'
const ButtonToNavigate = ({ title, history }) => (
<button
type="button"
onClick={() => history.push('/my-new-location')}
>
{title}
</button>
);
const SomeComponent = () => (
<Route path="/" render={(props) => <ButtonToNavigate {...props} title="Navigate elsewhere" />} />
)
const App = () => (
<Router>
<SomeComponent /> // Notice how in v4 we can have any other component interleaved
<AnotherComponent />
</Router>
);
2.- การใช้withRouter
HoC
Route
องค์ประกอบการสั่งซื้อที่สูงขึ้นนี้จะฉีดอุปกรณ์ประกอบฉากเดียวกับ อย่างไรก็ตามมันมีข้อ จำกัด ที่คุณสามารถมีได้เพียง 1 HoC ต่อไฟล์
import { withRouter } from 'react-router-dom'
const ButtonToNavigate = ({ history }) => (
<button
type="button"
onClick={() => history.push('/my-new-location')}
>
Navigate
</button>
);
ButtonToNavigate.propTypes = {
history: React.PropTypes.shape({
push: React.PropTypes.func.isRequired,
}),
};
export default withRouter(ButtonToNavigate);
3.- การใช้Redirect
ส่วนประกอบ
การแสดงผล
<Redirect>
จะนำทางไปยังตำแหน่งใหม่ แต่โปรดทราบว่า
ตามค่าเริ่มต้นตำแหน่งปัจจุบันจะถูกแทนที่ด้วยตำแหน่งใหม่เช่นการเปลี่ยนเส้นทางฝั่งเซิร์ฟเวอร์ (HTTP 3xx) ตำแหน่งใหม่ถูกจัดเตรียมโดย
to
prop ซึ่งอาจเป็นสตริง (URL เพื่อเปลี่ยนเส้นทาง) หรือ
location
วัตถุ หากคุณต้องการที่จะ
ผลักดันรายการใหม่เข้าสู่ประวัติศาสตร์แทนผ่าน
push
เสาเช่นกันและตั้งเป็น
true
<Redirect to="/your-new-location" push />
4.- การเข้าถึงrouter
ด้วยตนเองผ่านบริบท
ท้อใจเล็กน้อยเนื่องจาก
บริบทยังคงเป็น API ทดลองและมีแนวโน้มที่จะแตก / เปลี่ยนแปลงใน React ในอนาคต
const ButtonToNavigate = (props, context) => (
<button
type="button"
onClick={() => context.router.history.push('/my-new-location')}
>
Navigate to a new location
</button>
);
ButtonToNavigate.contextTypes = {
router: React.PropTypes.shape({
history: React.PropTypes.object.isRequired,
}),
};
ไม่จำเป็นต้องบอกว่ายังมีส่วนประกอบเราเตอร์อื่น ๆ ที่มีไว้สำหรับระบบนิเวศที่ไม่ใช่เบราว์เซอร์เช่น<NativeRouter>
ที่ทำซ้ำการนำทางสแต็คในหน่วยความจำและเป้าหมายแพลตฟอร์มตอบโต้พื้นเมืองที่มีอยู่ผ่านreact-router-native
แพคเกจ
สำหรับการอ้างอิงเพิ่มเติมใด ๆ ไม่ลังเลที่จะใช้เวลาดูที่เอกสารอย่างเป็นทางการ นอกจากนี้ยังมีวิดีโอที่สร้างโดยหนึ่งในผู้เขียนร่วมของไลบรารีที่ให้คำแนะนำเกี่ยวกับ react-router v4 ที่ยอดเยี่ยมโดยเน้นการเปลี่ยนแปลงที่สำคัญบางอย่าง