小前言

这是一个小小的有关react的小例子,希望通过一个小例子,可以让新手更好的了解到react、react-router4.0、redux的集中使用方法。

  1. 这是基于create-react-app来开发的,一种简单的快速创建 React web 项目的方式是使用 Create React App 工具,相当于一个react手脚架,此工具由 Facebook 开发并维护。如果你还没有使用过 create-react-app,你需要先安装。然后就可以通过它创建一个新项目。

  2. React Router4.0 号称一次学习,随处路由。通过声明式编程模型定义组件,是 React 最强大的核心功能。 React Router 可以为您的应用已声明式的方式定义导航组件最强大的核心功能。 无论是 Web App 的浏览器书签 URLs,还是 React Native 的导航功能, 只要是可以使用 React 的地方,就可以使用 React Router

  3. Redux 是一个用来管理JavaScript应用中 data-state(数据状态)和UI-state(UI状态)的工具,对于那些随着时间推移状态管理变得越来越复杂的单页面应用(SPAs)它是比较理想。阮老师redux的教程

下面我们看看完成后的小 demo

开始用create-react-app创建我们的 app

首先 安装好create-react-app,已经安装好了就不用重复安装啦。

npm install -g create-react-app

mac不成功记得用 sudo

安装完毕之后:

create-react-app react-plan
cd react-plan/
npm start

安装会有点慢,耐心等待一下

安装完毕之后,在浏览器地址栏输入localhost:3000,就可以浏览到刚才创建的 app 啦,这个手脚架很简单。如下图

代码开始

创建好应用之后,我们就开始写我们的代码了,在 src文件夹下面创建一个components文件夹,并且在这个文件夹下面创建一个home.js的文件,然后写上我们首页的内容。

首页介绍组件

src/components/home.js

import React, { Component } from 'react'
class Home extends Component {
constructor(props) {
super(props);
}
render () {
return (
<div>
<h2>首页</h2>
<p>这是一个 react 学习的基本操作的小栗子</p>
<p>通过本次学习可以清楚的掌握, react-router、redux的基本使用方法</p>
<br/>
<br/>
<br/>
</div>
)
}
}
export default Home

写好了 home.js 之后我们先引入我们的 app 看看

然后在src/App.js引入我们的 home.js,App.js就变成了

src/App.js

import React, { Component } from 'react';
import logo from './logo.svg';
// 引入 homejs
import Home from './components/home.js'
import './App.css'; class App extends Component {
render() {
return (
<div className="App">
<div className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h2>Welcome to React</h2>
</div>
<p className="App-intro">
To get started, edit <code>src/App.js</code> and save to reload.
</p>
// 使用 home 组件
<Home />
</div>
);
}
}
export default App;

写好之后我们就可以成功的写完了home.js组件啦,是不是很简单,是不是很happy?

一鼓作气,完成所有组件

继续在components文件夹创建一个plan.js(计划表)、detail.js(计划详情)、pupop.js(添加计划)、的js文件和comment.css(组件的样式),我们这时候不涉路由的跳转,只要把所有静态的组件先一鼓作气写好来。

tips:这个例子小,为了方便,我把所有的组件样式文件都写到comment.css里面了,这时候写好的了 css 记得在App.js里面引入

src/App.js增加一句 import './components/comment.css'


src/components/comment.css

.main {
padding: 10px;
flex-direction: row;
display: flex;
}
.NavBox {
width: 250px;
margin-right: 20px;
}
.listNav{
text-align: center;
}
.listNav li {
line-height: 40px;
}
.listNav li a {
text-decoration: none;
}
.listNav li.active{
background: #00a6f7;
}
.listNav li.active a{
color: #fff;
}
.side{
width: 100%;
}
.slist{
font-size: 14px;
}
.addBtn {
font-size: 14px;
font-weight: normal;
background: skyblue;
display: inline-block;
padding: 10px;
margin-left: 10px;
color: #ffffff;
border-radius: 4px;
cursor: pointer;
}
.slist li{
padding: 10px;
display: flex;
flex-direction: row;
justify-content: space-between;
border-bottom: solid 1px cornflowerblue;
} .slist li h3{
font-weight: normal;
} .slist li div span{
text-decoration: underline;
padding: 0 10px;
}
.popup{
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
background: rgba(0, 0, 0, 0.6);
display: flex !important;
justify-content: center;
align-items: center;
}
.popup .pbox {
width: 50%;
height: 320px;
background: #ffffff;
box-sizing: border-box;
padding: 10px;
position: relative;
}
.popup .pbox h4{
font-size: 14px;
}
.popup .pbox input {
margin: 10px 0 20px 0;
}
.popup .pbox input, .popup .pbox textarea{
display: block;
width: 100%;
height: 32px;
border: 1px solid skyblue;
text-indent: 10px;
} .popup .pbox textarea {
resize: none;
height: 100px;
margin: 10px 0;
} .popup .pbox .close {
position: absolute;
width: 30px;
height: 30px;
background: red;
text-align: center;
line-height: 30px;
border-radius: 50%;
color: #ffffff;
right: -15px;
top: -15px;
transition: 0.5s;
cursor: pointer;
}
.popup .pbox .close:hover{
transform: rotate(180deg);
}
.popup .pbox .pBtn {
display: flex;
justify-content: center;
padding-top: 20px;
}
.popup .pbox .pBtn span{
padding: 10px 20px;
background: skyblue;
margin: 0 10px;
font-size: 14px;
color: #ffffff;
border-radius: 4px;
cursor: pointer;
}
.plant{
line-height: 50px;
position: relative;
}
.plant p{
position: absolute;
right: 0;
top: 0;
font-size: 14px;
background: blue;
height: 30px;
line-height: 30px;
padding: 0 10px;
color: #fff;
}
.planlist{
width: 100%;
padding: 10px;
border-collapse: collapse;
}
.planlist td, th{
border: 1px solid blue;
line-height: 32px;
font-size: 14px; }
.plan-delect{
color: red;
cursor: pointer;
}
.plan-delect:hover{
color: blue;
text-decoration: underline;
}
.plan-title{
width: 80%;
}

