如何在父状态上重新渲染功能组件已更改
How to re-render functional component on parent state changed
我想在父状态改变时重新渲染功能性子组件。
当我小时候使用 class 组件时,我就知道如何解决它。
在这种情况下,我可以使用 componentWillReceiveProps
.
但是我的子组件是功能组件。
我有 table 组件,我的页面中有一些单选按钮。
当我选择特殊单选按钮时,table 内容被更改。这运作良好。
如果我设置 table 的第 4 页并选择另一个单选按钮,则 table 内容长度会更改。 (此时我想看第一页table)
因此,选择特殊的广播按钮时,我将页面设置为0。(在父组件中)
但是此时子组件不会重新渲染。
我该怎么做?
这是我的代码。
父方
export default class Report extends Component {
constructor() {
super();
this.state = {
table_data:[],
page: 0,
analys_type: "1"
}
}
setData = () => {
......
......
}
handleChangeAnalysType = (event) => {
this.setState({
analys_type: event.target.value,
page: 0
}, () => {
this.setData();
});
}
render() {
<div>
<Paper className="input-box">
<div>
<FormControl component="fieldset">
<RadioGroup name="analys_type" value={this.state.analys_type} onChange={this.handleChangeAnalysType}>
<FormControlLabel value="1" control={<Radio />} label="Day" />
<FormControlLabel value="2" control={<Radio />} label="Week" />
<FormControlLabel value="3" control={<Radio />} label="Month" />
</RadioGroup>
</FormControl>
</div>
</Paper>
<Paper className="table-box">
<AnalysTable table_data={this.state.table_data} analys_type={this.state.analys_type} current_page={this.state.page} />
</Paper>
</div>
}
}
子组件
export default function AnalysTable(props) {
const [page, setPage] = React.useState(props.current_page);
const [rowsPerPage, setRowsPerPage] = React.useState(10);
const handleChangePage = (event, newPage) => {
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
};
render (
<div>
<TableContainer>
......
</TableContainer>
<TablePagination
rowsPerPageOptions={[10, 25, 100]}
component="div"
count={props.table_data.length}
page={page}
onChangePage={handleChangePage}
rowsPerPage={rowsPerPage}
onChangeRowsPerPage={handleChangeRowsPerPage}
labelRowsPerPage="rows"
/>
</div>
)
}
您需要在父更改时更改组件状态,因此:
//here you initialize the page state
const [page, setPage] = React.useState(props.current_page);
//add and effect on current_page change
useEffect(()=>setPage(props.current_page), [props.current_page])
我想在父状态改变时重新渲染功能性子组件。
当我小时候使用 class 组件时,我就知道如何解决它。
在这种情况下,我可以使用 componentWillReceiveProps
.
但是我的子组件是功能组件。
我有 table 组件,我的页面中有一些单选按钮。 当我选择特殊单选按钮时,table 内容被更改。这运作良好。 如果我设置 table 的第 4 页并选择另一个单选按钮,则 table 内容长度会更改。 (此时我想看第一页table) 因此,选择特殊的广播按钮时,我将页面设置为0。(在父组件中) 但是此时子组件不会重新渲染。 我该怎么做?
这是我的代码。
父方
export default class Report extends Component {
constructor() {
super();
this.state = {
table_data:[],
page: 0,
analys_type: "1"
}
}
setData = () => {
......
......
}
handleChangeAnalysType = (event) => {
this.setState({
analys_type: event.target.value,
page: 0
}, () => {
this.setData();
});
}
render() {
<div>
<Paper className="input-box">
<div>
<FormControl component="fieldset">
<RadioGroup name="analys_type" value={this.state.analys_type} onChange={this.handleChangeAnalysType}>
<FormControlLabel value="1" control={<Radio />} label="Day" />
<FormControlLabel value="2" control={<Radio />} label="Week" />
<FormControlLabel value="3" control={<Radio />} label="Month" />
</RadioGroup>
</FormControl>
</div>
</Paper>
<Paper className="table-box">
<AnalysTable table_data={this.state.table_data} analys_type={this.state.analys_type} current_page={this.state.page} />
</Paper>
</div>
}
}
子组件
export default function AnalysTable(props) {
const [page, setPage] = React.useState(props.current_page);
const [rowsPerPage, setRowsPerPage] = React.useState(10);
const handleChangePage = (event, newPage) => {
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
};
render (
<div>
<TableContainer>
......
</TableContainer>
<TablePagination
rowsPerPageOptions={[10, 25, 100]}
component="div"
count={props.table_data.length}
page={page}
onChangePage={handleChangePage}
rowsPerPage={rowsPerPage}
onChangeRowsPerPage={handleChangeRowsPerPage}
labelRowsPerPage="rows"
/>
</div>
)
}
您需要在父更改时更改组件状态,因此:
//here you initialize the page state
const [page, setPage] = React.useState(props.current_page);
//add and effect on current_page change
useEffect(()=>setPage(props.current_page), [props.current_page])