使用React改版网站后的一些感想
文章转载:http://www.jianshu.com/p/8f74cfb146f7
网站是毕业设计的作品,开发这个网站的目的主要用于记录一些笔记,以及聚合一些资讯信息,也算自己在网络世界中的一块静地吧,可以在这里一些技术上想法的实践。
网站最初前端使用vue
开发,在前段时间由于项目的开发进度已经不是那么紧急,有了一些空闲时间。而对没有使用过React
又一直耿耿于怀,索性就使用React
进行了一次前端的重构。
学习一门新的技术最基本的当然就是阅读相关文档了,作为一个单页面应用前端路由当然是不可能少了,而使用React
如果不使用Reduce
那又感觉发挥不其作用(虽然他们其实也没什么必须的关系)。所以在这里使用了react
,react-router
,react-redux
,以下为在使用React
开发中的一些见闻,有幸被你看到该文,如有不对之处,还望指出,如果你不小心被带入坑,本人概不负责。
首先就是阅读React
的文档了,文档使用大量举例的形式介绍如何使用React
进行开发,如如何设计state
,props
,如何组件间通信,如何设计组件等。文档虽然进行了详细的介绍,但是往往还是需要真正的实践才能发现其中的妙处。如state
,props
的设计,在一个X
组件中拥有Y
,Z
两个组件,假设Y
组件拥有一个输入框,而Z
组件可能需要用到Y
组件输入的值做出一定的变化,当然如果把他们写到一起也不是不可以的,但是考虑到组件复用,功能单一等因素还是拆开比较合理,那么这个值到底应该哪个组件来储存呢?如下两个组件分别为Y
,X
,这样设计明显是不符合state
设计的,拥有太多冗余部分。
class InputComponent extends Component {
constructor () {
super()
this.state = {
value: ''
}
}
valInput (e) {
let value = e.target.value
this.setState({value})
this.props.inputChange(value)
}
render () {
return <input onChange={this.valInput.bind(this)}/>
}
}
class ParentComponent extends Component {
constructor () {
super()
this.state = {
val: ''
}
}
inputChange (val) {
this.setState({val})
}
render () {
return (
<section>
{this.state.val}
<InputComponent inputChange={this.inputChange.bind(this)}/>
</section>
)
}
}
如果使用如下的写法或许看起来更好
class InputComponent extends Component {
render () {
let {val, inputChange} = this.props
// 这里的val并不是必须的,但是当一个值来自非输入控件的时候,如可编辑的div,ace在每次执行render函数的时候都会导致原来输入的值被清空。
return <input value={val} onChange={inputChange}/>
}
}
class ParentComponent extends Component {
constructor () {
super()
this.state = {
val: ''
}
}
inputChange (e) {
this.setState({val: e.target.value})
}
render () {
let val = this.state.val
return (
<section>
{val}
<InputComponent val={val} inputChange={this.inputChange.bind(this)}/>
</section>
)
}
}
react-router
提供了前端路由基本的需求,根据需要使用到的功能在项目文档介绍中即可找到具体使用方法。基本的配置和其他框架也是大同小异,但是很多API的使用确有些大相径庭(和vue
相比),还是需要仔细通读文档的,以免在开发中出现问题再去解决浪费时间,如IndexRoute
在vue
中可以在子路由通过''
这样的空字符来作为默认UI
。
function root () {
this.path = '/'
this.component = require('pages/index').default
}
function demo () {
this.path = 'demo'
this.getComponent = (nextstate, cb) => {
require.ensure([], (require) => {
cb(null, require('pages/demo').default)
})
}
}
const createRoute = (R) => {
let route = new R()
route.childRoutes = route.childRoutes && route.childRoutes.map(r => createRoute(r))
return route
} export default [root, demo].map((route) => createRoute(route))
react-redux
在从表象理解Redux中进行了简单介绍。Redux
的使用减少了开发中思考的时间,同时也避免了一些可能的问题。在使用过程中也发现一些问题,使用Redux
必然导致大量的dispatch
出现在组件中,如何防止业务变得复杂和庞大后导致项目变得难以维护,也是值得思考的。在被改版的网站中使用页面+组件的方式开发,一个页面表示除了跟组件外的最高级组件,可拥有多个组件,只有页面才能向reducer
发起action
,所有多个组件共用的数据则通过在页面中传递到子组件的props
,子组件如果需要更新数据,则通过props
属性调用父组件传入的方法向上传递命令,在页面中使用dispath
来指定action
来调用reducer
进行数据更新,当然有时候也需要在action
中进行处理后在dispath
action
到reducer
(比如网络请求)。值得注意的是每次dispath
一个action
,Redux
都会遍历所有已经注册的reducer
(reducer往往由多个子reducer组成),也就是说所有reducer
都会被调用(从项目中的表现和文档来看是这样的),一下是被改版网站使用的reducer
部分代码。
export default class ArticleReducer {
[AAS.ARTICLE_REQUEST_STATE] (state, action) {
return Object.assign({}, state, {loading: action.loading})
}
[AAS.ARTICLE_SEARCH_STATE] (state, action) {
return Object.assign({}, state, {searching: action.searching})
}
}
const reducers = {}
const AR = new ArticleReducer()
const NR = new NewsReducer()
reducers.articles = (state = initState.article, action) => {
return AR[action.type] ? AR[action.type](state, action) : state
}
reducers.editor = (state = initState.editor, action) => {
return ER[action.type] ? ER[action.type](state, action) : state
}
就使用React
后的感觉,由于第一次真正使用Redux
这样的状态管理工具来进行进行开发(虽然也有使用vuex,但是都不是基于整个项目的),开发流程变得更加可控,数据流向变得清晰,而在开发中各个工具耦合性也变得更低,总的来说这是一次不错的尝试。不过个人觉得不管使用什么技术,复杂程度随着业务的增加必定变得更高,而要维持一个项目的稳定,健壮,易于维护将变得更加困难。
最后不得不感叹,良好编程习惯的重要性。
使用React改版网站后的一些感想的更多相关文章
- 使用React改版网站
网站是毕业设计的作品,开发这个网站的目的主要用于记录一些笔记,以及聚合一些资讯信息,也算自己在网络世界中的一块静地吧,可以在这里一些技术上想法的实践. 网站最初前端使用vue开发,在前段时间由于项目的 ...
- 我在开发网站后得出的asp.Net网站优化总结
原文:我在开发网站后得出的asp.Net网站优化总结 asp.Net网站优化总结: 1.数据库优化: 首先是对查询语句的优化,开发时为了图快可以不考虑,但是后期维护时就必须要优化(比如:你调用代码生成 ...
- iis6手工创建网站后无法运行php脚本
给人搬了十几个网站,老站用西部数码建站助手创建的,现在过期了无法继续创建,只能在Internet 信息服务(IIS)管理器创建网站,创建下来都没问题,但是就是无法打开网站. 测试打开txt文档.静态页 ...
- 上传网站后建议执行:chown www:www -R /path/to/dir 对网站目录进行权限设置,/path/to/dir替换为你网站目录。
上传网站后建议执行:chown www:www -R /path/to/dir 对网站目录进行权限设置,/path/to/dir替换为你网站目录.
- React官方网站学习
React官方网站 英文版 https://reactjs.org/tutorial/tutorial.html React官方网站 中文版 https://react.docschina.org ...
- 初学React,setState后获取到的thisstate没变,还是初始state?
问题:(javascript)初学React,setState后获取到的thisstate没变,还是初始state?描述: getInitialState(){ return {data:[]}; } ...
- IIS部署ASP.NET网站后提示只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态...
今天,在IIS上部署网站后,出现了下面错误: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态.还请确保在应用程序配置的 <sy ...
- 【ASP.NET 问题】IIS发布网站后出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误"的解决办法
新装IIS,然后发布网站,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 于是 ...
- IIS发布网站后局域网其他用户不能访问问题(转)
如果本机能正常访问,而局域网其他用户不能访问,那么判断的结果很可能是防火墙问题. 解决方法: 既然问题出在Windows7或Windows Server 2008 R2的防火墙上,那么我们可以有以下两 ...
随机推荐
- 光场相机重聚焦之二——Lytro Illum记录光场
上一节中大概讲述了光场相机和光场的参数化表示,这一节就说一下光场相机内部是如何记录光场以及实现重聚焦的. 博主用的是Lytro Illum,所以就以Illum为例来说了,Illum的功能还是挺多的,上 ...
- Java 工具类—日期获得,随机数,系统命令,数据类型转换
package tems; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; ...
- Java泛型知识点:泛型类、泛型接口和泛型方法
有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类. 泛型类 容器类应该算得上最具重用性的类库之一.先来看一个没有泛型的情况下的容器类如何定义: public class Cont ...
- IT行业能力细分
在软件行业工作7年了,平时很懒,懒得做分享,今天特意分享一下软件行业,职业大的技术分类,同学们可根据自己职业规划补充学习知识块.
- __read_mostly变量含义
1. 定义 __read_mostly原语将定义的变量为存放在.data.read_mostly段中,原型在include/asm/cache.h 中定义: #define __read_mos ...
- lighttpd启动问题
/home/yuna/web/app/lighttpd/sbin/lighttpd -f /home/yuna/web/app/lighttpd/lighttpd.conf -m /home/yuna ...
- Vue2.x中的父组件数据传递至子组件
父组件结构 template <template> <div> <v-girl-group :girls="aGirls"></v-gir ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- poj2653线段相交判断
Stan has n sticks of various length. He throws them one at a time on the floor in a random way. Afte ...
- 最长递增子序列hdu1087
#include<map> #include<set> #include<list> #include<cmath> #include<queue ...