1. 程式人生 > >react專案實戰二 登入註冊頁面的完成

react專案實戰二 登入註冊頁面的完成

1、首先是新建專案,並引入相關依賴

新建專案參考部落格

在開始之前,推薦先學習一下redux的簡單使用

相關庫:

npm install redux --save
npm run eject 展示出所有配置
npm install express --save
npm install -g nodemon //每次修改之後不需要手動重啟server.js
npm install mongoose --save
npm install antd-mobile --save
npm install babel-plugin-import --save 按需載入
npm install redux --save
npm install redux-thunk --sava   處理非同步操作
npm install react-redux --save  自動連線react和redux


npm install babel-plugin-transform-decorators-legacy --save-dev   裝飾器外掛
   在package.json中配置 
   "plugins": [
      "transform-decorators-legacy"
    ]
報錯:
最後使用
"devDependencies": {
    "@babel/plugin-proposal-decorators": "^7.1.0"
  },
"plugins": [
      [
        "@babel/plugin-proposal-decorators",
        {
          "legacy": true
        }
      ]
    ]
    
npm install react-router-dom --save
npm install axios --save   前後端聯調
    配置:"proxy":"http://localhost:9093" 處理跨域請求
npm install cookie-parser --save  使用cookie

2、檔案目錄結構

檔案目錄結構


│  .gitignore
│  list.txt
│  package-lock.json
│  package.json
│  README.md
│  
├─config
├─public
├─scripts
├─server
│      model.js
│      server.js
│      user.js
└─src
    │  config.js
    │  index.css
    │  index.js
    │  reducer.js
    │  
    ├─component
    │  ├─authroute
    │  │      authroute.js
    │  │      
    │  └─logo
    │          job.png
    │          logo.css
    │          logo.js
    │          
    ├─container
    │  ├─login
    │  │      login.js
    │  │      
    │  └─register
    │          register.js
    │          
    └─redux
            user.redux.js
            

各個資料夾的介紹

server

資料夾是為了與資料庫連線,我們此部分這裡只做一個簡單的配置,在後續的文章中我會繼續介紹,

compoent

存放公共元件

container

redux

存放各個物件模組的對應元件狀態變化的處理

index.js

專案主架構,元件的組合

reducer.js

所有的reducer在這個裡邊合併

config.js

專案的一些相關配置

3、開始編碼

首先我們來構建登入註冊的頁面
登入頁面
註冊頁面
如圖所示,登入註冊頁面都分為上下兩個部分,其中上部是logo,下部分是輸入框,
所以我們可以抽離出來三個元件

  • logo
  • login
  • register

logo

import React from 'react'
import logoImg from './job.png'
import './logo.css'

class Logo extends React.Component{
    render(){
        return (
            <div className="logo-container">
                <img className="logo-img" src={logoImg} alt=""/>
            </div>
        )
    }
}

export default Logo

login

import React from 'react'
import Logo from '../../component/logo/logo.js'
import {List,InputItem,WingBlank,WhiteSpace,Button} from 'antd-mobile'

class Login extends React.Component{
    constructor(props){
        super(props);
        //繫結this時間,如果不繫結,無法傳遞this
        this.register = this.register.bind(this);
    }
    register(){
        console.log(this.props);
        //跳轉到註冊頁面
        this.props.history.push('/register')
    }
    render(){
        return (
            <div>
                <Logo></Logo>
                <h2>我是登入頁</h2>
                <WingBlank>
                    <List>
                        <InputItem>使用者名稱</InputItem>
                        <InputItem  type="password">密碼</InputItem>
                    </List>
                    <WhiteSpace/>
                    <Button type="primary">登入</Button>
                    <WhiteSpace/>
                    <Button onClick={this.register} type="primary">註冊</Button>
                </WingBlank>
            </div>
        )
    }
}

export default Login

register

import React from 'react'
import Logo from '../../component/logo/logo'
import {List,InputItem,WingBlank,WhiteSpace,Button,Radio} from 'antd-mobile'
import {connect} from 'react-redux'
import {register} from '../../redux/user.redux'
import '../../index.css'

