React 實踐項目 (四)

来源:http://www.cnblogs.com/yuicon/archive/2017/07/23/7224325.html
-Advertisement-
Play Games

React在Github上已經有接近70000的 star 數了,是目前最熱門的前端框架。而我學習React也有一段時間了,現在就開始用 React+Redux 進行實戰! 上回說到使用Redux-saga 管理 Redux 應用非同步操作,應用還是只有一個首頁.現在開始構建一個新的投稿頁面並使用 R ...


React在Github上已經有接近70000的 star 數了,是目前最熱門的前端框架。而我學習React也有一段時間了,現在就開始用 React+Redux 進行實戰!

上回說到使用Redux-saga 管理 Redux 應用非同步操作,應用還是只有一個首頁.現在開始構建一個新的投稿頁面並使用 React-Router 進行路由管理.

React 實踐項目 (一)

React 實踐項目 (二)

React 實踐項目 (三)

React 實踐項目 (四)

- 首先我們來構建投稿頁面

創建 src/containers/SubmitEntry.js

/**
 * Created by Yuicon on 2017/7/13.
 * https://github.com/Yuicon
 */
import React, {Component} from 'react';
import {Button, Form, Input, Switch, Notification} from "element-react";
import {connect} from "react-redux";
import {createEntryAction} from '../../redux/action/entries';
import './SubmitEntry.css';

@connect(
  (state) => {
    return ({
      entries: state.entries,
    });
  },
  {createEntryAction: createEntryAction}
)
export default class SubmitEntry extends Component {

  constructor(props) {
    super(props);

    this.state = {
      form: {
        title: '',
        content: '',
        original: true,
        originalUrl: null,
        english: false,
        type: 'article',
      },
    loading: false,
    };
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.entries.get('saveSuccess')) {
      Notification.success({
        title: '成功',
        message: '投稿成功',
        duration: 1500
      });
      this.setState({form: {
        title: '',
        content: '',
        original: true,
        originalUrl: null,
        english: false,
        type: 'article',
      }});
    } else if (nextProps.entries.get('error')) {
      Notification.error({
        title: '錯誤',
        message: nextProps.entries.get('error'),
        type: 'success',
        duration: 1500
      });
    }
    this.setState({loading: false});
  }

  handleSubmit = () => {
    this.props.createEntryAction(this.state.form);
    this.setState({loading: true});
  };

  handleChange = (key, value) => {
    this.setState({
      user: Object.assign(this.state.form, {[key]: value})
    });
  };

  render(){
    return(
      <div className="SubmitEntry-container">
        <div className="head">
          <h2>推薦文章到掘金</h2>
          <p>感謝分享,文章的審核時間約1-2個工作日</p>
        </div>
        <div className="entry-form">
          <Form model={this.state.form} labelWidth="80" onSubmit={this.handleSubmit}>
            <Form.Item label="分享網址">
              <Input value={this.state.form.originalUrl} onChange={this.handleChange.bind(this, 'originalUrl')}/>
            </Form.Item>
            <Form.Item label="標題">
              <Input value={this.state.form.title} onChange={this.handleChange.bind(this, 'title')}/>
            </Form.Item>
            <Form.Item label="描述">
              <Input value={this.state.form.content} onChange={this.handleChange.bind(this, 'content')}/>
            </Form.Item>
            <Form.Item >
              <Switch
                value={this.state.form.original}
                onChange={this.handleChange.bind(this, 'original')}
                onText="原創"
                offText="轉載">
              </Switch>
            </Form.Item>
            <Form.Item >
              <Switch
                value={this.state.form.english}
                onChange={this.handleChange.bind(this, 'english')}
                onText="英文"
                offText="中文">
              </Switch>
            </Form.Item>
            <Form.Item >
              <Button type="primary" onClick={this.handleSubmit} loading={this.state.loading}>
                發佈
              </Button>
            </Form.Item>
          </Form>
        </div>
      </div>
    )
  }
}

相關的Redux部分已經講過.就不重覆介紹了,感興趣的可以查看示例代碼

  • 頁面創建好了,開始使用 React-Router 管理路由

  • 首先是添加依賴

編輯 package.json

     // react-router-dom 包含 react-router
    "react-router-dom": "^4.1.1",
  • 編輯 App.js
/**
 * Created by Yuicon on 2017/6/25.
 */
import React, { Component } from 'react';
import {BrowserRouter as Router,Route} from 'react-router-dom'
import './App.css';
import Index from "../Index/Index";
import Header from "../Header/Header";
import SubmitEntry from "../SubmitEntry/SubmitEntry";

export default class App extends Component {

