React 实践项目 (四)

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

时间: 2024-10-07 04:31:59

React 实践项目 (四)的相关文章

React 实践项目 (五)

React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一)React 实践项目 (二)React 实践项目 (三)React 实践项目 (四)React 实践项目 (五) 这次我们把应用部署到服务器上. 项目到现在麻雀虽小五脏俱全,为了提高我们写代码的积极性,自然是选择部署到服务器上在小伙伴面前秀一波了.部署 React 应用也是非常方便简单的. 打包应

android 实践项目四

android 实践项目四 本周主要是开发android baidumap实现公交的查询 1.权限的取得和对屏幕的支持 1 <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > 2 </uses-permission> 3 <uses-permission android:name="android.permission.ACCESS_NETWORK

React 实践项目 (三)

React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行状态管理,这次我们使用Redux-saga 管理 Redux 应用异步操作 React 实践项目 (一)React 实践项目 (二)React 实践项目 (三) - 首先我们来看看登陆的 Reducer export const auth = (state = initialState, actio

React 实践项目 (二)

React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一)本次实践代码 部署好的网址 上回说到用React写了一个带Header的首页,我们这次实践就使用Redux进行状态管理 Rudex 应用中所有的 state 都以一个对象树的形式储存在一个单一的 store 中.惟一改变 state 的办法是触发 action,一个描述发生什么的对象.为了描述 a

android 实践项目 总结 (修改)

Android开发项目:百度地图的调用 在一个不熟悉的环境中,获得自己的位置,选择合适的就餐地点,住宿和公交路线成为一项难题.本次的实践项目就是为了解决上述难题的,通过调用百度地图的接口实现定位.查询公交路线.寻找合适的餐饮及住宿等功能,满足人们出行功能. 一 需求分析 1.1 客户需求 一个项目的开发,首先要了解客户的需求,否则这个项目没有任何开发的价值.在社会快速发展的今天,人员流通较快,选择合适的交通线路.餐馆及住宿成为一项难题,因此根据客户的需求,进行开发合适的项目来满足客户的需求. 1

Android实践项目汇报

Android实践项目:推箱子 推箱子是一款来自日本的古老游戏,其设计目的是训练人的逻辑思维能力.游戏场景一般是设定在空间狭小的仓库中,要求把箱子摆放到指定位置.这就要求玩家巧妙的运用有限的空间和通道,合理的安排箱子的位置和移动次序才可能完成任务. 随着计算机游戏的发展,很多编程爱好者基于该游戏的思想开发了出各种版本.各种类型的推箱子.这其中也包括很多手机版本的实现,伴随着手机与计算机的普及,很快推箱子游戏便进入了千家万户. 一.需求分析: 2.1 功能需求 在游戏开发之前,首先需要对游戏所应该

python编程快速上手之第10章实践项目参考答案

  本章主要讲了python程序的调试,当程序有BUG或异常的时候,我们如何调试代码找出问题点.其实在本章之前的章节我们做练习的时候都会遇到各种各样的错语和异常,最初当不知道程序哪里出错的情况下不可否认的都使用了print语句进行输出并调试代码.没错print也是调试代码的一种工具,直观简单,便也有缺点,就是调试好后要进行删除,也是件麻烦事,于是就有了本章介绍的assert(断言),logging(日志)以及各种调试工具的出现. 首先来回顾一下python的异常. 一.python常见的异常类型

【腾讯Bugly干货分享】React Native项目实战总结

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 "8小时内拼工作,8小时外拼成长"这是大家共同的理想.除了每天忙于工作外,我们都希望能更多地区吸收领域内的新知识与新技能,从而走向人生巅峰. Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师.每周都会举行嘉宾分享,话题讨论等活动. 上一期我们邀请了腾讯SNG工程师&qu

Git工程开发实践(四)——Git分支管理策略

Git工程开发实践(四)--Git分支管理策略 一.Git版本管理的挑战 Git是非常优秀的版本管理工具,但面对版本管理依然有非常大得挑战.工程开发中,开发者彼此的代码协作必然带来很多问题和挑战:A.如何开始一个Feature开发,而不影响其它Feature?B.由于很容易创建新分支,分支多了如何管理,时间久了,如何知道每个分支是干什么的?C.哪些分支已经合并回了主干?D.如何进行Release的管理?开始一个Release的时候如何冻结Feature, 如何在Prepare Release的时