ใน react-router v2.4.0
หรือสูงกว่าและก่อนหน้าv4
นี้มีหลายตัวเลือก
- เพิ่มฟังก์ชัน
onLeave
สำหรับRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- ใช้ฟังก์ชัน
setRouteLeaveHook
สำหรับcomponentDidMount
คุณสามารถป้องกันไม่ให้มีการเปลี่ยนแปลงเกิดขึ้นหรือแจ้งให้ผู้ใช้ทราบก่อนออกจากเส้นทางโดยใช้ตะขอลา
const Home = withRouter(
React.createClass({
componentDidMount() {
this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave)
},
routerWillLeave(nextLocation) {
// return false to prevent a transition w/o prompting the user,
// or return a string to allow the user to decide:
// return `null` or nothing to let other hooks to be executed
//
// NOTE: if you return true, other hooks will not be executed!
if (!this.state.isSaved)
return 'Your work is not saved! Are you sure you want to leave?'
},
// ...
})
)
โปรดทราบว่าตัวอย่างนี้ใช้ประโยชน์จากไฟล์ withRouter
องค์ประกอบลำดับที่สูงกว่าที่นำมาใช้v2.4.0.
อย่างไรก็ตามโซลูชันเหล่านี้ทำงานได้ไม่สมบูรณ์เมื่อเปลี่ยนเส้นทางใน URL ด้วยตนเอง
ในแง่ที่ว่า
- เราเห็นการยืนยัน - ตกลง
- มีหน้าไม่โหลด - ตกลง
- URL ไม่เปลี่ยนแปลง - ไม่เป็นไร
สำหรับการreact-router v4
ใช้ Prompt หรือประวัติแบบกำหนดเอง:
อย่างไรก็ตามในreact-router v4
การใช้งานค่อนข้างง่ายกว่าด้วยความช่วยเหลือของPrompt
React-router
ตามเอกสารประกอบ
พร้อมท์
ใช้เพื่อแจ้งผู้ใช้ก่อนที่จะออกจากหน้า เมื่อแอปพลิเคชันของคุณเข้าสู่สถานะที่ควรป้องกันไม่ให้ผู้ใช้นำทางออกไป (เช่นกรอกแบบฟอร์มครึ่งหนึ่ง) ให้แสดงผล a <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
ข้อความ: สตริง
ข้อความแจ้งให้ผู้ใช้ทราบเมื่อพวกเขาพยายามออกไป
<Prompt message="Are you sure you want to leave?"/>
ข้อความ: func
จะถูกเรียกด้วยตำแหน่งถัดไปและการดำเนินการที่ผู้ใช้พยายามนำทางไป ส่งคืนสตริงเพื่อแสดงข้อความแจ้งแก่ผู้ใช้หรือจริงเพื่ออนุญาตการเปลี่ยนแปลง
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
เมื่อ: bool
แทนที่จะแสดงผล<Prompt>
หลังการ์ดตามเงื่อนไขคุณสามารถแสดงผลได้ตลอดเวลา แต่ส่งผ่านwhen={true}
หรือwhen={false}
ป้องกันหรืออนุญาตการนำทางตามนั้น
ในวิธีการเรนเดอร์ของคุณคุณต้องเพิ่มสิ่งนี้ตามที่ระบุไว้ในเอกสารตามความต้องการของคุณ
อัพเดท:
ในกรณีที่คุณต้องการให้มีการดำเนินการที่กำหนดเองเมื่อการใช้งานกำลังออกจากหน้าคุณสามารถใช้ประโยชน์จากประวัติที่กำหนดเองและกำหนดค่าเราเตอร์ของคุณได้เช่น
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
จากนั้นในส่วนประกอบของคุณคุณสามารถใช้ประโยชน์จากสิ่งที่history.block
ชอบ
import { history } from 'path/to/history';
class MyComponent extends React.Component {
componentDidMount() {
this.unblock = history.block(targetLocation => {
// take your action here
return false;
});
}
componentWillUnmount() {
this.unblock();
}
render() {
//component render here
}
}
componentWillUnmount() { if (confirm('Changes are saved, but not published yet. Do that now?')) { // publish and go away from a specific page } else { // do nothing and go away from a specific page } }
เพื่อให้คุณสามารถเรียกใช้ฟังก์ชันการเผยแพร่ของคุณได้หรือออกจากหน้า