React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn)
上一篇在配置好了webpack和react的環(huán)境后,接下來開始寫登錄界面,以及接下來的跳轉(zhuǎn)到主頁的功能。
1、首先看一下總體的目錄結(jié)構(gòu)。
因?yàn)楹芏鄷r(shí)候在看別人寫的例子的時(shí)候因?yàn)槟夸浗Y(jié)構(gòu)不熟悉后邊會(huì)出現(xiàn)意想不到的岔子。
2、大體流程:
1)webpack配置入口文件src/index.js
2)運(yùn)行index.html后首先加載入口文件src/index.js
3)加載路由表src/router/index.js
4)根據(jù)路由表中的配置會(huì)首先加載登錄界面src/login.js
5)當(dāng)在登錄界面登錄成功后跳轉(zhuǎn)到src/components/myView.js
6)在myView文件中點(diǎn)擊左側(cè)菜單會(huì)分別顯示指定頁面(都是在路由表中配置)
3、寫HTML文件。
其中,1)id為myContent處是為了放置我們寫的組件。
2)script中加載的文件時(shí)webpack打包后的js文件。
<body> <div id="myContent"></div> <script src="./dist/bundle.js"></script> </body>
4、登錄界面寫在了login.js中
1)引入必要的模塊:antd(Ant Design )是一個(gè)組件庫,我們項(xiàng)目中使用的組件都來自它。(https://ant.design/index-cn)(不引入antd.css時(shí),那么界面顯示不出來樣式)
import React from 'react' import {Form,Input,Icon, Button} from 'antd' // import {render} from 'react-dom' // import axios from 'axios' import '../node_modules/antd/dist/antd.css'//不引入這個(gè)文件那么不顯示antd的樣式 import './style/login.css';
2)創(chuàng)建登錄表單組件。除了基本的Form、Input、Button組件外,實(shí)現(xiàn)跳轉(zhuǎn)功能的主要是history.push('/View');(其中,history = this.props.history;)push函數(shù)中的路徑是路由表中配置的路徑( ),二者要對(duì)應(yīng)起來。
class LoginFrom extends React.Component{ constructor(){ super() } handleSubmit = (e) => { //提交之前判斷輸入的字段是否有錯(cuò)誤 e.preventDefault(); **let history = this.props.history;** this.props.form.validateFields((errors,values)=>{ if (!errors) { console.log('Received values of form: ', values); **history.push('/View');** } }) } render(){ //Form.create 包裝的組件會(huì)自帶this.props.form屬性,該屬性提供了一系列API,包括以下4個(gè) //getFieldDecorator用于和表單進(jìn)行雙向綁定 //isFieldTouched判斷一個(gè)輸入控件是否經(jīng)歷過 getFieldDecorator 的值收集時(shí)機(jī) options.trigger(收集子節(jié)點(diǎn)的值的時(shí)機(jī),默認(rèn)時(shí)onChange) //getFieldError獲取某個(gè)輸入控件的 Error //獲取一組輸入控件的 Error ,如不傳入?yún)?shù),則獲取全部組件的 Error const { getFieldDecorator, getFieldsError, getFieldError, isFieldTouched } = this.props.form; const userNameError = isFieldTouched('userName') && getFieldError('userName'); const passWordError = isFieldTouched('password') && getFieldError('password'); return ( <div className="login"> <div className="login-form"> <div className="login-logo"> <div className="login-name">MSPA</div> </div> <Form onSubmit={this.handleSubmit}> {/* 一個(gè)FromItem中放一個(gè)被 getFieldDecorator 裝飾過的 child */} <Form.Item validateStatus={userNameError ? 'error' : ''}//validateStatus為校驗(yàn)狀態(tài),如不設(shè)置,則會(huì)根據(jù)校驗(yàn)規(guī)則自動(dòng)生成,可選:'success' 'warning' 'error' 'validating' > { getFieldDecorator('userName',{ rules:[{required:true,message:"Please input your username!"}] })( <Input prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }}/>} placeholder="Username" /> ) } </Form.Item> <Form.Item validateStatus={passWordError ? "error" : ''} > { getFieldDecorator('passWord',{ rules:[{required:true,message:"Please input your Password!"}] })( <Input prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }}/>} placeholder="Password" /> ) } </Form.Item> <Form.Item> <Button type="primary" htmlType="submit" disabled={hasErrors(getFieldsError)} >登錄 </Button> </Form.Item> </Form> </div> </div> ) } } let LoginForm = Form.create()(LoginFrom); export default LoginForm;
3、在第二步中我們已經(jīng)把靜態(tài)頁面寫出來了,接下來就是配置路由表**了。**我們將路由信息都配置在了router文件夾下的index.js中。react-router中文文檔(https://react-guide.github.io/react-router-cn/),其中history的簡單介紹可以參考(http://chabaoo.cn/article/208929.htm),比較容易快速理解。
代碼如下:前三行中引入的模塊是基本的模塊,后邊import的模塊是寫好的組件:首頁顯示login界面,登錄成功后跳轉(zhuǎn)到myView界面,myPicture和myDocument是在myView界面點(diǎn)擊后所顯示的組件。(嵌套路由)
import React from 'react' import {HashRouter as Router , Route , Switch} from 'react-router-dom' import { createBrowserHistory } from "history"; import MyView from '../components/myView.js' import LoginModule from '../login.js' import MyPicture from '../components/myPicture' import MyDocument from '../components/myDocument.js' export default class MyRoute extends React.Component{ render(){ return( <Router history={createBrowserHistory()}> <Switch> <Route exact path="/" component={LoginModule}/> <MyView path='/View' component={MyDocument}> <Route path="/View/abc" component={MyDocument} /> <Route path="/View/myPicture" component={MyPicture} /> </MyView> </Switch> </Router> ) } }
4、接下來我們在src文件夾下的index.js(程序的入口文件)文件中寫如下代碼。
import MyRoute from './router/index.js' import {render} from 'react-dom' import React from 'react' render( <MyRoute />, document.getElementById('myContent') );
5、程序測試結(jié)果如下:
1)登錄界面(login.js):
2)輸入用戶名和密碼點(diǎn)擊登錄后的跳轉(zhuǎn)界面(myView.js):
到此這篇關(guān)于React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn)的文章就介紹到這了,更多相關(guān)React 路由實(shí)現(xiàn)登錄跳轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react實(shí)現(xiàn)列表滾動(dòng)組件功能
在開發(fā)項(xiàng)目的時(shí)候,從服務(wù)端獲取到數(shù)據(jù)列表后,展示給用戶看,需要實(shí)現(xiàn)數(shù)據(jù)自動(dòng)滾動(dòng)效果,怎么實(shí)現(xiàn)呢,下面小編給大家分享react實(shí)現(xiàn)列表滾動(dòng)組件功能實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2023-09-09react-draggable實(shí)現(xiàn)拖拽功能實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于react-draggable實(shí)現(xiàn)拖拽功能的相關(guān)資料,React-Draggable一個(gè)使元素可拖動(dòng)的簡單組件,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08react+antd實(shí)現(xiàn)動(dòng)態(tài)編輯表格數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了react+antd實(shí)現(xiàn)動(dòng)態(tài)編輯表格數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08React文件名和目錄規(guī)范最佳實(shí)踐記錄(總結(jié)篇)
React在使用時(shí)非常靈活,如果沒有一個(gè)規(guī)范約束項(xiàng)目,在開發(fā)過程中會(huì)非?;靵y,本文將介紹幾個(gè)優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡述一下幾種通用的類型,用來區(qū)分文件的功能,感興趣的朋友一起看看吧2022-05-05在React中強(qiáng)制重新渲染的4 種方式案例代碼
這篇文章主要介紹了在React中強(qiáng)制重新渲染的4 種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12