当 componentShouldUpdate returns 为真时,为什么我的 React 组件不会重新渲染?
Why won't my react component re-render when componentShouldUpdate returns true?
我无法理解生命周期挂钩在我的 React 应用程序中的工作方式。我有一个应用程序,我在我的渲染方法中将一些道具传递给我的分页组件,如下所示:
<Pagination
totalRecords={this.state.blogPosts.length}
pageLimit={5}
pageNeighbours={2}
onPageChanged={() => {console.log('page changed');}}
/>
在分页构造函数中,我打印出道具值。
const { totalRecords = null, pageLimit = 30, pageNeighbours = 0 } = props;
console.log('totalRecords=', totalRecords);
它打印出 0。
很公平,我还没有获取我的博文。所以在 componentDidMount 中,我像这样获取博客文章:
componentDidMount() {
axios.get('/blogs').then(
response => {
if (response.data) {
const entries = Object.entries(response.data);
this.setState({
blogPosts: entries.map(p => Object.assign({id: p[0]}, {...p[1]}))
.sort((p1, p2) => p1.updatedAt > p2.updatedAt ? -1 : 1),
});
}
},
err => {
console.log('err=', err);
});
}
所以现在博客文章已填充,但分页组件不会更新(即使博客本身似乎会更新)。
在这里我需要一些关于 React 生命周期挂钩如何工作的指导。状态改变后render方法不会重新运行吗?我期待分页组件重新呈现,这次让 totalRecords 道具打印出 3(或某个大于 0 的数字)。构造函数即使重新渲染也只运行一次吗?
所以为了以防万一我必须触发重新渲染,我 运行 在 componentShouldUpdate()
方法中这样做:
shouldComponentUpdate(nextProps, nextState) {
console.log('this.state.blogPosts.length=', this.state.blogPosts.length);
console.log('nextState.blogPosts.length=', nextState.blogPosts.length);
return this.state.blogPosts.length !== nextState.blogPosts.length;
}
确实,this.state.blogPosts.length
显示 0
,nextState.blogPosts.length
显示 3
。所以它们是不同的,我期待 state 更新 3 篇博文。如果长度不同,我 return 为 true,因此组件应该更新。那不是说要重新渲染吗?
无论如何,totalRecords还是0,我什至在Pagination组件里设置了一个时间间隔:
setInterval(() => {
console.log('this.totalRecords =', this.totalRecords);
}, 5000);
它每五秒打印一次 0... 在博文被获取并添加到状态后很久。
为什么分页组件没有更新为 totalRecords 的新值?
可能您忘记在 Pagination
组件中使用 componentWillReceiveProps
。
componentWillReceiveProps(nextProps) {
this.setState({ totalRecords: nextProps.totalRecords })
}
我无法理解生命周期挂钩在我的 React 应用程序中的工作方式。我有一个应用程序,我在我的渲染方法中将一些道具传递给我的分页组件,如下所示:
<Pagination
totalRecords={this.state.blogPosts.length}
pageLimit={5}
pageNeighbours={2}
onPageChanged={() => {console.log('page changed');}}
/>
在分页构造函数中,我打印出道具值。
const { totalRecords = null, pageLimit = 30, pageNeighbours = 0 } = props;
console.log('totalRecords=', totalRecords);
它打印出 0。
很公平,我还没有获取我的博文。所以在 componentDidMount 中,我像这样获取博客文章:
componentDidMount() {
axios.get('/blogs').then(
response => {
if (response.data) {
const entries = Object.entries(response.data);
this.setState({
blogPosts: entries.map(p => Object.assign({id: p[0]}, {...p[1]}))
.sort((p1, p2) => p1.updatedAt > p2.updatedAt ? -1 : 1),
});
}
},
err => {
console.log('err=', err);
});
}
所以现在博客文章已填充,但分页组件不会更新(即使博客本身似乎会更新)。
在这里我需要一些关于 React 生命周期挂钩如何工作的指导。状态改变后render方法不会重新运行吗?我期待分页组件重新呈现,这次让 totalRecords 道具打印出 3(或某个大于 0 的数字)。构造函数即使重新渲染也只运行一次吗?
所以为了以防万一我必须触发重新渲染,我 运行 在 componentShouldUpdate()
方法中这样做:
shouldComponentUpdate(nextProps, nextState) {
console.log('this.state.blogPosts.length=', this.state.blogPosts.length);
console.log('nextState.blogPosts.length=', nextState.blogPosts.length);
return this.state.blogPosts.length !== nextState.blogPosts.length;
}
确实,this.state.blogPosts.length
显示 0
,nextState.blogPosts.length
显示 3
。所以它们是不同的,我期待 state 更新 3 篇博文。如果长度不同,我 return 为 true,因此组件应该更新。那不是说要重新渲染吗?
无论如何,totalRecords还是0,我什至在Pagination组件里设置了一个时间间隔:
setInterval(() => {
console.log('this.totalRecords =', this.totalRecords);
}, 5000);
它每五秒打印一次 0... 在博文被获取并添加到状态后很久。
为什么分页组件没有更新为 totalRecords 的新值?
可能您忘记在 Pagination
组件中使用 componentWillReceiveProps
。
componentWillReceiveProps(nextProps) {
this.setState({ totalRecords: nextProps.totalRecords })
}