Объявите маршруты, используйте exact для соответствия точному пути, поскольку поиск маршрута осуществляется сверху вниз. Я считаю, что для динамического маршрута нам нужно использовать рендеринг и передавать реквизиты вручную.

import {
    BrowserRouter as Router,
    Switch,
    Route,
    Link
} from 'react-router-dom'
function Content() {
    return (
        <Router>
            <Switch>
                <Route exact path="/about">
                    <About />
                </Route>
                <Route exact path="/">
                    <Home />
                </Route>
                <Route path='/book/:id' render={(props) => {
                    return ( <BookDetail {...props } /> )
                }} />
                <Route>
                    <NotFound />
                </Route>
            </Switch>
        </Router>
    )
}

Чтобы инициировать запрос маршрута, используйте ловушку useHistory. Обратите внимание, что нам нужно объявить переменную, а не использовать useHistory().push напрямую

import { useHistory } from 'react-router-dom'
const history = useHistory()
<a onClick={() => {
    history.push(`/book/${uuid}`)
}} >

Чтобы получить параметры, используйте match

export default function BookDetail(props) {
    const [ state, setState ] = useState({
        book: null
    })
    const { match } = props
   // match.params.id
}