Tôi không thể tìm ra cách hiển thị hộp thoại tùy chỉnh thay vì sử dụng số window.confirm
thông thường routeWillLeave
và history.listenBefore
sử dụng. Về cơ bản tôi đã xây dựng một hệ thống thông báo và kiểm tra xem biểu mẫu có bị bẩn không const { dispatch, history, dirty } = this.props;
Hiển thị hộp thoại tùy chỉnhRouteLeaveHook hoặc history.listenTrước khi phản ứng-bộ định tuyến/redux?
nếu biểu mẫu bị bẩn nghĩa là người dùng chưa lưu thay đổi. Nếu họ thay đổi tuyến đường, tôi muốn hiển thị thông báo của tôi sẽ có hai nút STAY
, IGNORE
, cả hai đều có thể xử lý onClick.
Tôi đã dành một chút thời gian googling và havent đi qua bất kỳ đề cập đến cách tôi có thể thực hiện điều này bằng cách sử dụng routeWillLeave
. Điều gần nhất tôi có thể tìm thấy là sử dụng history.listenBefore
tuy nhiên có tài liệu nói rằng tôi cần phải làm điều này.
let history = createHistory({
getUserConfirmation(message, callback) {
callback(window.confirm(message)) // The default behavior
}
})
Nhưng tôi đang sử dụng browserHistory từ phản ứng-router để bắt đầu cửa hàng của tôi const history = syncHistoryWithStore(browserHistory, store);
Làm thế nào tôi có thể ngăn chặn một sự thay đổi tuyến đường sau khi một liên kết được nhấp, hiển thị một thông báo sử dụng hệ thống thông báo tùy chỉnh của tôi và tùy thuộc vào nút nào được nhấp vào chuyển đổi sang tuyến đường mới hoặc ở lại? Dưới đây là một ví dụ về cách thức hoạt động của hệ thống thông báo của tôi và hướng ive đi vào mà rõ ràng là không hoạt động vì tất cả các trả về này là một chuỗi để hiển thị trong cửa sổ dialog.confirm theo mặc định.
history.listenBefore((location) => {
if(this.props.dirty){
const acceptBtn = {
title: 'STAY',
handler: ignoreRouteChange() //This can be any function I want
}
const denyBtn = {
title: 'IGNORE',
handler: continueRouteChange() //This can be any function I want
}
return dispatch(addNotification({
message: 'You have unsaved changes!',
type: NOTIFICATION_TYPE_WARNING,
duration: 0,
canDismiss: false,
acceptBtn,
denyBtn
}));
return "Usaved changes!"
}
});
Cảm ơn
Tôi vừa trả lời một câu hỏi tương tự ở đây: http://stackoverflow.com/a/35793421/52041 –
Cảm ơn vì điều đó, chỉ vì tò mò bạn đã nghĩ ra giải pháp đó như thế nào? Bạn đã nghiên cứu cách setRouterLeaveHook được triển khai và triển khai lại nó để cung cấp phiên bản asynv hay ..? – Deep
Không, tôi chỉ làm một chút động não với một đồng nghiệp, dựa trên hành vi của setRouterLeaveHook. –