计划组件

src/components/plan.js

import React, { Component } from 'react'

class Plan extends Component {
constructor(props) {
super(props);
}
render () {
return (
<div>
<div className="plant">
<h3>计划表</h3>
<p>添加计划</p>
</div>
<table className="planlist">
<thead>
<tr>
<th>标题</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td className="plan-title">计划1</td>
<td className="plan-delect">删除</td>
</tr>
</tbody>
</table>
</div>
)
}
} export default Plan;

测试的时候直接把App.js刚才写的import Home from './components/home.js'改成 import Home from './components/plan.js',就可以测试plan 组件啦。是不是很简单?下面的同理。

计划详情组件

src/components/detail.js

import React, { Component } from 'react'

class Detail extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div style={{padding: '20px'}}>
<h3>计划详情</h3>
<p>id: 123</p>
<p>标题: 测试标题</p>
<p>内容: 测试内容</p>
</div> )
}
}
export default Detail

添加计划组件

src/components/popup.js

import React, { Component } from 'react'

class Pupop extends Component{
constructor (props) {
super(props)
this.state = {
id: '',
title: '1',
content: '1'
}
}
render() {
let self = this;
return (
<section className="popup" style={{display: 'block'}}>
<div className="pbox">
<span className="close">X</span>
<div>
<h4>计划标题</h4>
<input value={this.state.title} placeholder="请输入计划标题"/>
</div>
<div>
<h4>计划内容</h4>
<textarea value={this.state.content} placeholder="请输入计划内容" rows="3"></textarea>
</div>
<div className="pBtn">
<span>取消</span>
<span>确认</span>
</div>
</div>
</section>
)
}
}
export default Pupop

呼~~~终于把所有组件都写好了。下面我们就用路由把他们全都串联起来吧。实现点击跳转咯

加入路由

首先记得安装路由 npm install react-router-dom history --save

history这个模块是用来做 js 的跳转,后面我们会介绍到。

安装完成路由模块之后,在src/components/下面我们在增加一个测试二级路由的文件testrouter.js,里面的内容很简单,直接把官网的拿进来。

src/components/testrouter.js

import React, { Component } from 'react'
import {
BrowserRouter as Router,
Route,
Link
} from 'react-router-dom' const Topic = ({ match }) => (
<div>
<h3>{match.params.topicId}</h3>
</div>
) class TestRouter extends Component {
constructor(props) {
super(props);
console.log(this.props)
}
render () {
return (
<div>
<h2>二级路由</h2>
<ul>
<li>
<Link to={`${this.props.match.url}/rendering`}>
使用 React 渲染
</Link>
</li>
<li>
<Link to={`${this.props.match.url}/components`}>
组件
</Link>
</li>
<li>
<Link to={`${this.props.match.url}/props-v-state`}>
属性 v. 状态
</Link>
</li>
</ul> <Route path={`${this.props.match.url}/:topicId`} component={Topic}/>
<Route exact path={this.props.match.url} render={() => (
<h3>请选择一个主题。</h3>
)}/>
</div>
)
}
}
export default TestRouter

然后在App.js做一点改动,引入所有需要的模块,看注释

src/App.js

import React, { Component } from 'react'
import {
BrowserRouter as Router,
Route,
Link
} from 'react-router-dom'
import logo from './logo.svg'
// 引入4个模块组件
import Plan from './components/plan.js'
import Home from './components/home.js'
import Popup from './components/popup.js'
import TestRouter from './components/testrouter.js'
import Detail from './components/detail.js'
// 引入样式文件
import './App.css'
import './components/comment.css'
// 引入路由
import createHistory from 'history/createBrowserHistory'
const history = createHistory()
// 开始代码
class App extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div className="App">
<div className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h2 className='App-title'>Welcome to React Plan</h2>
</div>
<div>
// 路由配置
<Router history = {history}>
<div className="contentBox">
// 编写导航
<ul className="nav">
<li><Link to="/">首页</Link></li>
<li><Link to="/plan">计划表</Link></li>
<li><Link to="/test">二级路由</Link></li>
</ul>
// 路由匹配
<div className="content">
<Route exact path="/" component={Home}/>
<Route path="/plan" component={Plan}/>
<Route path="/test" component={TestRouter}/>
<Route path="/detail/:id" component={Detail}/>
</div>
</div>
</Router>
</div>
<Popup/>
</div>
);
}
} export default App

