ReactJS Router不渲染组件

时间:2020-02-09 15:11:16

标签: reactjs react-router

我在以下代码中遇到了路径<Route path="customers/:id" render={(props) => <CusDataForm {...props}/>}/>

import CusDataCtrl from './cusdata/CusDataCtrl'
import CusDataForm from './cusdata/CusDataForm'

class App extends Component {
  render() {
    return (      
        <BrowserRouter>
            <Switch>                            
                <Route exact path="/customers" component={CusDataCtrl} />                  
                <Route path="customers/:id" render={(props) => <CusDataForm {...props}/>}/>
            </Switch>
        </BrowserRouter>      
    );
  }
}
export default App;

如果我使用<Route exact path="/customers/:id" component={CusDataForm} />,则组件可以正确渲染;但是,我需要将一些道具传递给该组件。

我的调用组件的定义如下:

class CusDataGrid extends Component {
    constructor(props) {
        super(props)
        this.state = {data: []}
    }
    componentDidMount() {
        let me = this;
        dbFetch("customers",data => me.setState({data:data}));
    }
    callEdit = e => {
        let recid = e.target.getAttribute("data")
        this.props.history.push("/customers/"+recid);
    }
    render() {
        const rows = this.state.data.map((row, ndx) => {
            return (
                <div key={ndx}><button data={row.recordid} className="waves-effect waves-light btn-small" onClick={this.callEdit}>Edit</button></div>
            );
        });
        return (
            <div id="cusdata"><div className="data-scrollable">{rows}</div></div>
        );
    }
};
export default CusDataGrid;

我的目标组件是:

class CusDataForm extends Component{    
    componentDidMount = () =>{     
        this.setState({id: this.props.id ? this.props.id : ""});
    }    
    render(){
        return(<div>HELLO</div>)
    }
}
export default CusDataForm;

请让我知道我做错了什么。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以为其使用hook useParams

    <Switch>
      <Route path="/:id" children={<Child />} />
    </Switch>

    function Child() {
    // We can use the `useParams` hook here to access
    // the dynamic pieces of the URL.
    let { id } = useParams();

     return (
     <div>
      <h3>ID: {id}</h3>
     </div>
    );
   }

official documentation