我上课了。
class App extends Component { }
在此类中,我有一个具有以下内容的构造函数:
constructor(props) {
super(props);
this.state = {number: null, id: ""};
}
在渲染器中,我有一个路由器...
<Router>
<Route path="/:id" component={Child}/>
</Router>
在组件之外,我还具有以下功能
function Child({ match }) {
return (
<div>
<h3>ID: {match.params.id}</h3>
</div>
);
}
如果我的URL是localhost:3030/12345,它将打印12345。但是,我希望能够在该状态下存储12345。
已更新:
它正确设置了道具,但随后又对其进行了两次调用,然后失败,TypeError: Cannot read property 'params' of undefined
<Router>
<Route exact path="/:num" component={ServerCall}/>
</Router>
在ServerCall内
class ServerCall extends Component {
constructor(props) {
super(props);
console.log(this.props);
this.state = {num: this.props.match.params.num};
}
render() {
return (
<div>
{this.state.num}
</div>
);
}
}
export default ServerCall;
这是怎么回事?
答案 0 :(得分:2)
“ 我希望能够在状态下存储12345 ”-那么您将无法使用SFC(无状态功能组件)。将您的Child
更改为一个类,初始化state
并设置一个字段,例如id
将保留来自道具的价值。
class Child extends React.Component {
state = {
id: this.props.match.params.id,
}
render() {
return (
<div>
<h3>ID: {this.state.id}</h3>
</div>
);
}
}
如果您初始化了react-router-redux
中间件和化简器,则道具中应该有一个location
字段。从那里您可以轻松获得id
。但是,如果您尚未执行此操作,则只需使用window.location
对象来确定url。
更简便的方法:
class Child extends React.Component {
state = {
id: '',
}
componentDidMount() {
const id = window.location.pathname; // u can use regex or whatever to get just the id
this.setState({ id });
}
render() {
return (
<div>
<h3>ID: {this.state.id}</h3>
</div>
);
}
}
window
对象必须位于componentDidMount
内,而不是构造函数内,因为如果将来您想实现SSR(服务器端渲染),则无法访问服务器端的window
对象。仅在客户端。 componentDidMount
仅发生在客户端。