React+Node+MongoDB注册系统:AJAX请求后组件渲染问题求助
解决React注册后无法跳转渲染仪表盘组件的问题
看起来你在完成注册的AJAX请求后,没法顺利跳转到VendorDashboard组件对吧?我帮你梳理下常见的问题点和解决思路:
常见问题原因
你的代码里提到了用Route和Redirect,但大概率是状态控制逻辑缺失或者路由跳转方式不对导致的。比如AJAX请求成功后没有更新状态来触发Redirect,或者直接在组件里嵌套Route的写法不正确。
具体解决方案
方案1:用状态结合Redirect组件实现跳转
首先在组件的state里添加一个标记位,用来判断注册是否完成,然后在render里根据这个状态决定是否重定向到仪表盘:
import React, { Component } from 'react'; import axios from 'axios'; import VendorDashboard from './../vendor_dashboard/VendorDashboard'; import { Redirect } from 'react-router-dom'; // 注意导入react-router-dom的Redirect class VendorRegistration extends Component { constructor() { super(); this.state = { firstName: '', lastName: '', city: '', state: '', // 新增注册完成的状态标记 isRegistered: false, error: '' }; // 绑定事件处理函数 this.handleSubmit = this.handleSubmit.bind(this); this.handleChange = this.handleChange.bind(this); } handleChange(e) { this.setState({ [e.target.name]: e.target.value }); } handleSubmit(e) { e.preventDefault(); const { firstName, lastName, city, state } = this.state; axios.post('/api/vendor/register', { firstName, lastName, city, state }) .then(res => { // 注册成功后更新状态,触发重定向 this.setState({ isRegistered: true }); }) .catch(err => { this.setState({ error: err.response.data.message }); }); } render() { // 如果注册完成,直接重定向到仪表盘 if (this.state.isRegistered) { return <Redirect to="/vendor-dashboard" />; } // 否则渲染注册表单 return ( <div className="registration-form"> {this.state.error && <p className="error">{this.state.error}</p>} <form onSubmit={this.handleSubmit}> <input type="text" name="firstName" value={this.state.firstName} onChange={this.handleChange} placeholder="First Name" required /> <input type="text" name="lastName" value={this.state.lastName} onChange={this.handleChange} placeholder="Last Name" required /> <input type="text" name="city" value={this.state.city} onChange={this.handleChange} placeholder="City" required /> <input type="text" name="state" value={this.state.state} onChange={this.handleChange} placeholder="State" required /> <button type="submit">Register</button> </form> </div> ); } } export default VendorRegistration;
然后你需要在全局的路由配置里(比如App.js或者专门的Routes.js)添加仪表盘的路由:
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; import VendorRegistration from './path/to/VendorRegistration'; import VendorDashboard from './path/to/VendorDashboard'; function App() { return ( <Router> <Switch> <Route exact path="/register" component={VendorRegistration} /> <Route path="/vendor-dashboard" component={VendorDashboard} /> {/* 其他路由... */} </Switch> </Router> ); } export default App;
方案2:用history.push直接跳转
如果你的VendorRegistration组件是被Route渲染的,那么它会自动接收到history props,你可以直接在AJAX成功后调用history.push来跳转:
// 在handleSubmit的then回调里修改: .then(res => { this.props.history.push('/vendor-dashboard'); })
这种方式不需要额外的状态标记,更直接,但要确保组件是由Route渲染的(也就是在路由配置里用component或者render属性引入的),否则需要用withRouter高阶组件来包装组件,才能拿到history props。
注意事项
- 确保你安装的是
react-router-dom(而不是react-router),前端路由都是用这个包。 - AJAX请求的地址
/api/vendor/register要和后端Node.js的接口地址一致,避免跨域或者404问题。 - 如果用
Redirect,要确保在render里正确判断状态,不要把Redirect放在条件外,否则会一直重定向。
内容的提问来源于stack exchange,提问作者Barry Bonds
相关产品推荐
相关产品推荐