@connect(
    state => state.user,
    {register}
)
class Register extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            user:'',
            pwd:'',
            repeatpwd:'',
            type:'genius',
        }
        this.handleRegister = this.handleRegister.bind(this)
    }
    //呼叫redux/user.redux中的register方法,判斷是否可以註冊
    handleRegister(){
        this.props.register(this.state)
        // console.log(this.state);
    }
    //監控輸入框的變化,及時更新state中的值
    handleChange(key,val){
        this.setState({
            [key]:val
        })
    }
    render(){
        const RadioItem = Radio.RadioItem
        return (
            <div>
                <Logo></Logo>
                <WingBlank>
                    <List>
                        {this.props.msg?<p className="error-msg">{this.props.msg}</p>:null}
                        <InputItem onChange={v=>this.handleChange('user',v)}>使用者名稱</InputItem>
                        <InputItem onChange={v=>this.handleChange('pwd',v)} type="password">密碼</InputItem>
                        <InputItem onChange={v=>this.handleChange('repeatpwd',v)} type="password">確認密碼</InputItem>
                        <RadioItem onChange={()=>this.handleChange('type','genius')} checked={this.state.type=='genius'}>
                            牛人
                        </RadioItem>
                        <RadioItem onChange={()=>this.handleChange('type','boss')} checked={this.state.type=='boss'}>
                            boss
                        </RadioItem>
                    </List>
                    <WhiteSpace/>
                    <Button type="primary" onClick={this.handleRegister}>註冊</Button>
                    <WhiteSpace/>
                </WingBlank>
            </div>
        )
    }
}

export default Register

authroute 是用來判斷輸入的連結地址是否符合要求以及使用者登入情況,進而判斷是否跳轉

import React from 'react'
import axios from 'axios'
import {withRouter} from 'react-router-dom'

//進行判斷是否登陸並進行路由跳轉
@withRouter
class AuthRoute extends React.Component{
    componentDidMount(){
        const publicList = ['/login','/register']
        const pathname = this.props.location.pathname
        //判斷輸入的連結是否符合要求
        if(publicList.indexOf(pathname)>-1){
            return null
        }
        //獲取使用者資訊
        axios.get('/user/info').then(res=>{
            //判斷是否登入,如果沒有登入,則跳轉到登入介面
            if(res.status==200){
                if(res.data.code==0){

                }else{
                    this.props.history.push('/login')
                }
                console.log(res.data);
            }
        })
        //使用者狀態:是否登陸 
        //現在的URL地址  login是不需要跳轉的
        //使用者的身份是boss還是牛人
        //使用者是否完善資訊(頭像,簡介)
    }
    render(){
        return null
    }
}
export default AuthRoute

注:此部分程式碼提交的簡介為first commit,在檢視原始碼時按照順序看循序漸進,會更容易理解。如果覺得寫得不錯,希望給個start。

相關推薦

react專案實戰 登入註冊頁面完成

1、首先是新建專案,並引入相關依賴 新建專案參考部落格 在開始之前,推薦先學習一下redux的簡單使用 相關庫: npm install redux --save npm run eject 展示出所有配置 npm install express --sav

react專案實戰登入註冊頁面與資料庫連線

ps:此部分(第二部分)的程式碼,提交簡介為second commit 原始碼地址 需要引入依賴庫 npm install body-parser --save 接收post請求返回的引數 npm install utility --save MD5加密

react專案實戰五 個人中心頁面

新增庫依賴 npm install browser-cookies --save 進行瀏覽器cookie的操作 個人中心頁面 頁面的開發沒有什麼難度,直接使用antd-mobile的元件即可 src\component\usercenter\usercente

記錄第一個小專案,基於django的登入註冊頁面

教程來源:http://zmrenwu.com 專案是基於django自帶的auth模組來認證的,檢視AbstractUser模組原始碼,發現有username,firestname,last 和email,不夠用,所以我們繼承這個類, 加上一個nickname屬性 設定

例子:實現最新版本Node.js中Express+mongodb的登入註冊頁面

由於版本差異巨大且不相容的情況下,作為才開始學習Node.js的菜鳥,書籍上的例子是不能看了,因此仿照著網路大神中的例子自己再歸納總結了一遍,方便自己以後檢視。好記性不如爛筆頭嘛。 這裡主要使用的版本是express4.0+mongodb最新版本以及Bootstrap3.0介面所做。 一

安卓專案實戰之CoordinatorLayout實現頁面特效(一)