  render(){
    return(
    <Router>
      <div className="App">
        <Route component={Header}/>
        <Route exact path="/" component={Index}/>
        <Route exact path="/submit-entry" component={SubmitEntry}/>
      </div>
    </Router>
    )
  }

}

Router:

Router 一共有三種,我們採用的是常用的 browserHistory

browserHistory h5的history
hashHistory 老版本瀏覽器的history
memoryHistory node環境下的history,存儲在memory中

Route :

每個 Route 標簽都對應一個UI頁面,它的職責就是當頁面的訪問地址與 Route 上的 path 匹配時,就渲染出對應的 UI 界面。
而 <Route component={Header}/> 是沒有 path 的,這意味著在每個頁面都會渲染出 Header 組件.

exact :

Route 上的 exact props 表示採用嚴格匹配,頁面的訪問地址與 Route 上的 path 必須一樣
<Route exact path="/" component={Index}/> 只會匹配 '/' , 不會匹配 '/submit-entry'
<Route path="/" component={Index}/> 會匹配所有 '/' 開頭的路徑

history:

常用方法

push(path, [state]) 在歷史堆棧信息裡加入一個新條目。
常用於頁面跳轉,如:this.props.history.push('/'); 跳轉至首頁

replace(path, [state]) 在歷史堆棧信息里替換掉當前的條目
與 push 的區別是無法通過歷史堆棧返回跳轉前的頁面

goBack() 等同於瀏覽器的後退鍵

match:

match 對象包含了 Route 如何與 URL 匹配的信息,具有以下屬性:

params: object 路徑參數,通過解析 URL 中的動態部分獲得鍵值對

isExact: bool 為 true 時,整個 URL 都需要匹配

path: string 用來匹配的路徑模式,用於創建嵌套的

url: string URL 匹配的部分,用於嵌套的

常用於獲取路徑中的參數
有這樣一個路由 <Route path="/:id" component={Child}/>
在 Child 中可以這樣獲取到 id 參數 this.props.match.params.id

  • 結語

現在我們得到了一個可以見人的應用了,剩下的大部分是一些業務代碼。為了檢驗效果當然是選擇部署到伺服器。下篇文章將會介紹利用 nginx 的 docker 鏡像部署 React 應用。
完整項目代碼地址:https://github.com/DigAg/digag-pc-react


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

-Advertisement-
Play Games
更多相關文章
  • Sequelize模型之間存在關聯關係,這些關係代表了資料庫中對應表之間的主/外鍵關係。基於模型關係可以實現關聯表之間的連接查詢、更新、刪除等操作。本文將通過一個示例,介紹模型的定義,創建模型關聯關係,模型與關聯關係同步資料庫,及關係模型的增、刪、改、查操作。 資料庫中的表之間存在一定的關聯關係,表 ...
  • 近期在學習【時間管理】方面的課程,其中有一期講了蕃茄工作法,發現是個好多東西。蕃茄工作法核心思想就是:工作25分鐘,休息5分鐘。如果您好瞭解更多可以自行度娘。 在加上本人是一個程式猿,就想用程式的方式來表達對此工作法的敬意。因此就產生了用vue實現一個tomato timer的想法。演示地址 一、v ...
  • 一、首先是喜聞樂見的position方法,經典且萬能,用法如下: 不需要水平居中可以去掉left和margin-left。 劃重點:需要父元素和子元素都定義寬高,自適應是不可能自適應的,這輩子都不可能自適應的。 二、 display:table-cell能夠使大小不固定的元素實現垂直居中佈局,先來一 ...
  • //首先寫一個導航欄樣式 .nav{ width:560px; height: 50px; font:bold 0/50px Arial; text-align:center; margin:40px auto 0; background: #f65f57; border-radius:10px;/ ...
  • 我們扒取到網站源碼很多時候發現路徑是採用相對路徑,這時候我們就需要採用base標簽了,用法非常簡單, <base href="我們扒取網站的功能變數名稱"/> 這時相對路徑就相對於這個網站功能變數名稱了,就可以正常顯示效果了 ...
  • js獲取單選按鈕的值 js獲取覆選框的值 ...
  • [1]安裝 [2]命令行 [3]標簽 [4]內容 [5]屬性 [6]註釋 [7]代碼 [8]條件 [9]迴圈 [10]混入 [11]包含 [12]繼承 [13]簡易模板 ...
  • 在平時的開發項目中,難免接觸前端的知識,需要寫介面,有時候用到js中的ajax跨越請求,總結了ajax的寫法。 開始之前,需要準備兩個文件,ajax.php ;ajax.html 1.ajax的基本步驟(ajax.php) ajax,有同步非同步的區別?非同步:把小弟派出去了,什麼時候回來,什麼時候處理 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...