什么是React?
当今的前端正处于技术爆发期,这个阶段涌现很多优秀的编程思想以及框架,本文所介绍的react就是
前端的一种框架,它使用单向数据绑定以及jsx语法糖,通过它提供的特性,可以构建去区别于以前传统
型的网页。
什么是Redux?
单页模式区别于传统模式开发,比如用户的登录状态、数据列表的缓存,传统类型的MVC设计模式中,后端语言(Java、PHP……)中,浏览器发起url请求,后端根据请求的路径和参数,后端对数据进行处理(从数据库中拿出数据、请求第三方接口等……),然后进行页面数据填充后返回完整的HTML数据,浏览器拿到这些html元素后进行页面渲染。
单页应用模式的区别在于请求进行接口化,开发过Android或者iOS的应该知道,客户端处理数据状态,操作UI控件,与后端进行网络通信获取数据通信。单页应用的开发就是基于这种模式,那么处理数据状态的任务就落到前端的头上来了,react提供视图渲染的优化,但是数据的状态管理就成了一个问题,比如用户的数据,交由那个组件去控制,怎么进行交互,这就成了一个问题。Facebook提出了Flux设计模型来解决这个问题,用store来存放数据源,通过action、reducer来操作数据,来保证数据的单一性。
但是Facebook只是提出了这一种设计思想,没有开发相应的框架,于是就诞生了很多第三方实现,Redux就是其中一种,它不是完全采用Flux规范模式,它提出了自己的设计思想,Redux也就成了和React搭配的优秀的状态工具。
项目生成
代码生成工具使用Yeoman,Yeoman是一个代码generators工具,它提供很多第三方generators,通过它,我们可以很方便的构建一个初始化项目,点击访问Yeoman
项目使用react+redux构建,所以这里选择generator-redux-stack
来作为生成模板。终端下使用如下命令:
1 | 安装yeoman |
执行完成后会看到下图
填写相应的项目描述信息,Yeoman会自动创建文件,并且安装依赖
如果网络较慢可以Ctrl+C
停止安装,使用cnpm国内镜像安装(#滑稽)。
稍等一会出现如下界面就说明完成了
在终端输入
1 | npm start |
浏览器端打开http://localhost:3000
可以看到生成器提供的模板
好了,接下来就可以开始编码了。:)
目录介绍
目录结构由
redux-stack
控制
目录名 | 描述 |
---|---|
build | 项目主html文件存放位置 |
dist | 项目编译目录位置 |
node_modules | npm包存放位置 |
server | 项目运行时服务器环境 |
src | 项目源码目录,代码主要存放位置 |
—-actions | redux action存放目录 |
—-components | react组件存放目录 |
—-config | react-router主要配置文件 |
—-container | react页面(组件拼贴)存放位置 |
—-reducers | redux reducer存放位置 |
—-store | redux store定义存放位置 |
—-style | 样式文件存放位置 |
—-utils | 开发调试工具配置 |
test | 测试脚本存放目录 |
编写代码
编写jsx页面
在container
目录新创建一个Home.js
文件
1 | // src/containers/Home.js |
这里创建了一个组件,组件渲染了一个div
标签,里面是一行文字。render
使用了jsx的语法糖。
编写路由
修改config
目录下面的routes.js
文件,需要引入Home组件,并且将其挂载到根节点。
1 | // src/config/routes.js |
刷新路由器可以看到页面的更改
编写action
在src/actioins
目录下面创建one.js
文件,这里面将会定义数据操作类型与一些actions方法。
1 | // actions/one.js |
这里我们需要安装fetch
来进行异步网络请求,当然你也可以使用其他网络请求工具。通过以下命令安装fetch
1 | npm install whatwg-fetch --save |
接口使用WeexOne项目里面的接口
编写reducer
redux-stack
这个生成器自动帮我们做好了reducer到store的绑定,所以我们只需要将注意力放在reducer中就可以了。
在src/reducers
目录下新建one.js
文件,这里我们将放置一些常用的数据操作。
1 | // reducers/one.js |
并在reducers/index.js
文件中注册store
1 | // reducersindex.js |
绑定store和actions到组件
这里我们需要修改开始创建的Home.js
组件。
1 | import React, { Component } from 'react'; |
这里注入的state与actions都可以通过this.props
访问到。这时打开浏览器可以看到我们在one action
中的getone
方法打印出的异步请求数据
将异步数据写入到state
修改actions
当中的one.js
,在拿到数据后dispatch到reducer处理
1 | // actions/one.js |
由于fetch
库提供Promise
的支持,所以可以使用then结构。
在redux开发工具中我们可以看到如下显示
在末尾处可以看到state
中的one已经有数据了,接下来我们将数据绑定到界面组件。
绑定store中的state数据到react组件
回到还是创建的Home.js
组件中,我们将需要的数据绑定到界面中
1 | ...... |
这是浏览器里面的页面已经有数据了
经过一些简单的css样式调整得到的效果如下
结语
这篇文章讲述了react搭配redux的基础用法,关于react-router
的部分本文没有详细讲解,但是react-router的难度也不大,上手也很快。如果需要使用webpack ensure
按需加载,需要将组建导出格式换成CommonJS
规范导出
1 | module.exports = React.createClass({ |
详细可以参考react-router示例程序