- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试找到一种方法来显示自定义组件(如模态)以使用 Prompt
确认路线更改组件。
Promp
的默认行为组件的作用是显示一个带有消息的确认对话框,如您在 Example: React Router: Preventing Transitions. 中看到的那样
注意:我正在使用<BrowserRouter>
组件。
路由器有 prop
命名getUserConfirmation
,您可以使用它来自定义 <Prompt>
的行为组件。
// this is the default behavior
function getConfirmation(message, callback) {
const allowTransition = window.confirm(message);
callback(allowTransition);
}
<BrowserRouter getUserConfirmation={getConfirmation} />;
我正在尝试做什么:
confirm
状态为true,显示<Confirm>
组件callback
来自getConfirmation
功能到<Confirm>
组件以 true
调用它允许过渡,并使用 false
来防止它。true or false
调用回调正如您在上面看到的默认行为。function getConfirmation(message, callback) {
console.log("Inside getConfirmation function...");
setConfirmCallback(callback);
setConfirm(true);
// const allowTransition = window.confirm(message);
// callback(allowTransition);
}
这就是 App.js 正在渲染的内容:
return (
<Router getUserConfirmation={getConfirmation}>
<AllRoutes />
{confirm && (
<Confirm confirmCallback={confirmCallback} setConfirm={setConfirm} />
)}
</Router>
);
问题所在:
confirm
对话框似乎在此时阻止了该功能。所以callback
变量/参数仍在范围内。所以一切正常。confirm
时对话框中,该函数一直运行。当我单击 <Confirm>
内的确认按钮时组件,callback
不再存在。问题
有谁知道使用 react-router-dom
实现此行为的方法(使用自定义组件而不是确认对话框来防止路由更改) ?
来自 CodeSandbox 的完整代码:
import React, { useState } from "react";
import ReactDOM from "react-dom";
import {
BrowserRouter as Router,
Route,
Switch,
Link,
Prompt
} from "react-router-dom";
import "./styles.css";
function App() {
console.log("Rendering App...");
const [confirm, setConfirm] = useState(false);
const [confirmCallback, setConfirmCallback] = useState(null);
function getConfirmation(message, callback) {
console.log("Inside getConfirmation function...");
setConfirmCallback(callback);
setConfirm(true);
// const allowTransition = window.confirm(message);
// callback(allowTransition);
}
return (
<Router getUserConfirmation={getConfirmation}>
<AllRoutes />
{confirm && (
<Confirm confirmCallback={confirmCallback} setConfirm={setConfirm} />
)}
</Router>
);
}
function Confirm(props) {
function allowTransition() {
props.setConfirm(false);
props.confirmCallback(true);
}
function blockTransition() {
props.setConfirm(false);
props.confirmCallback(false);
}
return (
<React.Fragment>
<div>Are you sure?</div>
<button onClick={allowTransition}>Yes</button>
<button onClick={blockTransition}>No way</button>
</React.Fragment>
);
}
function AllRoutes(props) {
console.log("Rendering AllRoutes...");
return (
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/comp1" component={Component1} />
</Switch>
);
}
function Home(props) {
console.log("Rendering Home...");
return (
<React.Fragment>
<div>This is Home</div>
<ul>
<li>
<Link to="/comp1">Component1</Link>
</li>
</ul>
</React.Fragment>
);
}
function Component1(props) {
console.log("Rendering Component1...");
const [isBlocking, setIsBlocking] = useState(true);
return (
<React.Fragment>
<Prompt
when={isBlocking}
message={location =>
`Are you sure you want to go to ${location.pathname}`
}
/>
<div>This is component 1</div>
<Link to="/">Home</Link>
</React.Fragment>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
最佳答案
受到此启发discussion并由此 example ,我能够使我的示例正常工作。
问题是当 <Confirm>
正在创建,setConfirmCallback()
通话尚未完成。所以<Confirm>
组件无法使用 callback
来自getUserConfirmation
.
所以我改变了这一行:
FROM:
setConfirmCallback(callback);
TO:
setConfirmCallback(()=>callback);
现在可以了!
完整的CodeSandbox代码:
import React, { useState } from "react";
import ReactDOM from "react-dom";
import {
BrowserRouter as Router,
Route,
Switch,
Link,
Prompt
} from "react-router-dom";
import "./styles.css";
function App() {
console.log("Rendering App...");
const [confirm, setConfirm] = useState(false);
const [confirmCallback, setConfirmCallback] = useState(null);
function getConfirmation(message, callback) {
console.log("Inside getConfirmation function...");
setConfirmCallback(() => callback);
setConfirm(true);
// const allowTransition = window.confirm(message);
// callback(allowTransition);
}
return (
<Router getUserConfirmation={getConfirmation}>
<AllRoutes />
{confirm && (
<Confirm confirmCallback={confirmCallback} setConfirm={setConfirm} />
)}
</Router>
);
}
function Confirm(props) {
console.log("Rendering Confirm...");
function allowTransition() {
props.setConfirm(false);
props.confirmCallback(true);
}
function blockTransition() {
props.setConfirm(false);
props.confirmCallback(false);
}
return (
<React.Fragment>
<div>Are you sure?</div>
<button onClick={allowTransition}>Yes</button>
<button onClick={blockTransition}>No way</button>
</React.Fragment>
);
}
function AllRoutes(props) {
console.log("Rendering AllRoutes...");
return (
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/comp1" component={Component1} />
</Switch>
);
}
function Home(props) {
console.log("Rendering Home...");
return (
<React.Fragment>
<div>This is Home</div>
<ul>
<li>
<Link to="/comp1">Component1</Link>
</li>
</ul>
</React.Fragment>
);
}
function Component1(props) {
console.log("Rendering Component1...");
const [isBlocking, setIsBlocking] = useState(true);
return (
<React.Fragment>
<Prompt
when={isBlocking}
message={location =>
`Are you sure you want to go to ${location.pathname}`
}
/>
<div>This is component 1</div>
<Link to="/">Home</Link>
</React.Fragment>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
关于javascript - 如何使用react-router <Prompt>显示组件以防止或允许路由更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56664622/
我正在学习使用 PowerShell 编写脚本,我发现这段代码可以帮助我完成一个项目 该示例来自 Is there a one-liner for using default values with
出于好奇,window.prompt 和 JavaScript 中的 prompt 之间有什么区别。 老师用的我考试题的答案之一 var yourName = window.prompt("Pleas
我正在使用 Phonegap 构建一个应用程序我正在使用 javascript 提示输入类别名称,效果很好 var newcat=prompt("ADD CATEGORY",""); 我想将其
我正在使用 Anaconda 学习 Python。早些时候我只有 Anaconda Prompt。但是最近通过 更新了 Anaconda 之后 conda update conda 我是来看Anaco
我有一个对话框,其中有多个提示(Prompts.text, Prompts.number, Prompts.Choice,提示.确认)。虽然 Prompts.choice 和 Prompts.conf
我有一个引用参数“Year_Parameter”的值提示,以及一个包含一列(数据项表达式)的列表,该列表以这种方式引用与值提示相同的参数: #prompt('Year_Parameter')# 值提示
我正在尝试从绘制 ZSH shell 提示的函数中将当前光标位置(当前行号和列)读入一个变量中。我的目标是在提示下方显示内容,仅当有足够多的空行不会导致额外滚动时。 在交互式 shell 中,我可以使
有什么(支持的)方法可以做到这一点吗? IIRC 当使用“比 X 更暗”的色调颜色时,它通常会在某个时刻自行切换为白色,但我们的方案似乎处于边缘。 最佳答案 在 iOS5 中可以实现: [[UINav
如果生成的列表对于打开的命令提示符窗口的高度来说太长(就像这个长分支列表),它就会卡在这里。它首先显示适合窗口的内容,然后显示 :,如果按 ↓,您将到达列表的末尾,并显示 (END) 如何摆脱这种情况
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
例如,我想删除 AppData/Roaming/MyFolder/myfile.txt 中的文件。 我使用命令提示符并输入:del %userprofile%/AppData/Roaming/MyFo
例如,我想删除 AppData/Roaming/MyFolder/myfile.txt 中的文件。 我使用命令提示符并输入:del %userprofile%/AppData/Roaming/MyFo
这个问题已经有答案了: Is there a destructor for Java? (24 个回答) 已关闭 8 年前。 我正在将一些 C++ 代码移植到 Java,这些代码使用非常常见的 C++
在android中我定义了一个布局如下: ... 但由于某些原因,当我启动相应的 Activity 时,微调器的 android:promp 文本未显示。为了完整起见
代码是这样的: for(var node=iterator.iterateNext(),origin_background=node.style.background;node;node=iterat
仅当用户在提示中单击取消 时,下面的代码才会运行alert('Please enter your name!');。如果用户未在提示框中输入任何内容并单击 Enter,我试图让代码也运行所述警报。但是
我想知道是否可以根据当前路径或pwd值更改PS1? 例如: cd /home/user/directory1 PS1=[\e[1;32m\u\e[m@\e[1;34m\h\e[m \e[1;33m\W
这是一个奇怪的问题,我无法通过 Google 找到好的答案(当然,我总是有可能会失败)。在我的 bash 提示符下,如果我给提示符的一部分涂上颜色,当我按“向上”键转到上一个命令时,在超过一定数量的字
有没有办法验证javascript中调用window.prompt()显示的提示框的输入textBox的文本? 我的意思是,如果输入文本框中写入的字符串包含数字或我定义的其他非法字符等,则在单击“确定
我正在努力使用 HTML 代码来验证外部 js 文件中 Javascript Prompt() 的输入。我了解调用 Javascript 函数进行验证,并且知道如何编写该函数,但是如何“监听”HTML
我是一名优秀的程序员,十分优秀!