问题描述
-
我正在使用 React.js、打字稿和 Material UI。
-
我持有两个布尔值,checkedA: false,checkedB: false。
-
注意它们是硬编码的,我想让它们动态化。基本上,我有对象数组(权限列表),它们将作为道具传递给这个组件。我想迭代/映射它们,使用它们的名称(从 props 对象数组中获取),并用它们的名称替换“checkedA”和“checkedB”。
-
原因是,props 对象数组(权限列表)可能会更改,并且有 3 或 10 个对象。所以我希望能够将它们全部列出并有一个开关功能,可以选择打开/关闭该权限。
-
请询问您是否需要更多说明。基本上是,如何映射一组对象,同时让每个对象都有一个单独的和功能性的 UIswitch。
export const PermissionList: React.FC<PermissionListProps> = props => { const classes = useStyles(); const [state,setState] = React.useState({ checkedA: false,checkedB: false,}); const handleSwitchChange = (e:any) => { console.log(e.target.checked) setState({ ...state,[e.target.name]: e.target.checked }); }; return ( <Container> <Card> <TableContainer className={classes.scroll} component={Paper}> <Table aria-label="simple table"> <TableHead> <TableRow> <TableCell className={classes.name} align="left">Permission Name</TableCell> <TableCell className={classes.description} align="left">Permission Description</TableCell> <TableCell align="left">Switch</TableCell> </TableRow> </TableHead> <TableBody> {props.data_permissions.map(p => ( <TableRow key={p.name}> <TableCell className={classes.name}>{p.name}</TableCell> <TableCell className={classes.description}>{p.description}</TableCell> <TableCell> <FormGroup row className={classes.Permission}> <FormControlLabel control={<Switch checked={state.checkedA} onChange={handleSwitchChange} name="checkedA" />} label="Off/On" /> </FormGroup> <FormControlLabel control={<Switch checked={state.checkedB} onChange={handleSwitchChange} name="checkedA" />} label="Off/On" /> </FormGroup> </TableCell> </TableRow> ))} </TableBody> </Table> </TableContainer> </Card> </Container> ) };
以下是将通过的 props/ 对象数组的示例:
const data_permissions = [
{
"name": "Outreach","description": "Configure Aspen's outbound dialer,Configure Aspen's outbound dialer,Configure Aspen's outbound dialer","permission_name": "outreach"
},{
"name": "Softphone","description": "Access the Amazon Connect Softphone","permission_name": "softphone"
},{
"name": "Metrics and Quality","description": "Access Metrics and Quality","permission_name": "metrics-quality"
},{
"name": "Cost Accounting","description": "Access Cost Accounting","permission_name": "cost-accounting"
},{
"name": "Embedded CRM","description": "Access the Embedded CRM","permission_name": "embedded-application"
},{
"name": "Admin Settings","description": "Modify users,roles and feature settings across the organization.","permission_name": "admin-access"
}
];
解决方法
我认为您需要为数组中的所有对象创建一个包含 CheckedA 和 CheckedB 值的对象,并将其存储在状态中。像这样:{Outreach: {CheckedA: true,CheckedB: false},Softphone: {CheckedA: true,CheckedB: false} ... }
你可以试试下面的代码。我无法运行和测试它。所以如果有任何错误,请告诉我。
export const PermissionList: React.FC<PermissionListProps> = props => {
const classes = useStyles();
const [state,setState] = React.useState({});
const handleSwitchChange = (e:any,pname:any) => {
console.log(e.target.checked)
setState({ ...state,pname: {[e.target.name]: e.target.checked }});
};
return (
<Container>
<Card>
<TableContainer className={classes.scroll} component={Paper}>
<Table aria-label="simple table">
<TableHead>
<TableRow>
<TableCell className={classes.name} align="left">Permission Name</TableCell>
<TableCell className={classes.description} align="left">Permission Description</TableCell>
<TableCell align="left">Switch</TableCell>
</TableRow>
</TableHead>
<TableBody>
{props.data_permissions.map(p => (
<TableRow key={p.name}>
<TableCell className={classes.name}>{p.name}</TableCell>
<TableCell className={classes.description}>{p.description}</TableCell>
<TableCell>
<FormGroup row className={classes.Permission}>
<FormControlLabel
control={<Switch checked={state[p.name].checkedA} onChange={(e) => handleSwitchChange(e,p.name)} name="checkedA" />}
label="Off/On"
/>
</FormGroup>
<FormControlLabel
control={<Switch checked={state[p.name].checkedB} onChange={(e) => handleSwitchChange(e,p.name)} name="checkedB"/>}
label="Off/On"
/>
</FormGroup>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
</Card>
</Container>
)
};