在 React js 中将功能组件转换为 class 组件
convert functional component to class component in React js
在我的项目中,我使用了 class 组件而不是功能组件,因为我在每个网站上都获得了所有功能组件。你能帮我把功能组件转换成 class 组件吗?请帮助我默认 select 所需的第一个值以提供多个链接。
这是代码沙盒代码https://codesandbox.io/s/material-demo-dt504
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';
const useStyles = makeStyles(theme => ({
formControl: {
margin: theme.spacing(1),
minWidth: 120,
},
selectEmpty: {
marginTop: theme.spacing(2),
},
}));
export default function SimpleSelect() {
const classes = useStyles();
const [age, setAge] = React.useState('');
const inputLabel = React.useRef(null);
const [labelWidth, setLabelWidth] = React.useState(0);
React.useEffect(() => {
setLabelWidth(inputLabel.current.offsetWidth);
}, []);
const handleChange = event => {
setAge(event.target.value);
};
return (
<div>
<FormControl variant="outlined" className={classes.formControl}>
<InputLabel ref={inputLabel} id="demo-simple-select-outlined-label">
Age
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={age}
onChange={handleChange}
labelWidth={labelWidth}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</div>
);
}
希望这对你有用
Converting React function component to class component issue
编辑
要select第一个值,在您的代码中传递这样的确切值
const [age, setAge] = React.useState("10");
import React from 'react';
import Button from '@material-ui/core/Button';
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
export default class SimpleMenu extends React.Component {
constructor(props) {
super(props);
this.state = {
anchorEl: null
};
}
handleClick = event => {
this.setState({anchorEl: event.currentTarget});
};
handleClose = () => {
this.setState({anchorEl: null});
};
render() {
let { anchorEl } = this.state;
return (
<div>
<Button
aria-controls="simple-menu"
aria-haspopup="true"
onClick={this.handleClick}
>
Open Menu
</Button>
<Menu
id="simple-menu"
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={this.handleClose}
>
<MenuItem onClick={this.handleClose}>Profile</MenuItem>
<MenuItem onClick={this.handleClose}>My account</MenuItem>
<MenuItem onClick={this.handleClose}>Logout</MenuItem>
</Menu>
</div>
);
}
}
useState
hook:在构造函数中给this.state
初始状态,并使用this.setState
合并键值状态更新值对
useEffect
钩子:空依赖数组大致相当于 componentDidMount
生命周期函数,所以把那个逻辑移到那里。
useRef
hook:只需使用标准的 React ref.
useStyles
hook:保持回调函数消费主题,使用withStyles
HOC装饰器。
import React, { Component, createRef } from "react";
import { withStyles } from "@material-ui/core/styles";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";
const useStyles = theme => ({
formControl: {
margin: theme.spacing(1),
minWidth: 120
},
selectEmpty: {
marginTop: theme.spacing(2)
}
});
class SimpleSelect extends Component {
constructor(props) {
super(props);
this.state = {
age: "",
labelWidth: 0
};
this.inputLabel = createRef();
}
componentDidMount() {
this.setState({ labelWidth: this.inputLabel.current.offsetWidth });
}
handleChange = event => this.setState({ age: event.target.value });
render() {
const { age, labelWidth } = this.state;
const { classes } = this.props;
return (
<div>
<FormControl variant="outlined" className={classes.formControl}>
<InputLabel
ref={this.inputLabel}
id="demo-simple-select-outlined-label"
>
Age
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={age}
onChange={this.handleChange}
labelWidth={labelWidth}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</div>
);
}
}
export default withStyles(useStyles)(SimpleSelect);
在我的项目中,我使用了 class 组件而不是功能组件,因为我在每个网站上都获得了所有功能组件。你能帮我把功能组件转换成 class 组件吗?请帮助我默认 select 所需的第一个值以提供多个链接。
这是代码沙盒代码https://codesandbox.io/s/material-demo-dt504
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';
const useStyles = makeStyles(theme => ({
formControl: {
margin: theme.spacing(1),
minWidth: 120,
},
selectEmpty: {
marginTop: theme.spacing(2),
},
}));
export default function SimpleSelect() {
const classes = useStyles();
const [age, setAge] = React.useState('');
const inputLabel = React.useRef(null);
const [labelWidth, setLabelWidth] = React.useState(0);
React.useEffect(() => {
setLabelWidth(inputLabel.current.offsetWidth);
}, []);
const handleChange = event => {
setAge(event.target.value);
};
return (
<div>
<FormControl variant="outlined" className={classes.formControl}>
<InputLabel ref={inputLabel} id="demo-simple-select-outlined-label">
Age
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={age}
onChange={handleChange}
labelWidth={labelWidth}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</div>
);
}
希望这对你有用
Converting React function component to class component issue
编辑
要select第一个值,在您的代码中传递这样的确切值
const [age, setAge] = React.useState("10");
import React from 'react';
import Button from '@material-ui/core/Button';
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
export default class SimpleMenu extends React.Component {
constructor(props) {
super(props);
this.state = {
anchorEl: null
};
}
handleClick = event => {
this.setState({anchorEl: event.currentTarget});
};
handleClose = () => {
this.setState({anchorEl: null});
};
render() {
let { anchorEl } = this.state;
return (
<div>
<Button
aria-controls="simple-menu"
aria-haspopup="true"
onClick={this.handleClick}
>
Open Menu
</Button>
<Menu
id="simple-menu"
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={this.handleClose}
>
<MenuItem onClick={this.handleClose}>Profile</MenuItem>
<MenuItem onClick={this.handleClose}>My account</MenuItem>
<MenuItem onClick={this.handleClose}>Logout</MenuItem>
</Menu>
</div>
);
}
}
useState
hook:在构造函数中给this.state
初始状态,并使用this.setState
合并键值状态更新值对
useEffect
钩子:空依赖数组大致相当于 componentDidMount
生命周期函数,所以把那个逻辑移到那里。
useRef
hook:只需使用标准的 React ref.
useStyles
hook:保持回调函数消费主题,使用withStyles
HOC装饰器。
import React, { Component, createRef } from "react";
import { withStyles } from "@material-ui/core/styles";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";
const useStyles = theme => ({
formControl: {
margin: theme.spacing(1),
minWidth: 120
},
selectEmpty: {
marginTop: theme.spacing(2)
}
});
class SimpleSelect extends Component {
constructor(props) {
super(props);
this.state = {
age: "",
labelWidth: 0
};
this.inputLabel = createRef();
}
componentDidMount() {
this.setState({ labelWidth: this.inputLabel.current.offsetWidth });
}
handleChange = event => this.setState({ age: event.target.value });
render() {
const { age, labelWidth } = this.state;
const { classes } = this.props;
return (
<div>
<FormControl variant="outlined" className={classes.formControl}>
<InputLabel
ref={this.inputLabel}
id="demo-simple-select-outlined-label"
>
Age
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={age}
onChange={this.handleChange}
labelWidth={labelWidth}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</div>
);
}
}
export default withStyles(useStyles)(SimpleSelect);