React/Typescript 中处理多个开关控件的函数
Function to Handle Multiple Switch Controls in React/Typescript
我想做的是发送 post 多个开关控制请求,但我认为它们必须是发送请求的更简单方法,而不是为每个开关单独编写请求输入。我怎样才能整合或编写一个可以干净利落地做到这一点的函数?使用 Typescript/React。问题更新如下:
UPDATE: What I want to do is send the state of the switch input control as a toggle. ie. when the switch control is set to yes/no, then it sends a post request to the server
interface IState {
checkedA?: boolean;
checkedB?: boolean;
}
public render() {
const {} = this.state;
<div className={classes.switchContainer}>
<FormGroup row>
<FormControlLabel
control={
<Switch
checked={this.state.checkedA}
onChange={this.handleChange}
value="checkedA"
>Toggle</Switch>
}label="YES"
/>
<Typography color="secondary" variant="body1" className={classes.toggleQuestions}>Question 1</Typography>
</FormGroup>
</div>
<div className={classes.switchContainer}>
<FormGroup row>
<FormControlLabel
control={
<Switch
checked={this.state.checkedB}
onChange={this.handleChange}
value="checkedB"
>Toggle</Switch>
}label="YES"
/>
<Typography color="secondary" variant="body1" className={classes.toggleQuestions}>Question 2</Typography>
</FormGroup>
</div>
)}
<Button
onClick={this.submitRecommendation}>
Send Request</Button
await axios.post(
`/test/testpost`,
{
post request from click of button would go in here
} catch (err) {
}
);
下面是一个示例,说明如何在提交表单时以编程方式访问输入:
private handleSubmit = (e: React.FormEvent): void => {
e.preventDefault();
// We want the form as a starting point to traverse the DOM
const form = e.target;
// It seems like we can be relatively sure that all the information
// we want is contained in the form's inputs, so we'll select them all
const inputs = form.querySelectorAll('input');
// With the NodeList inputs (a DOM data type), we can use .forEach
// to check out all the nodes by their type
inputs.forEach(input => {
// Accessing the name and value will give you all
// the information you need to build up a POST request
switch(input.type) {
case 'checkbox':
console.log('The checkbox is called', input.name, 'and its checked state is', input.checked);
break;
case 'text':
console.log('The text input is called', input.name, 'and it says', input.value);
break;
}
});
}
下面是一个示例,说明您可能如何在 .forEach 循环中构建一个请求对象,构建一个对象以在您的请求中发送。如果您确保为每个项目使用正确的名称道具,您可以很容易地做到这一点。
// in the above method
const request = {};
inputs.forEach(input => {
// Somehow map the input name and value to your data model you're updating
request[input.name] = input.value;
});
await axios.post(/* use request object here */);
希望这足以让您入门,但如果您想讨论任何具体的实施细节,请随时发表评论! :D
我想做的是发送 post 多个开关控制请求,但我认为它们必须是发送请求的更简单方法,而不是为每个开关单独编写请求输入。我怎样才能整合或编写一个可以干净利落地做到这一点的函数?使用 Typescript/React。问题更新如下:
UPDATE: What I want to do is send the state of the switch input control as a toggle. ie. when the switch control is set to yes/no, then it sends a post request to the server
interface IState {
checkedA?: boolean;
checkedB?: boolean;
}
public render() {
const {} = this.state;
<div className={classes.switchContainer}>
<FormGroup row>
<FormControlLabel
control={
<Switch
checked={this.state.checkedA}
onChange={this.handleChange}
value="checkedA"
>Toggle</Switch>
}label="YES"
/>
<Typography color="secondary" variant="body1" className={classes.toggleQuestions}>Question 1</Typography>
</FormGroup>
</div>
<div className={classes.switchContainer}>
<FormGroup row>
<FormControlLabel
control={
<Switch
checked={this.state.checkedB}
onChange={this.handleChange}
value="checkedB"
>Toggle</Switch>
}label="YES"
/>
<Typography color="secondary" variant="body1" className={classes.toggleQuestions}>Question 2</Typography>
</FormGroup>
</div>
)}
<Button
onClick={this.submitRecommendation}>
Send Request</Button
await axios.post(
`/test/testpost`,
{
post request from click of button would go in here
} catch (err) {
}
);
下面是一个示例,说明如何在提交表单时以编程方式访问输入:
private handleSubmit = (e: React.FormEvent): void => {
e.preventDefault();
// We want the form as a starting point to traverse the DOM
const form = e.target;
// It seems like we can be relatively sure that all the information
// we want is contained in the form's inputs, so we'll select them all
const inputs = form.querySelectorAll('input');
// With the NodeList inputs (a DOM data type), we can use .forEach
// to check out all the nodes by their type
inputs.forEach(input => {
// Accessing the name and value will give you all
// the information you need to build up a POST request
switch(input.type) {
case 'checkbox':
console.log('The checkbox is called', input.name, 'and its checked state is', input.checked);
break;
case 'text':
console.log('The text input is called', input.name, 'and it says', input.value);
break;
}
});
}
下面是一个示例,说明您可能如何在 .forEach 循环中构建一个请求对象,构建一个对象以在您的请求中发送。如果您确保为每个项目使用正确的名称道具,您可以很容易地做到这一点。
// in the above method
const request = {};
inputs.forEach(input => {
// Somehow map the input name and value to your data model you're updating
request[input.name] = input.value;
});
await axios.post(/* use request object here */);
希望这足以让您入门,但如果您想讨论任何具体的实施细节,请随时发表评论! :D