如何将我的 React class 更改为一个函数,以便我可以包含 Material UI classes?
How can I change my React class to a function so that I can include Material UI classes?
在最终设法设置 Emailjs 之后,我现在正在尝试使用 Material UI 文本字段 (https://material-ui.com/components/text-fields/#text-field) 以获得更好的设计。
不幸的是,我无法将 Material UI classes 添加到我的代码中,因为我无法将 Class 更改为功能组件一个状态。有谁知道如何将 class 更改为函数,以便我可以为我的联系表单使用 Material UI 设计?
我的 EmailJS 表单(工作得很好,只是在发布之前更改了我的用户和模板 ID):
import React, { Component } from 'react'
import * as emailjs from 'emailjs-com'
import { Button, FormFeedback, Form, FormGroup, Label, Input } from 'reactstrap'
class ContactForm extends Component {
state = {
name: '',
email: '',
subject: '',
message: '',
}
handleSubmit(e) {
e.preventDefault()
const { name, email, subject, message } = this.state
let templateParams = {
from_name: email,
to_name: 'Altes Waschhaus',
subject: subject,
message_html: message,
}
emailjs.send(
'gmail',
'template_XXXXX',
templateParams,
'user_XXXXX'
)
this.resetForm()
}
resetForm() {
this.setState({
name: '',
email: '',
subject: '',
message: '',
})
}
handleChange = (param, e) => {
this.setState({ [param]: e.target.value })
}
render() {
return (
<>
<h1 className="p-heading1">Get in Touch</h1>
<Form onSubmit={this.handleSubmit.bind(this)}>
<FormGroup controlId="formBasicEmail">
<Label className="text-muted">Email address</Label>
<Input
type="email"
name="email"
value={this.state.email}
className="text-primary"
onChange={this.handleChange.bind(this, 'email')}
placeholder="Enter email"
/>
</FormGroup>
<FormGroup controlId="formBasicName">
<Label className="text-muted">Name</Label>
<Input
type="text"
name="name"
value={this.state.name}
className="text-primary"
onChange={this.handleChange.bind(this, 'name')}
placeholder="Name"
/>
</FormGroup>
<FormGroup controlId="formBasicSubject">
<Label className="text-muted">Subject</Label>
<Input
type="text"
name="subject"
className="text-primary"
value={this.state.subject}
onChange={this.handleChange.bind(this, 'subject')}
placeholder="Subject"
/>
</FormGroup>
<FormGroup controlId="formBasicMessage">
<Label className="text-muted">Message</Label>
<Input
type="textarea"
name="message"
className="text-primary"
value={this.state.message}
onChange={this.handleChange.bind(this, 'message')}
/>
</FormGroup>
<Button variant="primary" type="submit" value="Send">
Submit
</Button>
</Form>
</>
)
}
}
export default ContactForm
您不一定需要仅使用基于功能的组件才能使用 material ui。
您仍然可以使用基于 class 的组件并利用 withStyles 来使用 classes。
代码段
import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
const styles = {
root: {
background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
border: 0,
borderRadius: 3,
boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
color: 'white',
height: 48,
padding: '0 30px',
//etc...
},
};
class ContactForm extends Component {
state = {
name: '',
email: '',
subject: '',
message: '',
}
...
render() {
const { classes } = this.props; //<----- grab classes here in the props
return (
<>
<h1 className="p-heading1">Get in Touch</h1>
<Form onSubmit={this.handleSubmit.bind(this)}>
<FormGroup controlId="formBasicEmail">
<Label className="text-muted">Email address</Label>
<Input
type="email"
name="email"
value={this.state.email}
className="text-primary"
onChange={this.handleChange.bind(this, 'email')}
placeholder="Enter email"
/>
</FormGroup>
....
</>
)
}
}
export default withStyles(styles)(ContactForm) //<----- see here
在最终设法设置 Emailjs 之后,我现在正在尝试使用 Material UI 文本字段 (https://material-ui.com/components/text-fields/#text-field) 以获得更好的设计。
不幸的是,我无法将 Material UI classes 添加到我的代码中,因为我无法将 Class 更改为功能组件一个状态。有谁知道如何将 class 更改为函数,以便我可以为我的联系表单使用 Material UI 设计?
我的 EmailJS 表单(工作得很好,只是在发布之前更改了我的用户和模板 ID):
import React, { Component } from 'react'
import * as emailjs from 'emailjs-com'
import { Button, FormFeedback, Form, FormGroup, Label, Input } from 'reactstrap'
class ContactForm extends Component {
state = {
name: '',
email: '',
subject: '',
message: '',
}
handleSubmit(e) {
e.preventDefault()
const { name, email, subject, message } = this.state
let templateParams = {
from_name: email,
to_name: 'Altes Waschhaus',
subject: subject,
message_html: message,
}
emailjs.send(
'gmail',
'template_XXXXX',
templateParams,
'user_XXXXX'
)
this.resetForm()
}
resetForm() {
this.setState({
name: '',
email: '',
subject: '',
message: '',
})
}
handleChange = (param, e) => {
this.setState({ [param]: e.target.value })
}
render() {
return (
<>
<h1 className="p-heading1">Get in Touch</h1>
<Form onSubmit={this.handleSubmit.bind(this)}>
<FormGroup controlId="formBasicEmail">
<Label className="text-muted">Email address</Label>
<Input
type="email"
name="email"
value={this.state.email}
className="text-primary"
onChange={this.handleChange.bind(this, 'email')}
placeholder="Enter email"
/>
</FormGroup>
<FormGroup controlId="formBasicName">
<Label className="text-muted">Name</Label>
<Input
type="text"
name="name"
value={this.state.name}
className="text-primary"
onChange={this.handleChange.bind(this, 'name')}
placeholder="Name"
/>
</FormGroup>
<FormGroup controlId="formBasicSubject">
<Label className="text-muted">Subject</Label>
<Input
type="text"
name="subject"
className="text-primary"
value={this.state.subject}
onChange={this.handleChange.bind(this, 'subject')}
placeholder="Subject"
/>
</FormGroup>
<FormGroup controlId="formBasicMessage">
<Label className="text-muted">Message</Label>
<Input
type="textarea"
name="message"
className="text-primary"
value={this.state.message}
onChange={this.handleChange.bind(this, 'message')}
/>
</FormGroup>
<Button variant="primary" type="submit" value="Send">
Submit
</Button>
</Form>
</>
)
}
}
export default ContactForm
您不一定需要仅使用基于功能的组件才能使用 material ui。
您仍然可以使用基于 class 的组件并利用 withStyles 来使用 classes。
代码段
import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
const styles = {
root: {
background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
border: 0,
borderRadius: 3,
boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
color: 'white',
height: 48,
padding: '0 30px',
//etc...
},
};
class ContactForm extends Component {
state = {
name: '',
email: '',
subject: '',
message: '',
}
...
render() {
const { classes } = this.props; //<----- grab classes here in the props
return (
<>
<h1 className="p-heading1">Get in Touch</h1>
<Form onSubmit={this.handleSubmit.bind(this)}>
<FormGroup controlId="formBasicEmail">
<Label className="text-muted">Email address</Label>
<Input
type="email"
name="email"
value={this.state.email}
className="text-primary"
onChange={this.handleChange.bind(this, 'email')}
placeholder="Enter email"
/>
</FormGroup>
....
</>
)
}
}
export default withStyles(styles)(ContactForm) //<----- see here