使用create-react-app+react-router-dom+axios+antd+react-redux構建react項目

来源:https://www.cnblogs.com/gxp69/archive/2019/10/11/11641560.html
-Advertisement-
Play Games

1、安裝、構建 2、項目目錄 3、antd 修改 src/App.css,在文件頂部引入 antd/dist/antd.css。 antd 目前的預設文案是英文,如果需要使用其他語言,可以參考下麵的方案。 antd 提供了一個 React 組件 ConfigProvider 用於全局配置國際化文案。 ...


1、安裝、構建

# 全局安裝
npm install -g create-react-app
# 構建一個my-app的項目
npx create-react-app my-app
cd my-app

# 啟動編譯當前的React項目,並自動打開 http://localhost:3000/
npm start

2、項目目錄

//預設

├── package.json ├── public # 這個是webpack的配置的靜態目錄 │ ├── favicon.ico │ ├── index.html # 預設是單頁面應用,這個是最終的html的基礎模板 │ └── manifest.json ├── src │ ├── App.css # App根組件的css │ ├── App.js # App組件代碼 │ ├── App.test.js │ ├── index.css # 啟動文件樣式 │ ├── index.js # 啟動的文件(開始執行的入口)!!!! │ ├── logo.svg │ └── serviceWorker.js └── yarn.lock
//修改
├── package.json
├── public                  # 這個是webpack的配置的靜態目錄
│   ├── favicon.ico
│   ├── index.html          # 預設是單頁面應用,這個是最終的html的基礎模板
│   └── manifest.json
├── src
│   ├── assets            # 圖片等靜態資源
│   ├── redux             # 狀態
│   │      ├── action.js                 # action
│   │      ├──reducerjs              # reducer
│   │      └── index.js                 # 主文件
│   ├── router             # 路由
│   │      ├── config.js                 # 配置
│   │      ├── FrontendAuth.js      # 路由守衛
│   │      └── index.js                 # 主文件
│   ├── serve            # 請求
│   │      ├── index.js            # axio
│   ├── views            # 頁面
│   ├── App.css             # App根組件的css
│   ├── App.js              # App組件代碼
│   ├── App.test.js
│   ├── index.css           # 啟動文件樣式
│   ├── index.js            # 啟動的文件(開始執行的入口)!!!!
│   ├── logo.svg
│   └── serviceWorker.js
└── yarn.lock          

 

3、antd

yarn add antd

修改 src/App.css,在文件頂部引入 antd/dist/antd.css

@import '~antd/dist/antd.css';

.App {
  text-align: center;
}

...

antd 目前的預設文案是英文,如果需要使用其他語言,可以參考下麵的方案。

antd 提供了一個 React 組件 ConfigProvider 用於全局配置國際化文案。

import zhCN from 'antd/es/locale/zh_CN';

return (
  <ConfigProvider locale={zhCN}>
    <App />
  </ConfigProvider>
);

4、axios

yarn add axios

/src/serve/index.js,統一配置並綁定到react上

import React from 'react';
import axios from 'axios';
axios.defaults.headers['Content-Type'] = 'application/json';


let config = {
  baseURL: '',
  timeout: 60 * 1000, // Timeout
};
const _axios = axios.create(config);
_axios.interceptors.request.use(
  (config) => {
    // Do something before request is sent
    config.headers['Authorization'] = '';
    return config;
  },
  (error) => {
    // Do something with request error
    return Promise.reject(error);
  }
);

// Add a response interceptor
_axios.interceptors.response.use(
  (response) => {
    // Do something with response data
    return response
  },
  (error) => {
    // Do something with response error
    return Promise.reject();
  }
);
React.Component.prototype.$axios = _axios;

5、router

yarn add react-router-dom

/src/router/config.js

import login from '../views/login';
import record from '../views/record';
import home from '../views/home';


export const routerConfig = [
  {
    path:'/',
    component:home,
    auth:true,
  },{
    path:'/record',
    component:record,
    //auth:true,
  },{
    path:'/login',
    component:login,
  }
];

/src/router/FrontendAuth.js

import React, {Component} from 'react';
import {Route, Redirect} from 'react-router-dom';

export class FrontendAuth extends Component {
  render() {
    const {location, config} = this.props;
    const {pathname} = location;
    const isLogin = localStorage.getItem('__config_center_token')

    // 如果該路由不用進行許可權校驗,登錄狀態下登陸頁除外
    // 因為登陸後,無法跳轉到登陸頁
    // 這部分代碼,是為了在非登陸狀態下,訪問不需要許可權校驗的路由
    const targetRouterConfig = config.find((v) => v.path === pathname);
    if (targetRouterConfig && !targetRouterConfig.auth && !isLogin) {
      const {component} = targetRouterConfig;
      return <Route exact path={pathname} component={component}/>
    }

    if (isLogin) {
      // 如果是登陸狀態,想要跳轉到登陸,重定向到主頁
      if (pathname === '/login') {
        return <Redirect to='/'/>
      } else {
        // 如果路由合法,就跳轉到相應的路由
        if (targetRouterConfig) {
          return <Route path={pathname} component={targetRouterConfig.component}/>
        } else {
          // 如果路由不合法,重定向到 404 頁面
          return <Redirect to='/404'/>
        }
      }
    } else {
      // 非登陸狀態下,當路由合法時且需要許可權校驗時,跳轉到登陸頁面,要求登陸
      if (targetRouterConfig && targetRouterConfig.auth) {
        return <Redirect to='/login'/>
      } else {
        // 非登陸狀態下,路由不合法時,重定向至 404
        return <Redirect to='/404'/>
      }
    }
  }
}

