Kar*_*oth 6 reactjs react-router react-router-v4
对于页面具有内部路由的用例,即使导航到可能不需要提示的内部路由,提示也会触发,请参见代码示例。导航到已知的安全路线时,是否可以禁用提示?
import React, {Component} from 'react';
import {BrowserRouter, Route, Switch, Link, Prompt} from 'react-router-dom';
export default class App extends Component {
render() {
return (
<BrowserRouter>
<Switch>
<Route component={About} path={"/about"}/>
<Route component={Home} path={"/"}/>
</Switch>
</BrowserRouter>
);
}
}
class Home extends Component {
constructor(props) {
super(props);
this.state = {input: 'hello?'}
}
render() {
return (
<div>
<h1>Home</h1>
<input value={this.state.input}
onChange={(e) => this.setState({input: e.target.value})}/><br />
<Link to={"/info"}>More Info</Link><br />
<Link to={"/about"}>About Page</Link><br />
{/*Triggers even when going to /info which is unnecessary*/}
<Prompt message="Move away?" when={this.state.input !== 'hello?'}/>
<Route path={"/info"} component={Info}/>
</div>
);
}
}
class About extends Component {
render() {
return (
<h1>About page</h1>
);
}
}
class Info extends Component {
render() {
return (
<p>Here be some more info</p>
);
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,“关于”是一个不同的页面,因此应在输入更改后触发,并正确执行。但是/ info路由是Home的内部路由,因此不需要提示,导航后会保留Home的内部状态,因此不会丢失任何内容。
此处的实际用例是在激活路由时显示模式,但这主要是CSS内容,因此我从示例中排除了它。
我认为您正在寻找作为消息道具的回调函数。您可以尝试为Prompt的消息属性提供回调函数。该回调将以一个对象作为参数进行调用,该对象将具有有关下一条路线的所有信息。
这是文档说明的内容:
讯息:功能
将与用户尝试导航到的下一个位置和操作一起调用。返回一个字符串以向用户显示提示,或者返回true以允许过渡。
该对象具有一个pathname属性,该属性是下一条路径,通过检查它可以确定该路径是否安全。这是我在说的:
<Prompt message={(params) =>
params.pathname == '/about' ? "Move away?" : true } />
Run Code Online (Sandbox Code Playgroud)
这是我从您的示例中创建的带有工作代码的笔。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2520 次 |
| 最近记录: |