效果圖如下: material design控制元件簡介: 轉載自:https://blog.csdn.net/gitzzp/article/details/52573068 CoordinatorLayout CoordinatorLayout:協調者佈局。它是support

網站註冊頁面案例及其知識點

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <b

基於servlet的web表單登入註冊頁面

這篇部落格存放很久了,才看到一直在草稿箱裡,再整理一下發出來。 結合嗶哩嗶哩教學視訊,實際寫了一遍web的簡單專案。 一、專案結構圖 二、程式碼片段 1.建立實體類 程式碼如下: package com.liumce.bean; import

springboot整合JPA寫一個登入註冊頁面

建立工程 需要匯入的部件 application.yml配置檔案 spring: devtools: restart: enabled: false datasource: driver-class-name: com.mysql.cj.jdbc.Dr

bootstarp標籤頁實現登入註冊頁面

最簡單的實現樣式      <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <

vue 一個簡單的專案 城市選擇頁面 step3

上篇,我們完成了城市選擇頁面頂部的佈局。本篇,我們來實現城市選擇頁面的列表佈局。 首先建立一個分支 city-list, pull 下來,在新分支上寫程式碼。 好啦。開啟編輯器,在city/components 中建立元件List.vue 初始化一下,List.vue 程式碼 如下。

vue 一個簡單的專案 城市選擇頁面 step4

上篇,我們實現了城市列表的樣式,遮蔽了瀏覽器的滑動,同時,在子元素中沒有設定滑動。本篇我們來設定一個友好的滑動與字母表的佈局。 我們使用第三方包 BetterScroll  地址:https://github.com/ustbhuangyi/better-scroll 先,在專

Hive專案實戰

1.資料清洗   1)資料分析 在video.txt中,視訊可以有多個所屬分類,每個所屬分類用&符號分割,並且分割的兩邊有空格字元,多個相關視訊又用“\t”進行分割。為了分析資料時方便對存在多個子元素的資料進行操作,我們首先進行資料重組清洗操作。 具體做法:

nodejs+fs+express寫的前期的登入註冊頁面

首先,要把資料存放到本地,就必須使用後端,現在沒有使用資料庫而是使用原始的fs寫的一個登入和註冊的頁面,實現是使用者名稱不能重複,根據使用者名稱來判斷該使用者是否註冊過,資料夾中的檔案,是根據每個人的名字作為檔案的名稱。 先寫好前端的頁面,也就是註冊和登入的頁面,就是一個表

使用bootstrap編寫登入註冊頁面,半透明仿蘋果系統風格。

 效果圖:  html程式碼:(程式碼不全) <!--登入按鈕--> <div class="col-xs-1 col-xs-offset-9 aTopAndBottom"> <a hr

PHP PDO+MySQL實現登入註冊頁面

connect.php——連線資料庫,以後要連資料庫直接include,不用再一寫一大堆 <?php header("Content-type: text/html;charset=utf-8"); $dbh = new PDO("mysql:hos

react專案實戰(許可權模組開發八)js檔案分開打包

才開發幾個介面就發現打包出的index.js檔案就有700多kb了,由於部分外掛的js檔案是不會變化的,單獨打包可以充分利用瀏覽器的快取功能。 第一步:在專案跟目錄下面新增一個webpack.config.js檔案 第二步:為了將原有的js分開打,需要修

SSH框架登入註冊頁面用struts的xml配置方式校驗遇到的問題及解決方法

SSH框架用struts的xml配置進行前臺驗證,驗證登入和註冊頁面遇到的問題及解決方式 一、首先新建struts前臺驗證的配置檔案 命名方式是:類名-validation.xml,我的是LoginAction類和RegisterAction類,所以我的

[thinkPHP5專案實戰_06]引入前臺頁面

一個網站的前端分一般分為前臺和後臺兩個部分,下面說明一下如何在tp5中引入前臺頁面。 tp5中訪問的是模組下的控制器,通過控制器獲取檢視下的頁面(模板佈局),輸出替換引導頁面載入靜態檔案(css,js,image) 1.前臺資源佈置 project 應用部署目錄 ├─a

Android 登入註冊頁面遇到的一些問題方法-小白懂得太少

1.String ver =get_ver.getText().toString().trim() 其中toString().trim(),表示獲得物件的欄位的值,然後轉換成string 型別,並且去掉前後空白trim()是去兩邊空格的方法。toString().trim()