Programmatic navigation with React Router DOM
React is famous for its declarative style. Of course, methods also play an important role.
It is this combination of abstraction and method functionality that makes React so powerful.
The most popular JavaScript libraries today use a declarative approach to building interfaces. React is special because it allows you to build UIs without directly manipulating the DOM.
Despite this high level of abstraction, React still makes room for JavaScript expressions in JSX, the language used to build interfaces.
React Router is the most popular library for navigating React applications. The library provides a <Link>
component that allows developers to create links declaratively, allowing you to navigate to specific URLs seamlessly.
Most of the time, you want to change the URL after clicking a link. However, sometimes this default behavior is not enough, and you, the programmer, may need to redirect the user to another URL.
React Router also opens the door to programmatic navigation. Developers can navigate programmatically by manipulating the history stack.
The library follows the concept of client-side routing, which allows developers to bypass the browser's default behavior and change the URL without sending a request to the server.
To programmatically navigate a React application, first, you must access history
the React object. There are two ways to access this object: BrowserRouter
receiving it as a prop from a React component, or using .useHistory()
React hooks.
历史
The object can have many different uses. In this case, we are concerned with three methods it provides: push()
, , pop()
and replace()
.
React developers can use these to manipulate URLs programmatically.
.push()
The most common and useful way to change URLs programmatically. Let’s know how to perform this operation in different versions of React Router.
This version does not include useHistory
the hook, so the only option is to access history
the object through props. You cannot do this in any React class component.
The component must be rendered by a <BrowserRoute>
(often abbreviated as <Route>
) component in order to access history
the property.
Let’s look at an example.
export default class Sample extends Component {
render() {
return (
<Router>
<Route path="/" component={App}></Route>
</Router>
);
}
}
class App extends Component {
render() {
return (
<button onClick={() => this.props.history.push("samplePath")}>
Change the URL
</button>
);
}
}
App
The component has one element, a button with an event listener. We access the object in props history
and call its .push()
method with one argument: the path we want to navigate to.
However, our component's props object only contains the history object because
react-router
The core React library underwent major changes when version 5.1.0 was released. React version 16.8 introduced powerful hooks that provide more functionality to functional components.
In response to these changes, react-router
the developers behind version 5.1.0 introduced useHistory()
the hook to give functional components easy access to history
the object.
Let's look at this example.
export default function Sample(props) {
return (
<BrowserRouter>
<Route>{<App></App>}</Route>
</BrowserRouter>
);
}
function App(props) {
let historyReference = useHistory();
return (
<button onClick={() => historyReference.push("boo")}>
Navigate Programmatically in React Router 5.1.0+
</button>
);
}
In this case, the parent Sample
component looks more or less the same as before. It has one child, the function component App
.
Child is very different from the previous examples. It's a function component, not a class component like before. And we don't access history
the object through props; instead, we use useHistory()
the hook.
请注意
, if the component is not a custom component subcomponent, the history<Route>
object cannot be accessed even with hooks . Hooks only change the way we access the history object.useHistory()
In the example above, we history
store the object returned by the hook historyReference
in the variable. We then call the method on the variable .push()
and provide a parameter to specify the path.
useHistory()
history
Hooks are the simplest way to access the object when writing functional components .
If you prefer to use class components, you can still use the solution described in the previous section even if your react-router
installation is version 5.1.0 or higher.
react-router
The latest version of contains a new and improved useNavigate()
hook. It returns a function specifically for programmatic navigation.
The latest React Router documentation recommends using this hook to programmatically change the URL.
function NavigateApp(){
let navigate = useNavigate();
return (
<button onClick={() => navigate("boo")}>
Navigate Programmatically in React Router 6.1.0+
</button>
);
}
It works in useHistory()
much the same way as Hooks. useHistory()
Unlike Hooks, there are a few differences: it returns a function, not a reference to an object.
navigate
Instead of calling the object's method, we store the function in a variable to call it directly .push()
. It takes the same arguments as the above method, a string specifying the target path.
For reprinting, please send an email to 1244347461@qq.com for approval. After obtaining the author's consent, kindly include the source as a link.
Related Articles
How to reverse an array in React
Publish Date:2025/03/13 Views:198 Category:React
-
在 React 中反转数组:使用扩展语法 `(...)` 创建数组的浅表副本。在副本上调用 `reverse()` 方法。将结果存储在变量中。
Setting data attributes in React
Publish Date:2025/03/13 Views:84 Category:React
-
要在 React 中为元素设置 data 属性,请直接在元素上设置属性,例如 或使用 setAttribute() 方法,例如 el.setAttribute('data-foo', 'bar')。 我们可以访问事件对象上的元素或
Toggle a class on click in React
Publish Date:2025/03/13 Views:153 Category:React
-
要在 React 中单击时切换类:在元素上设置 onClick 属性。将活动状态存储在状态变量中。使用三元运算符有条件地添加类。
Sorting an array of objects in React
Publish Date:2025/03/13 Views:77 Category:React
-
在 React 中对对象数组进行排序: 创建数组的浅拷贝。 调用数组的 `sort()` 方法,传递给它一个函数。 该函数用于定义排序顺序。
Generate a random number in React
Publish Date:2025/03/13 Views:189 Category:React
-
使用 Math.random() 函数在 React 中生成一个随机数,例如 Math.floor(Math.random() * (max - min + 1)) + min。 Math.random 函数返回 0 到小于 1 范围内的数字,但也可用于生成特定范围内的数字。
Open links in new tabs with React
Publish Date:2025/03/13 Views:76 Category:React
-
要在 React 的新选项卡中打开链接,请使用 a 元素并将其 `target` 属性设置为 _blank,例如 。 _blank 值表示资源已加载到新选
How to set target=_blank in React
Publish Date:2025/03/13 Views:199 Category:React
-
要在 React 中将元素的目标属性设置为 _blank,请使用锚元素并设置 rel 属性,例如 。 _blank 值表示资源已加载到新选项卡中。
Showing hover elements in React
Publish Date:2025/03/13 Views:177 Category:React
-
要在 React 中显示悬停元素:在元素上设置 `onMouseOver` 和 `onMouseOut` 属性。 跟踪用户是否将鼠标悬停在状态变量中的元素上。 根据状态变量有条件地渲染其他元素。
Passing components as props in React
Publish Date:2025/03/13 Views:164 Category:React
-
我们可以使用内置的 children 属性在 React 中将组件作为属性 props 传递。 我们在组件的开始标签和结束标签之间传递的所有元素都会分配给 children 属性。