How to programmatically navigate using React Router? With react-router I can use the Link element to create links which are natively handled by react router. I see internally it calls this.context.transitionTo(...). I want to do a navigation. Not from a link, but from a dropdown selection (as an ...
Find the index of the array element you want to remove using indexOf, and then remove that index with splice. The splice() method changes the contents of an array by removing existing elements and/or adding new elements. const array = [2, 5, 9]; console.log(array); const index = array.indexOf(5); ifRead more
Find the index of the array element you want to remove using indexOf, and then remove that index with splice.
The splice() method changes the contents of an array by removing existing elements and/or adding new elements.
const array = [2, 5, 9];
console.log(array);
const index = array.indexOf(5);
if (index > -1) { // only splice array when item is found
array.splice(index, 1); // 2nd parameter means remove one item only
}
// array = [2, 9]
console.log(array);
The second parameter of splice is the number of elements to remove. Note that splice modifies the array in place and returns a new array containing the elements that have been removed.
For completeness, here are functions. The first function removes only a single occurrence (e.g., removing the first match of 5 from [2,5,9,1,5,8,5]), while the second function removes all occurrences:
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if (arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}
// Usage
console.log(removeItemOnce([2,5,9,1,5,8,5], 5))
console.log(removeItemAll([2,5,9,1,5,8,5], 5))
In TypeScript, these functions can stay type-safe with a type parameter:
function removeItem<T>(arr: Array<T>, value: T): Array<T> {
const index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
See less
The useHistory() hook is now deprecated. If you are using React Router 6, the proper way to navigate programmatically is as follows: import { useNavigate } from "react-router-dom"; function HomeButton() { const navigate = useNavigate(); function handleClick() { navigate("/home"); } return ( <buttRead more
The
useHistory()hook is now deprecated. If you are using React Router 6, the proper way to navigate programmatically is as follows:There is a new
useHistoryhook in React Router >5.1.0 if you are using React >16.8.0 and functional components.With v4 of React Router, there are three approaches that you can take to programmatic routing within components.
withRouterhigher-order component.<Route>context.React Router is mostly a wrapper around the
historylibrary.historyhandles interaction with the browser’swindow.historyfor you with its browser and hash histories. It also provides a memory history which is useful for environments that don’t have a global history. This is particularly useful in mobile app development (react-native) and unit testing with Node.A
historyinstance has two methods for navigating:pushandreplace. If you think of thehistoryas an array of visited locations,pushwill add a new location to the array andreplacewill replace the current location in the array with the new one. Typically you will want to use thepushmethod when you are navigating.In earlier versions of React Router, you had to create your own
historyinstance, but in v4 the<BrowserRouter>,<HashRouter>, and<MemoryRouter>components will create a browser, hash, and memory instances for you. React Router makes the properties and methods of thehistoryinstance associated with your router available through the context, under therouterobject.1. Use the
withRouterhigher-order componentThe
withRouterhigher-order component will inject thehistoryobject as a prop of the component. This allows you to access thepushandreplacemethods without having to deal with thecontext.2. Use composition and render a
<Route>The
<Route>component isn’t just for matching locations. You can render a pathless route and it will always match the current location. The<Route>component passes the same props aswithRouter, so you will be able to access thehistorymethods through thehistoryprop.3. Use the context*
But you probably should not
The last option is one that you should only use if you feel comfortable working with React’s context model (React’s Context API is stable as of v16).
1 and 2 are the simplest choices to implement, so for most use cases, they are your best bets.
See less