React报错Invalid hook call 排除常规原因后仍无法解决求助
React无效Hook调用报错排查说明
我排查这个报错已经花了数小时,运行相关代码时触发的错误提示如下:
1. 你可能安装了版本不匹配的React和渲染器(如React DOM) 2. 你可能违反了Hook的使用规则 3. 你的应用中可能存在多份React副本 可参考官方调试指南排查修复该问题
我已经多次查看对应排查指南,尝试修复上述三类可能的触发原因,均未解决问题:
- 开发依赖使用的react版本为17.0.2,react-dom版本为17.0.2,二者版本匹配
- 已安装eslint-plugin-react-hooks规则,校验确认函数组件中不存在Hook使用违规问题
- 执行
npm ls react和npm ls react-dom命令排查,确认不存在重复的React版本
相关代码
Form组件代码
import React, { useState } from 'react'; import { TextField, Button, Typography, Paper } from '@material-ui/core'; import FileBase from 'react-file-base64'; import { useDispatch } from 'react-redux'; import useStyles from './styles'; import { createPost } from '../../actions/posts'; const Form = () => { const [postData, setPostData] = useState({ creator: '', title: '', message: '', tags: '', selectedFile: '', }); const classes = useStyles(); const dispatch = useDispatch(); const handelSubmit = (e) => { e.preventDefault(); dispatch(createPost(postData)); } const clear = () => { } return ( <Paper className={classes.paper}> <form autoComplete="off" noValidate className={`${classes.root} ${classes.form}`} onSubmit={handelSubmit}> <Typography variant="h6">Creating a Memory</Typography> <TextField name="creator" variant="outlined" label="Creator" fullWidth value={postData.creator} onChange={(e) => setPostData({ ...postData, creator: e.target.value })} /> <TextField name="title" variant="outlined" label="Title" fullWidth value={postData.title} onChange={(e) => setPostData({ ...postData, title: e.target.value })} /> <TextField name="message" variant="outlined" label="Message" fullWidth value={postData.message} onChange={(e) => setPostData({ ...postData, message: e.target.value })} /> <TextField name="tags" variant="outlined" label="Tags" fullWidth value={postData.tags} onChange={(e) => setPostData({ ...postData, tags: e.target.value })} /> <div className={classes.fileInput}> <FileBase type="file" multiple={false} onDone={({base64}) => setPostData({ ...postData, selectedFile: base64})} /> </div> <Button className={classes.buttonSubmit} variant="contained" color="primary" size="large" type="submit" fullWidth>Submit</Button> <Button variant="contained" color="secondary" size="small" onClick={clear} fullWidth>Clear</Button> </form> </Paper> ); } export default Form;
Posts组件代码
import React from 'react'; import { Grid, CircularProgress } from '@material-ui/core'; import { useSelector } from 'react-redux'; import Post from './Post/Post'; import useStyles from './styles'; const Posts = () => { const posts = useSelector((state) => state.posts); const classes = useStyles(); return ( !posts.length ? <CircularProgress /> : ( <Grid className={classes.container} container alignItems="stretch" spacing={3}> {posts.map((post) => ( <Grid key={post._id} item xs={12} sm={6}> <Post post={post} /> </Grid> ))} </Grid> ) ); } export default Posts;
Post组件代码
import React from 'react'; import { Card, CardActions, CardContent, CardMedia, Button, Typography } from '@material-ui/core'; import ThumbUpAltIcon from '@material-ui/icons/ThumbUpAlt'; import DeleteIcon from '@material-ui/icons/Delete'; import MoreHorizIcon from '@material-ui/icons/MoreHoriz'; import moment from 'moment'; import useStyles from './styles'; const Post = ({ post }) => { const classes = useStyles(); return ( <Card className={classes.card}> <CardMedia className={classes.media} image={post.selectedFile} title={post.title} /> <div className={classes.overlay}> <Typography variant="h6">{post.creator}</Typography> <Typography variant="body2">{moment(post.createdAt).fromNow()}</Typography> </div> <div className={classes.overlay2}> <Button style={{color: 'white'}} size="small" onClick={() => {}}> <MoreHorizIcon fontSize="default" /> </Button> </div> <div className={classes.details}> <Typography variant="body2" color="textSecondary">{post.tags.map((tag) => `#${tag} `)}</Typography> </div> <CardContent> <Typography className={classes.title} variant="h5" gutterBottom>{post.message}</Typography> </CardContent> <CardActions className={classes.cardActions}> <Button size="small" color="primary" onClick={() => {}}> <ThumbUpAltIcon fontSize="small" /> Like {post.likeCount} </Button> <Button size="small" color="primary" onClick={() => {}}> <DeleteIcon fontSize="small" /> Delete </Button> </CardActions> </Card> ); } export default Post;
样式文件代码
import { makeStyles } from '@material-ui/core/styles'; export default makeStyles((theme) => ({ mainContainer: { display: 'flex', alignItems: 'center', }, smMargin: { margin: theme.spacing(1), }, actionDiv: { textAlign: 'center', }, }));
内容的提问来源于stack exchange,提问作者Oz Avrahami
相关产品推荐
相关产品推荐

