【发布时间】:2018-09-01 08:26:40
【问题描述】:
我有以下示例简单页面:
App.js:
export default class App extends React.Component {
render() {
return <Router>
<Switch>
<Route exact path='/' component={ArticlesPage}/>
<Route path='/search' component={SearchPage}/>
</Switch>
</Router>
};
};
ArticlesPage.js:
export default class ArticlesPage extends React.Component {
constructor(props) {
super(props);
}
render() {
return <Grid>
<Row>
<Col lg={12}>
<SearchBox/>
</Col>
</Row>
<Row>
<Col lg={12}>
articles
</Col>
</Row>
</Grid>;
}
};
SearchPage.js:
export default class SearchPage extends React.Component {
constructor(props) {
super(props);
const {q} = queryString.parse(location.search);
this.state = {
query: q
};
}
render() {
return <Grid>
<Row>
<Col lg={12}>
<SearchBox/>
</Col>
</Row>
<Row>
<Col lg={12}>
search {this.state.query}
</Col>
</Row>
</Grid>;
}
};
SearchBox.js:
export default class SearchBox extends React.Component {
constructor(props) {
super(props);
this.state = {
q: ''
};
}
onFormSubmit = (e) => {
e.preventDefault();
const {router} = this.context;
router.history.push('/search?q=' + this.state.q);
};
handleChange = (e) => {
this.setState({q: e.target.value});
};
render() {
return <form onSubmit={this.onFormSubmit}>
<Col lg={10} lgOffset={1}>
<FormGroup>
<input type="text" name="q" id="q" ref={i => this.searchInput = i} onChange={this.handleChange} />
</FormGroup>
</Col>
</form>;
}
};
现在,当我在索引页面上并在输入下一个发送表单中输入一些内容时,React 渲染 SearchPage.js 并正确返回文本 search *and what I typed*,再次尝试在输入和发送表单中输入其他内容,然后React 仍然显示我以前的文本(不重新渲染)。
这个简单的页面有什么问题?
【问题讨论】:
-
结果会在你的 searchpage.js 上返回,对吧?
-
@AbdeslemCharif 确实,在
search {this.state.query}中,但正如我所说的仅在第一次显示正确的查询时,每次只显示第一次。 -
我认为问题在于,当您仅更改位置的查询时,不会再次调用
SearchPage构造函数。 -
您不会获得
SearchPage的新实例。您将需要使用组件的生命周期函数componentDidUpdate之一更新状态。 -
您的问题是 searchPage 没有理由更新,因为您没有更新
query的状态
标签: javascript reactjs react-router