reactjs - Materia UI 简单选择不保存选择
问题描述
我在 Material UI 的对话框中有一个简单的选择字段。表单使用状态将值保存在状态 onChange 中。我的状态代码如下:
const [planner, setPlanner] = useState({
name: '',
title: '1',
});
const { title, name } = planner;
const onChange = (e) => {
setPlanner({ ...planner, [e.target.id]: e.target.value });
我的表单代码如下:
<Dialog
open={open}
onClose={handleClose}
aria-labelledby='form-dialog-title'
>
<DialogTitle id='form-dialog-title'>Add New Planner</DialogTitle>
<DialogContent>
<DialogContentText>
some text
</DialogContentText>
<FormControl className={classes.formControl}>
<InputLabel id='title-label'>Title</InputLabel>
<Select labelId='title' id='title' value={title} onChange={onChange}>
<MenuItem value={10}>Mr</MenuItem>
<MenuItem value={20}>Mrs</MenuItem>
</Select>
</FormControl>
<TextField
margin='dense'
id='name'
label='Name'
type='text'
value={name}
onChange={onChange}
fullWidth
autoComplete='name'
/>
</DialogContent>
<DialogActions>
<Button onClick={handleClose} color='primary'>
Cancel
</Button>
<Button onClick={onSubmit} color='primary'>
Add Planner
</Button>
</DialogActions>
</Dialog>
谢谢您的帮助!整页代码如下:它使用redux状态管理器和useEffect,useState Hooks。除此之外,表格非常简单,除了这个标题下拉列表外,一切都很好。
import React, { useState, useEffect } from 'react';
import TextField from '@material-ui/core/TextField';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';
import Button from '@material-ui/core/Button';
import { makeStyles } from '@material-ui/core/styles';
import {
addPlanner,
clearErrors,
clearAdd,
} from '../../actions/plannerActions';
import { setAlert } from '../../actions/alertActions';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import Select from '@material-ui/core/Select';
import MenuItem from '@material-ui/core/MenuItem';
import InputLabel from '@material-ui/core/InputLabel';
import FormControl from '@material-ui/core/FormControl';
const useStyles = makeStyles((theme) => ({
root: {
'& > *': {
margin: theme.spacing(2),
},
},
text: {
textAlign: 'center',
},
appBarSpacer: theme.mixins.toolbar,
content: {
flexGrow: 1,
overflow: 'auto',
},
container: {
paddingTop: theme.spacing(10),
paddingBottom: theme.spacing(20),
},
textfield: {
width: '100%',
border: 0,
},
formControl: {
minWidth: 120,
},
}));
const PlannerForm = ({
addPlanner,
error,
clearErrors,
setAlert,
open,
handleClose,
add,
}) => {
// const [open, setOpen] = React.useState(false);
const classes = useStyles();
const [planner, setPlanner] = useState({
name: '',
email: '',
title: '',
company: '',
phone: '',
comments: '',
password: '123123',
});
const { title, name, email, company, phone, comments } = planner;
const onChange = (e) => {
setPlanner({ ...planner, [e.target.id]: e.target.value });
};
const clearForm = () => {
setPlanner({
name: '',
email: '',
title: '',
company: '',
phone: '',
comments: '',
password: '123123',
});
clearAdd();
};
React.useEffect(() => {
if (error) {
setAlert(error.errors[0].msg, 'error');
} else if (add) {
setAlert('Planner Added', 'success');
clearForm();
}
}, [error, add]);
const onSubmit = async (e) => {
e.preventDefault();
addPlanner(planner);
};
return (
<Dialog
open={open}
onClose={handleClose}
aria-labelledby='form-dialog-title'
>
<DialogTitle id='form-dialog-title'>Add New Planner</DialogTitle>
<DialogContent>
<DialogContentText>
To add a new planner insert their info and they will receive an email
to activate their account, set a new password and login.
</DialogContentText>
<FormControl className={classes.formControl}>
<InputLabel id='title-label'>Title</InputLabel>
<Select labelId='title' id='title' value={title} onChange={onChange}>
<MenuItem value={10}>Mr</MenuItem>
<MenuItem value={20}>Mrs</MenuItem>
</Select>
</FormControl>
<TextField
margin='dense'
id='name'
label='Name'
type='text'
value={name}
onChange={onChange}
fullWidth
autoComplete='name'
/>
<TextField
margin='dense'
id='company'
label='Company'
type='text'
value={company}
onChange={onChange}
fullWidth
autoComplete='company'
/>
<TextField
margin='dense'
id='email'
label='Email Address'
type='email'
value={email}
onChange={onChange}
fullWidth
autoComplete='email'
/>
<TextField
margin='dense'
id='phone'
label='Phone Number'
type='tel'
value={phone}
onChange={onChange}
fullWidth
autoComplete='tel'
/>
<TextField
placeholder='Additional Comments'
multiline
rows={4}
margin='dense'
id='comments'
value={comments}
onChange={onChange}
fullWidth
/>
</DialogContent>
<DialogActions>
<Button onClick={handleClose} color='primary'>
Cancel
</Button>
<Button onClick={onSubmit} color='primary'>
Add Planner
</Button>
</DialogActions>
</Dialog>
);
};
PlannerForm.propTypes = {
addPlanner: PropTypes.func.isRequired,
error: PropTypes.object,
setAlert: PropTypes.func.isRequired,
clearErrors: PropTypes.func.isRequired,
open: PropTypes.bool.isRequired,
handleClose: PropTypes.func.isRequired,
add: PropTypes.bool.isRequired,
};
const mapStateToProps = (state) => ({
isAuthenticated: state.planners.isAuthenticated,
error: state.planners.error,
add: state.planners.add,
});
export default connect(mapStateToProps, {
addPlanner,
clearErrors,
setAlert,
})(PlannerForm);
解决方案
查看文档
原生时包装元素或选择元素的 id。
id 应用于包装 div 而不是 select。要使其工作,请使用native
prop toSelect
并将其设置为 true。
代码片段
export default function FormDialog() {
const [planner, setPlanner] = useState({
name: "",
title: "10"
});
const { title, name } = planner;
const onChange = (e, b) => {
const target = e.target;
setPlanner(prev => ({ ...prev, [target.id]: target.value }));
};
return (
<div>
<Dialog
open={true}
// onClose={handleClose}
aria-labelledby="form-dialog-title"
>
<DialogTitle id="form-dialog-title">Add New Planner</DialogTitle>
<DialogContent>
<DialogContentText>some text</DialogContentText>
<FormControl>
<InputLabel id="title-label">Title</InputLabel>
<Select
native
labelId="title"
id="title"
value={title}
onChange={onChange}
>
<option value={10}>Mr</option>
<option value={20}>Mrs</option>
</Select>
</FormControl>
<TextField
margin="dense"
id="name"
label="Name"
type="text"
value={name}
onChange={onChange}
fullWidth
autoComplete="name"
/>
</DialogContent>
<DialogActions>
<Button color="primary">Cancel</Button>
<Button color="primary">Add Planner</Button>
</DialogActions>
</Dialog>
</div>
);
}
推荐阅读
- html - 在右边放一个 iframe
- geometry - 给定其他三个,如何计算四面体的第四个顶点?
- php - PHP - 检查数组中是否存在 JSON 值,如果存在则获取关联的 user_id
- c# - csvHelper 将不同行的值放入数据库中的一个字段中
- python-3.x - 将字典值与浮点数进行比较
- javascript - 在 :D\ 上安装 Reactjs 中止,但在 :C\ 上没有安装,为什么?
- validation - 如何更改 Golang (Gin) 中不同端点所需标签的绑定?
- node.js - 仅在将 Inkscape 作为子进程调用时出现“无效动词”错误
- java - 致命异常:主进程 PID:20793 java.util.ConcurrentModificationException
- xcode - 显示文档窗口崩溃 XCode 12