在reactJS中声明状态
我在将以下代码添加到新创建的reactJS+Material UI应用程序时遇到问题 要集成的代码在reactJS中声明状态,reactjs,material-ui,Reactjs,Material Ui,我在将以下代码添加到新创建的reactJS+Material UI应用程序时遇到问题 要集成的代码 state = { icon: true } handleClick = e => { const { icon } = this.state this.setState({ icon: !icon }) } render() { const { icon } = this.state return( <i className=
state = { icon: true }
handleClick = e => {
const { icon } = this.state
this.setState({ icon: !icon })
}
render() {
const { icon } = this.state
return(
<i className='large material-icons' onClick={this.handleClick}>
{ icon ? 'add' : 'remove'}
</i>
)
}
state={icon:true}
handleClick=e=>{
const{icon}=this.state
this.setState({icon:!icon})
}
render(){
const{icon}=this.state
返回(
{图标?'add':'remove'}
)
}
我的代码(有效)
Nav.js
import React from 'react';
import ReactDOM from "react-dom";
import { makeStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import Button from '@material-ui/core/Button';
import IconButton from '@material-ui/core/IconButton';
import MenuIcon from '@material-ui/icons/Menu';
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1,
},
menuButton: {
marginRight: theme.spacing(2),
},
title: {
flexGrow: 1,
},
}));
function Nav() {
const classes = useStyles();
return (
<div className={classes.root}>
<AppBar position="static">
<Toolbar>
<IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="Menu">
<MenuIcon />
</IconButton>
<Typography variant="h6" className={classes.title}>
News
</Typography>
<Button color="inherit">Login</Button>
</Toolbar>
</AppBar>
</div>
);
}
export default Nav;
从“React”导入React;
从“react dom”导入react dom;
从'@material ui/core/styles'导入{makeStyles};
从“@material ui/core/AppBar”导入AppBar;
从“@material ui/core/Toolbar”导入工具栏;
从“@material ui/core/Typography”导入排版;
从“@material ui/core/Button”导入按钮;
从“@material ui/core/IconButton”导入IconButton;
从“@material ui/icons/Menu”导入菜单图标;
const useStyles=makeStyles(主题=>({
根目录:{
flexGrow:1,
},
菜单按钮:{
边缘光:主题。间距(2),
},
标题:{
flexGrow:1,
},
}));
函数Nav(){
const classes=useStyles();
返回(
消息
登录
);
}
导出默认导航;
我想做的是做一个按钮,当按下它时,它会改变图标,我尝试了以下方法
function Nav() {
const classes = useStyles();
const state = { icon: true }
handleClick = e => {
const { icon } = this.state
this.setState({ icon: !icon })
}
return (
<div className={classes.root}>
<AppBar position="static">
<Toolbar>
<IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="Menu">
<MenuIcon />
</IconButton>
<Typography variant="h6" className={classes.title}>
News
</Typography>
<Button color="inherit">Login</Button>
<i className='large material-icons' onClick={this.handleClick}>
{ icon ? 'add' : 'remove'}
</i>
</Toolbar>
</AppBar>
</div>
);
}
函数导航(){
const classes=useStyles();
常量状态={icon:true}
handleClick=e=>{
const{icon}=this.state
this.setState({icon:!icon})
}
返回(
消息
登录
{图标?'add':'remove'}
);
}
发生这种情况是因为您试图在功能组件中创建状态,而在以前版本的react中,您无法访问功能组件中的状态(无状态组件)。但是在React的最新版本(即:16.8)之后,您现在可以使用新概念在功能组件中使用状态。针对您的问题,material ui在其较新版本(即v4)中已经结束了对类的支持,因此现在它们只有功能组件,并且使用react挂钩。在这里你可以做两件事
函数导航(){
const classes=useStyles();
const[icon,setIcon]=useState(真)
常量handleClick=e=>{
设置图标(!图标)
}
返回(
消息
登录
{图标?'add':'remove'}
);
}
如果您想使用钩子,请确保您已经使用了react版本16.8。另外,不要忘记从react导入useState,即:
import react,{useState}from'react
只需更改此行,因为您无权访问功能组件内部的此
<i className='large material-icons' onClick={this.handleClick}>
对此,
<i className='large material-icons' onClick={handleClick}>
谢谢,但我仍然收到错误行28:“handleClick”未定义no undef通过将其设为函数handleClick(){setIcon(!icon)}并删除它来解决。是的,因为您无法在函数中访问它,我们在类组件中使用它,我已经编辑了我的答案,现在尝试删除它,在调用句柄click funct并声明它时,在变量中声明它
<i className='large material-icons' onClick={handleClick}>