不是结束的结束:好啦~~~路由也配置好,打开浏览器,在代码正确的情况下,可以愉快的实现跳转咯。之后我们再把 redux 加入进来,这样子就可以,每个组件就可以操作全局的数据了。稍后奉上。react、react-router、redux 也许是最佳小实践2

github地址,觉得有帮助的话,请点击一下 start,嘿嘿

react、react-router、redux 也许是最佳小实践1的更多相关文章

  1. 最新的chart 聊天功能( webpack2 + react + router + redux + scss + nodejs + express + mysql + es6/7)

    请表明转载链接: 我是一个喜欢捣腾的人,没事总喜欢学点新东西,可能现在用不到,但是不保证下一刻用不到. 我一直从事的是依赖angular.js 的web开发,但是我怎么能一直用它呢?看看最近火的一塌糊 ...

  2. React,关于redux的一点小见解

    最近项目做多页面应用使用到了,react + webpack + redux + antd去构建多页面的应用,本地开发用express去模拟服务端程序(个人觉得可以换成dva).所以在这里吐槽一下我自 ...

  3. [React] react+redux+router+webpack+antd环境搭建一版

    好久之前搭建的一个react执行环境,受历史影响是webpack3.10.0和webpack-dev-server2.7.1的环境,新项目准备用webpack4重新弄弄了,旧的记录就合并发布了(在没有 ...

  4. 在React中使用Redux

    这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  5. wn-cli 像React组件开发一样来开发微信小程序

    项目地址:wn-cli wn-cli wn-cli 像React组件开发一样来开发微信小程序 名字由来:wn -> weapp native 取第一个字母 Install npm install ...

  6. Nginx支持 React browser router

    修改nginx配置文件,添加try_file配置如下,即可实现对 React browser router 的支持. location / { root /var/www/mysite; try_fi ...

  7. react组件中的constructor和super小知识

    react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...

  8. react系列(五)在React中使用Redux

    上一篇展示了Redux的基本使用,可以看到Redux非常简单易用,不限于React,也可以在Angular.Vue等框架中使用,只要需要Redux的设计思想的地方,就可以使用它. 这篇主要讲解在Rea ...

  9. React+React Router+React-Transition-Group实现页面左右滑动+滚动位置记忆

    2018年12月17日更新: 修复在qq浏览器下执行pop跳转时页面错位问题 本文的代码已封装为npm包发布:react-slide-animation-router 在React Router中,想 ...

随机推荐

  1. JAVA ArrayList集合底层源码分析

    目录 ArrayList集合 一.ArrayList的注意事项 二. ArrayList 的底层操作机制源码分析(重点,难点.) 1.JDK8.0 2.JDK11.0 ArrayList集合 一.Ar ...

  2. JAVA——转义字符

    目录 1.Java转义字符 2.Java中的注释 2.1Java 中的注释类型 2.2文档注释 3.Java代码规范 4.Java开发注意事项和细节说明 1.Java转义字符 在控制台,输入 tab ...

  3. C#控制打印机打印

    一.引用BarcodeStandard.dll #region BarcodeStandard.dll /* * * 使用说明 需要通过NuGet进行安装BarcodeLib.dll,必不可少 */ ...

  4. 写下载的时候,axios的responseType: "blob"(一定要修改)

    download(data, fileName) {       // window.URL.createObjectURL创建一个地址.       const url = window.URL.c ...

  5. 'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件

    记录在配置环境变量中被 Path 环境坑的一次前提:保证自己电脑中jdk环境配置都没有问题,即JAVA_HOME.Path.CLASSPATH均配置成功. 在这里我就不操作如何配置环境变量了,百度上面 ...

  6. AT2300题解

    两种做法都说一说吧... 题意很明确. 1.数论分块 对于一个 \(d\) 和给定的 \((l,r)\),\((l,r)\) 对其造成贡献的条件很明显是 \(\lfloor \frac {l-1} d ...

  7. 爬虫中网络请求的那些事之urllib库

    目录 爬虫之网络请求中的那些事 urllib库 urlopen函数 urlretrieve函数 urlencode.parse_qs函数 urlparse.urlsplit函数: request.Re ...

  8. C++ 接口的实现方式

    一.接口的定义 有时候,我们得提供一些接口给别人使用.接口的作用,就是提供一个与其他系统交互的方法.其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供 给外部的接口来与你进行通信.根据 ...

  9. 在西电使用校内Linux 开源软件镜像

    西电开源社区(linux.xidian.edu.cn)为全校师生提供开源镜像服务,由于其使用校内服务器,因此产生的流量不会计入校园网 打开镜像列表:https://linux.xidian.edu.c ...

  10. MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解

    判断数据库的类型 当我们通过一些测试,发现存在SQL注入之后,首先要做的就是判断数据库的类型. 常用的数据库有MySQL.Access.SQLServer.Oracle.PostgreSQL.虽然绝大 ...