区块链电子投票系统Signup页面空白问题求助
问题描述
我正在开发基于区块链的电子投票系统作为毕业设计,登录页面点击“Sign up”按钮后能跳转至Signup页面,但该页面仅显示空白白屏,无任何内容,尝试多种解决方案无效,请求帮忙定位问题。
相关代码文件
Login.jsx
import { useState } from "react"; import axios from "axios"; import { Link } from "react-router-dom"; import './styles.css'; const Login = () => { const [data, setData] = useState({ voter_id: "", password: "" }); const [error, setError] = useState(""); const handleChange = ({ currentTarget: input }) => { setData({ ...data, [input.name]: input.value }); }; const handleSubmit = async (e) => { e.preventDefault(); try { const url = "http://localhost:5000/api/signin"; const { data: res } = await axios.post(url, data); localStorage.setItem("access_token", res.data); window.location = "/"; } catch (error) { if ( error.response && error.response.status >= 400 && error.response.status <= 500 ) { setError(error.response.data.message); } } }; return ( <div className={'login_container'}> <div className="login_form_container"> <div className="left"> <form className="form_container" onSubmit={handleSubmit}> <h1>Log in</h1> <input type="voter_id" placeholder="Voter_id" name="voter_id" onChange={handleChange} value={data.voter_id} required className="input" /> <input type="password" placeholder="Password" name="password" onChange={handleChange} value={data.password} required className="input" /> {error && <div className="error_msg">{error}</div>} <Link to="/"> <button type="submit" className="green_btn"> Sign In </button> </Link> </form> </div> <div className="right"> <h1>New Here ?</h1> <button type="button" className="white_btn"> <Link to="/Signup"> Sign Up </Link> </button> </div> </div> </div> ); }; export default Login;
Signup.jsx
import { useState } from "react"; import axios from "axios"; import { Link, Redirect } from "react-router-dom"; import './styles.css' const Signup = () => { const [data, setData] = useState({ firstName: "", lastName: "", email: "", password: "", }); const [error, setError] = useState(""); const navigate = Redirect(); const handleChange = ({ currentTarget: input }) => { setData({ ...data, [input.name]: input.value }); }; const handleSubmit = async (e) => { e.preventDefault(); try { const url = "http://localhost:5000/api/signup"; const { data: res } = await axios.post(url, data); navigate("/login"); console.log(res.message); } catch (error) { if ( error.response && error.response.status >= 400 && error.response.status <= 500 ) { setError(error.response.data.message); } } }; return ( <div className="signup_container"> <div className="signup_form_container"> <div className="left"> <h1>Welcome Back</h1> <Link to="/login"> <button type="button" className="white_btn"> Sign in </button> </Link> </div> <div className="right"> <form className="form_container" onSubmit={handleSubmit}> <h1>Create Account</h1> <input type="text" placeholder="voter_id" name="voter_id" onChange={handleChange} value={data.voter_id} required className="input" /> <input type="password" placeholder="password" name="password" onChange={handleChange} value={data.password} required className="input" /> <input type="password" placeholder="password_confirmation" name="password_confirmation" onChange={handleChange} value={data.password_confirmation} required className="input" /> {error && <div className="error_msg">{error}</div>} <button type="submit" className="green_btn"> Sign Up </button> </form> </div> </div> </div> ); }; export default Signup;
index.js
import React from "react"; import ReactDOM from "react-dom/client"; import { BrowserRouter, Route, Switch, Redirect } from "react-router-dom"; import "bootstrap/dist/css/bootstrap.min.css"; import "./assets/css/animate.min.css"; import "./assets/scss/light-bootstrap-dashboard-react.scss?v=2.0.0"; import "./assets/css/demo.css"; import "@fortawesome/fontawesome-free/css/all.min.css"; import Login from "views/Login/Login"; import AdminLayout from "layouts/Admin.js"; import Signup from "./views/Signup/Signup"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <BrowserRouter> <Switch> <Route path="/login" component={Login} /> <Route path="/signup" exact element={<Signup/>} /> <Route path="/admin" render={(props) => <AdminLayout {...props} />} /> <Redirect from="/" to="/admin/Voting_List" /> <Route path="/" component={Login} /> </Switch> </BrowserRouter> );
页面截图


