หากคุณกำหนดเป้าหมายสภาพแวดล้อมที่เบราว์เซอร์ที่คุณต้องใช้แพคเกจแทนreact-router-dom react-routerพวกเขาปฏิบัติตามวิธีเดียวกันกับที่ React ทำเพื่อแยกคอร์ ( react) และโค้ดเฉพาะแพล็ตฟอร์ม ( react-dom, react-native) ที่มีความแตกต่างเล็กน้อยที่คุณไม่จำเป็นต้องติดตั้งสองแพ็คเกจแยกกันดังนั้นแพ็คเกจสภาพแวดล้อมจึงมีทุกสิ่ง คุณต้องการ. คุณสามารถเพิ่มลงในโครงการของคุณเป็น:
yarn add react-router-dom
หรือ
npm i react-router-dom
สิ่งแรกที่คุณต้องทำคือจัดให้มี<BrowserRouter>ส่วนประกอบหลักที่เป็นพาเรนต์สูงสุดในแอปพลิเคชันของคุณ <BrowserRouter>ใช้ HTML5 historyAPI และจัดการให้กับคุณดังนั้นคุณไม่ต้องกังวลเกี่ยวกับการสร้างอินสแตนซ์ด้วยตนเองและส่งผ่านไปยัง<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.- การใช้withRouterHoC
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) ตำแหน่งใหม่ถูกจัดเตรียมโดย
toprop ซึ่งอาจเป็นสตริง (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 ที่ยอดเยี่ยมโดยเน้นการเปลี่ยนแปลงที่สำคัญบางอย่าง