connected-react-router icon indicating copy to clipboard operation
connected-react-router copied to clipboard

Will support react-router v6 and history v5?

Open LexaDel opened this issue 2 years ago • 2 comments

Hello @supasate! Will support react-router v6 and history v5?

LexaDel avatar Sep 20 '22 09:09 LexaDel

yeah, we really need this support, guys

I have tried this library - redux-first-history as a replacer for connected-react-router to bind react-router v6 with redux, but it works only with react 17, not with 18 (it causes an infinite loop error if you use rr6 Navigate component)

vicodinvic1 avatar Sep 22 '22 23:09 vicodinvic1

I think currently they don't provide support in near future. If you still want to use it with react-router@v6. You can make small tweak as follows. Instead of using the ConnectedRouter You can make following default react-router Router component and make changes as follows

import React, { useLayoutEffect, useRef, useState } from 'react'
import { Route, Router, Routes } from 'react-router-dom'

import { createBrowserHistory } from 'history'
import { useDispatch } from 'react-redux'
import { onLocationChanged } from 'connected-react-router'

const history = createBrowserHistory()

export default ({ children }) => {
  const isFirstRender = useRef(true)
  const dispatch = useDispatch()
  const [historyState, setHistoryState] = useState({
    action: history.action,
    location: history.location,
  })

  useLayoutEffect(() => {
    return history.listen(setHistoryState)
  }, [])

  useLayoutEffect(() => {
    if (isFirstRender.current) {
      dispatch(onLocationChanged(history.location, history.action, true))
      isFirstRender.current = false
    }
    return history.listen((arg) => {
      dispatch(onLocationChanged(arg.location, arg.action, false))
    })
  }, [dispatch])

  return (
    <Router
      // ...rest of props required
      location={historyState.location}
      action={historyState.action}
      navigator={history}
    >
      {/* here it lies <Routes> <Route> ..... */}
      {children}
    </Router>
  )
}

Rest of it is same as before. I hope it is helpful. Thank you.

gkamesh98 avatar May 07 '24 11:05 gkamesh98