supasate / connected-react-router

A Redux binding for React Router v4
MIT License
4.73k stars 592 forks source link

Don't support for react-router-doom v6 #550

Open HipSiGa opened 2 years ago

HipSiGa commented 2 years ago

This middleware can't help for react-router v6. Please fix it.

fedorovsky commented 2 years ago

This middleware can't help for react-router v6. Please fix it.

I'm looking forward to these changes too. https://github.com/supasate/connected-react-router/issues/543

ConstantinChirila commented 2 years ago

By the looks of it this package is dead in the water, and it doesn't seem it might actually be updated any time soon. There are a few PR's opened, and no merged since November. Id suggest at looking for alternatives. I know i will do the same.

PS. Not throwing shade at the owner, i know OSS can be hard sometimes.

HipSiGa commented 2 years ago

i had resolved this issues with this npm package https://github.com/lagunovsky/redux-react-router. It's same with connected react router

salvoravida commented 2 years ago

Switch to redux-first-history: https://github.com/salvoravida/redux-first-history support react-router v6 and is issues-free!

D3Pheonix commented 2 years ago

@HipSiGa it works on react v18 ?

gkamesh98 commented 4 months ago

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.