如何使用子组件 onClick 函数重新渲染父组件
How can I re-render parent component with a child component onClick function
我有一个父组件调用“RiskMatrix.js”,如下所示:
export default function RiskMatrix({disable}) {
const dispatch = useDispatch();
const [risk_matrix, setRiskMatrix] = React.useState(useSelector((state) => state.riskMatrix.risk_matrix));
if (disable == true) {
return (
<TableContainer component={Paper} style={{height: "40vh", width: "90vh"}}>
{console.log(risk_matrix)}
<Table size="small" sx={{ minWidth: 200 }}>
<TableHead>
<TableRow>
<TableCell align="center" width="90"></TableCell>
{consequences_description.map((description) => (
<TableCell align="center" width="90">{description}</TableCell>
)
)}
</TableRow>
</TableHead>
<TableBody>
{risk_matrix.map((row, row_index) => (
<TableRow
key={row_index}
sx={{ '&:last-child td, &:last-child th': { border: 0 } }}
>
<TableCell component="th" scope="row">
{likelyhood_description[row_index]}
</TableCell>
{row.map( (column, column_index) => (
<TableCell align="center">
<ToggleButton
risk={column}
row_index={row_index}
column_index={column_index}
/>
</TableCell>
))}
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
);
} else {
return null
}
}
我希望这个组件在调用子组件(“ToggleButton”)的 onClick 函数时重新渲染,子组件如下所示:
export default function ToggleButton({risk, row_index, column_index}) {
const handleColor = () => {
switch (risk){
case "L":
return "low"
case "M":
return "moderate"
case "H":
return "high"
case "E":
return "extreme"
default:
break;
}
};
const dispatch = useDispatch();
const { updateMatrix} = bindActionCreators(actions, dispatch)
const handleOnClick = () => {
switch (risk){
case "L":
updateMatrix(row_index, column_index, "M")
break;
case "M":
updateMatrix(row_index, column_index, "H")
break;
case "H":
updateMatrix(row_index, column_index, "E")
break;
case "E":
updateMatrix(row_index, column_index, "L")
break;
default:
break;
}
};
return (
<ThemeProvider theme={filtersTheme}>
<Button variant="contained" color={handleColor()} onClick={()=> handleOnClick()} >{risk}</Button>
</ThemeProvider>
);
}
子组件也使用 onClick 函数更新 react-redux 状态,理想情况下我希望父组件在状态改变后重新渲染。
React 组件在状态更新时重新渲染。因此,解决方案是创建一个状态并将 setter 传递给子组件,并在需要重新渲染时使用新值调用它。
您还可以在父元素中使用 事件冒泡 来捕获 onClick 事件并更新状态,而无需将 prop 传递给子元素。 read more about event bubbling here
更好的实现方式是使用 React 的上下文 API,这样每个子项都可以适当地访问矩阵数据,并在数据自动更改时重新呈现。
我有一个父组件调用“RiskMatrix.js”,如下所示:
export default function RiskMatrix({disable}) {
const dispatch = useDispatch();
const [risk_matrix, setRiskMatrix] = React.useState(useSelector((state) => state.riskMatrix.risk_matrix));
if (disable == true) {
return (
<TableContainer component={Paper} style={{height: "40vh", width: "90vh"}}>
{console.log(risk_matrix)}
<Table size="small" sx={{ minWidth: 200 }}>
<TableHead>
<TableRow>
<TableCell align="center" width="90"></TableCell>
{consequences_description.map((description) => (
<TableCell align="center" width="90">{description}</TableCell>
)
)}
</TableRow>
</TableHead>
<TableBody>
{risk_matrix.map((row, row_index) => (
<TableRow
key={row_index}
sx={{ '&:last-child td, &:last-child th': { border: 0 } }}
>
<TableCell component="th" scope="row">
{likelyhood_description[row_index]}
</TableCell>
{row.map( (column, column_index) => (
<TableCell align="center">
<ToggleButton
risk={column}
row_index={row_index}
column_index={column_index}
/>
</TableCell>
))}
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
);
} else {
return null
}
}
我希望这个组件在调用子组件(“ToggleButton”)的 onClick 函数时重新渲染,子组件如下所示:
export default function ToggleButton({risk, row_index, column_index}) {
const handleColor = () => {
switch (risk){
case "L":
return "low"
case "M":
return "moderate"
case "H":
return "high"
case "E":
return "extreme"
default:
break;
}
};
const dispatch = useDispatch();
const { updateMatrix} = bindActionCreators(actions, dispatch)
const handleOnClick = () => {
switch (risk){
case "L":
updateMatrix(row_index, column_index, "M")
break;
case "M":
updateMatrix(row_index, column_index, "H")
break;
case "H":
updateMatrix(row_index, column_index, "E")
break;
case "E":
updateMatrix(row_index, column_index, "L")
break;
default:
break;
}
};
return (
<ThemeProvider theme={filtersTheme}>
<Button variant="contained" color={handleColor()} onClick={()=> handleOnClick()} >{risk}</Button>
</ThemeProvider>
);
}
子组件也使用 onClick 函数更新 react-redux 状态,理想情况下我希望父组件在状态改变后重新渲染。
React 组件在状态更新时重新渲染。因此,解决方案是创建一个状态并将 setter 传递给子组件,并在需要重新渲染时使用新值调用它。
您还可以在父元素中使用 事件冒泡 来捕获 onClick 事件并更新状态,而无需将 prop 传递给子元素。 read more about event bubbling here
更好的实现方式是使用 React 的上下文 API,这样每个子项都可以适当地访问矩阵数据,并在数据自动更改时重新呈现。