react this.props.params 未定义

IT技术 javascript reactjs react-router
2021-05-10 14:34:14

我在将id产品传递到我的页面时遇到问题,我尝试了所有方法并搜索答案,但仍然无法正常工作。

这是我的 index.js:

import React from "react";
import {render} from "react-dom";
import {Router, Route, IndexRoute, hashHistory} from "react-router";

import {Menu} from './components/Menu';
import {MainPage} from './components/MainPage';
import {DetailsProduct} from './components/DetailsProduct';

class App extends React.Component{

    render(){
        return(
        <Router history={hashHistory}>
            {/* <IndexRoute component={Menu}></IndexRoute> */}
            <Route path="/" component={()=>(<div><Menu/><MainPage/></div>)}></Route>
            <Route path={"product/:id"} component={()=>(<div><Menu/><DetailsProduct>asd</DetailsProduct></div>)}></Route>
        </Router>
        )
    }
}

render(<App/>, window.document.getElementById("app"));

和详细信息产品(页面:http://localhost:8080/#/product/1)

import React from "react";    
export class DetailsProduct extends React.Component{

    render(){
        console.log(this.props.params); <-- this is undefined

        return(
            <h1>Product</h1>
        )
    }
}

3年后我回到这里。解决方案:

以这种方式渲染组件并不是一个好的解决方案:

<Route path={"product/:id"} component={()=>(<div><Menu/><DetailsProduct>asd</DetailsProduct></div>)}></Route>

但是如果你想渲染这样的组件(我不推荐),你必须将props作为 param 参数添加到函数中,然后在你想要 props( {...props} )的组件上进行重构

<Route path={"product/:id"} component={(props)=>(<div><Menu/><DetailsProduct>asd</DetailsProduct></div>)}></Route>

最好的解决方案是这样的渲染路线:

<Route path={"product/:id"} component={DetailsProduct}></Route>

在里面DetailsProduct你可以渲染<Menu />或使用Switch

<Menu/>
<Switch>
    <Route exact path={"product/:id"} component={DetailsProduct}/>
    // Add any other routes you want here
</Switch>
4个回答

当我使用this.props.params.id.

但是,当我尝试放入console.log(this.props)传递 id 的组件时,它会在匹配对象中显示我的 id,因此请使用:

this.props.match.params.id

获取 id(注意添加的match)。

对我来说,我用的render是方法和结论this.props.matchundefined渲染的成分。这是我的解决方案,您必须传入props.

this.props.matchundefined用于:

<Route path='/users/:id' render={() => <UserDetail/>}/>

改为这样做:

<Route path='/users/:id' render={(props) => <UserDetail {...props}/>}/>

https://reacttraining.com/react-router/web/api/Route/render-func

替换这个:

<Route path={"product/:id"} component={()=>(<div><Menu/><DetailsProduct>asd</DetailsProduct></div>)}></Route>

和 :

<Route path={"product/:id"} component={DetailsProduct}></Route>

react-router新版本将路由props对象更改如下: this.props.match.params 代替 this.props.params

https://reacttraining.com/react-router/web/api/match