问题定位与修复方案
1. 路由相关问题
- 路径大小写不匹配:Login页面的
Link指向/Signup(首字母大写),但index.js中路由定义的是/signup(小写),导致路由无法正确匹配组件。 - React Router版本语法混用:index.js同时使用了v5的
Switch、component/render属性和v6的element属性,语法冲突导致路由渲染异常。
2. Signup组件核心错误
- 错误使用Redirect组件:
const navigate = Redirect();是完全错误的用法,Redirect是React组件,不是导航函数,这会直接抛出错误导致组件渲染失败。 - State字段缺失:组件state中未定义
voter_id和password_confirmation,但表单中绑定了这两个字段,会引发undefined报错,阻断渲染。 - 导航方式错误:v6版本中
Redirect已被useNavigate钩子替代,应使用该钩子实现页面跳转。
具体修复步骤
修复Login.jsx的路径问题
将Sign Up按钮的链接改为小写:
<button type="button" className="white_btn"> <Link to="/signup"> Sign Up </Link> </button>
统一React Router语法(推荐升级到v6)
修改index.js为v6标准写法:
import React from "react"; import ReactDOM from "react-dom/client"; import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; import "bootstrap/dist/css/bootstrap.min.css"; import "./assets/css/animate.min.css"; import "./assets/scss/light-bootstrap-dashboard-react.scss?v=2.0.0"; import "./assets/css/demo.css"; import "@fortawesome/fontawesome-free/css/all.min.css"; import Login from "views/Login/Login"; import AdminLayout from "layouts/Admin.js"; import Signup from "./views/Signup/Signup"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <BrowserRouter> <Routes> <Route path="/login" element={<Login />} /> <Route path="/signup" element={<Signup />} /> <Route path="/admin/*" element={<AdminLayout />} /> <Route path="/" element={<Navigate to="/admin/Voting_List" />} /> </Routes> </BrowserRouter> );
修复Signup.jsx的所有错误
import { useState } from "react"; import axios from "axios"; import { Link, useNavigate } from "react-router-dom"; import './styles.css' const Signup = () => { // 补充缺失的state字段 const [data, setData] = useState({ firstName: "", lastName: "", email: "", voter_id: "", password: "", password_confirmation: "" }); const [error, setError] = useState(""); // 使用useNavigate钩子实现导航 const navigate = useNavigate(); const handleChange = ({ currentTarget: input }) => { setData({ ...data, [input.name]: input.value }); }; const handleSubmit = async (e) => { e.preventDefault(); try { const url = "http://localhost:5000/api/signup"; const { data: res } = await axios.post(url, data); navigate("/login"); console.log(res.message); } catch (error) { if ( error.response && error.response.status >= 400 && error.response.status <= 500 ) { setError(error.response.data.message); } } }; return ( <div className="signup_container"> <div className="signup_form_container"> <div className="left"> <h1>Welcome Back</h1> <Link to="/login"> <button type="button" className="white_btn"> Sign in </button> </Link> </div> <div className="right"> <form className="form_container" onSubmit={handleSubmit}> <h1>Create Account</h1> <input type="text" placeholder="voter_id" name="voter_id" onChange={handleChange} value={data.voter_id} required className="input" /> <input type="password" placeholder="password" name="password" onChange={handleChange} value={data.password} required className="input" /> <input type="password" placeholder="password_confirmation" name="password_confirmation" onChange={handleChange} value={data.password_confirmation} required className="input" /> {error && <div className="error_msg">{error}</div>} <button type="submit" className="green_btn"> Sign Up </button> </form> </div> </div> </div> ); }; export default Signup;
额外排查建议
- 打开浏览器开发者工具(F12),查看控制台是否有其他报错信息,帮助定位剩余问题。
- 确认Signup组件的
styles.css文件路径正确,确保样式能正常加载。
内容的提问来源于stack exchange,提问作者MR_DEVLOPER 01
相关产品推荐
相关产品推荐