/src/router/index.js

import React, { Component } from 'react';
import { Switch} from 'react-router-dom';

import { FrontendAuth } from './FrontendAuth';
import { routerConfig } from './config';


class Routes extends Component {
  render() {
    return (
      <Switch>
        <FrontendAuth config={routerConfig} />
      </Switch>
    )
  }
}

export default Routes

app.js

import {BrowserRouter as Router} from 'react-router-dom';
import Routes from './router/index'

class App extends Component  {
  render() {
    return (
      <Router>
        <Routes></Routes>
      </Router>
    );
  }
}

export default App;

6、scss

 安裝完後,只要把sass文件改成.scss就行了

npm install node-sass sass-loader --save

7、修改埠號

項目預設埠號是3000,如下可以更改:

在package.json中修改
  "start":"react-scripts start",
為
"start":"set PORT=9000 && react-scripts start",

8、react-redux

redux不是項目必需的,如果你不確定是否需要,那就是不需要,在react無法實現時,再考慮。

npm install react-redux redux --S

 /src/redux/action.js

/*
 * action 類型
 */

export const COUNT = 'COUNT';
/*
 * 初始值
 */

export const config = {
    count:1000
};


/*
 * action 創建函數
 */

export function setCount(value) {
    return { type: COUNT, value }
}

/src/redux/reducer.js

//這是action
import {
  COUNT
} from './actions'

//這是reducer
const reducer = (state , action) => {
  switch (action.type) {
    case COUNT:
      let count =  action.value;
      return {...state,...{count}};
    default:
      return state;
  }
};
export default reducer

/src/redux/index.js

import { createStore } from 'redux';
import {config} from './actions';
import reducer from './reducer';
let store = createStore(reducer,config);

export default store

/src/index.js

import { Provider } from 'react-redux'
import store from './redux/index'

ReactDOM.render(
  <ConfigProvider locale={zhCN}>
    <Provider store={store}>
      <App />
    </Provider>
  </ConfigProvider>, document.getElementById('root'));

//頁面調用示例

import React, { Component } from 'react';
import { connect } from 'react-redux';
import {
  setCount,
} from '../redux/actions'

class ReduxTest extends Component {

  componentDidMount() {
    console.log(this.props)
  }
  render() {
    const { PayIncrease,tiger } = this.props;
    return (
      <div className="App">
        <h2>當月工資為{tiger}</h2>
        <button onClick={PayIncrease}>升職加薪</button>
      </div>
    );
  }
}
//需要渲染什麼數據
function mapStateToProps(state) {
  return {
    tiger: state.count
  }
}
//需要觸發什麼行為
function mapDispatchToProps(dispatch) {
  return {
    PayIncrease: () => dispatch(setCount(99999)),
  }
}

export default ReduxTest = connect(mapStateToProps, mapDispatchToProps)(ReduxTest)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一步準備一個json文件echarts.json(名字無所謂),用來模擬從後臺獲取數據 第二步在頁面直接引用JS文件 第三步在body中準備一個容器,寫好樣式,用來顯示圖表 最後一步在js中初始化echarts對象,實現動態載入數據。 ...
  • 簡介 1. Sass 和 Scss Sass 和 Scss 其實是同一種東西,我們平時都稱之為 Sass;Scss 是 Sass 3 引入新的語法,其語法完全相容 CSS3,並且繼承了 Sass 的強大功能。也就是說,任何標準的 CSS3 樣式表都是具有相同語義的有效的 Scss文件。 兩者之間不同 ...
  • 1、null 對於null有一個歷史存留的 bug,null是對象類型嗎?雖然我們使用 typeof 檢測null是對象類型,這其實是一個 bug。 1.1 原因是什麼 因為 JS 最初的版本是 32 位系統的,為了將性能將用低位存儲變數類型信息,000 開頭表示代表的是對象,此時null表示全零, ...
  • 1. The Coolest Calendar 界面非常漂亮的一款日期選擇插件,有詳細的使用文檔,最新版本 1.5。 點擊下載 查看示例 2. DatePicker 這款日期插件支持單選、多選和時間區間選擇,功能齊全,有 Dialog 和 Flat 兩種模式。 點擊下載 查看示例 3. Tigra ...
  • 常見的有 、`強制瀏覽器全屏 IOS的Web APP模式 可點擊元素出現陰影` 本文主要講一些其他的或者實用的優化手段。 1. 彈出數字鍵盤 跟`IOS pattern input`的類型了。 2. 調用系統的某些功能 3. 打開原生應用 這種方式叫做 ,是一種協議,一般用來訪問 或者 中的某個功能 ...
  • 開發前準備 vue.js2.0中文,項目所使用的js框架 vue-router,vue.js配套路由 vuex,狀態管理 Element,UI框架 1,根據官方指引,構建項目框架 2,使用webpack+ sass 來寫css less是一門css預處理語言,它是拓展了css,增加了變數,Mixin ...
  • 解決Idea、WebStorm下使用Vue cli腳手架項目無法使用Webpack別名的問題 ...
  • 為什麼要用css動畫替換js動畫 導致JavaScript效率低的兩大原因:操作DOM和使用頁面動畫。 用CSS3動畫替代JS模擬動畫的好處: 不占用JS主線程; 可以利用硬體加速; 瀏覽器可對動畫做優化(元素不可見時不動畫減少對FPS影響) CSS3動畫提供了2D和3D以及常規動畫屬性介面,它可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...