使用React改版网站后的一些感想

文章转载:http://www.jianshu.com/p/8f74cfb146f7

网站是毕业设计的作品,开发这个网站的目的主要用于记录一些笔记,以及聚合一些资讯信息,也算自己在网络世界中的一块静地吧,可以在这里一些技术上想法的实践。

网站最初前端使用vue开发,在前段时间由于项目的开发进度已经不是那么紧急,有了一些空闲时间。而对没有使用过React又一直耿耿于怀,索性就使用React进行了一次前端的重构。

学习一门新的技术最基本的当然就是阅读相关文档了,作为一个单页面应用前端路由当然是不可能少了,而使用React如果不使用Reduce那又感觉发挥不其作用(虽然他们其实也没什么必须的关系)。所以在这里使用了reactreact-routerreact-redux,以下为在使用React开发中的一些见闻,有幸被你看到该文,如有不对之处,还望指出,如果你不小心被带入坑,本人概不负责。

首先就是阅读React的文档了,文档使用大量举例的形式介绍如何使用React进行开发,如如何设计stateprops,如何组件间通信,如何设计组件等。文档虽然进行了详细的介绍,但是往往还是需要真正的实践才能发现其中的妙处。如stateprops的设计,在一个X组件中拥有YZ两个组件,假设Y组件拥有一个输入框,而Z组件可能需要用到Y组件输入的值做出一定的变化,当然如果把他们写到一起也不是不可以的,但是考虑到组件复用,功能单一等因素还是拆开比较合理,那么这个值到底应该哪个组件来储存呢?如下两个组件分别为YX,这样设计明显是不符合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相比),还是需要仔细通读文档的,以免在开发中出现问题再去解决浪费时间,如IndexRoutevue中可以在子路由通过‘‘这样的空字符来作为默认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中进行处理后在dispathactionreducer(比如网络请求)。值得注意的是每次dispath一个actionRedux都会遍历所有已经注册的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,但是都不是基于整个项目的),开发流程变得更加可控,数据流向变得清晰,而在开发中各个工具耦合性也变得更低,总的来说这是一次不错的尝试。不过个人觉得不管使用什么技术,复杂程度随着业务的增加必定变得更高,而要维持一个项目的稳定,健壮,易于维护将变得更加困难。

最后不得不感叹,良好编程习惯的重要性。

时间: 2024-10-12 17:59:52

使用React改版网站后的一些感想的相关文章

wdcp后台创建网站后,总是显示403界面

后台创建站点后后,域名已解析,但无法打开默认页面,创建网站后会有一个默认的index.html 存在于public_html下面的,我用FTP 查看是有的,但用域名却无法访问,总是显示403界面 经查看,发现端口管理下面的 80端口显示的是nginx.conf ,然后我将系统设置里面的web引擎修改为nginx后 可以了,不知道 这是不是bug.默认的环境是nginx+apache的 wdcp后台创建网站后,总是显示403界面,布布扣,bubuko.com

iis6手工创建网站后无法运行php脚本

给人搬了十几个网站,老站用西部数码建站助手创建的,现在过期了无法继续创建,只能在Internet 信息服务(IIS)管理器创建网站,创建下来都没问题,但是就是无法打开网站. 测试打开txt文档.静态页面都能打开,一到打开php文件就直接就挂了,无法打开,什么报错都没有. 之前有用iis6以外的服务器创建过网站,都是直接创建就可以运行. 没报错不好找问题,百度用别人的方法操作也不行.实在没办法,只能对着之前用建站助手创建的网站配置,放下架子,一个个看过去,结果发现用建站助手创建的网站ISAPI拓展

IIS部署网站后, 无法正常访问网站问题

IIS部署网站后, 无法正常访问网站问题,并且提示503错误,而且对应的应用程序池自动停止 在系统日志中可以跟踪到错误信息 "应用程序池"Lee_Integration_web"将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误." "Windows Process Activation Service 未能为应用程序池"Lee_Integration_web"创建工作进程.数据字段包含错误号." 错误代码:80

基于Cent OS7搭建apache网站后的访问控制配置详解

在一台centos7上搭建apache网站后,一般都是允许所有人访问的,那么可能会有一些特殊情况,需要对访问网站的人进行限制,出于这种情况,apache可以通过Require配置项,来对客户端进行一些访问限制,可以基于IP地址.网段.主机名或域名.使用名称"all"时表示任意地址. 安装apache服务的参考博文:https://blog.51cto.com/14154700/2391114 1.客户机地址限制: 限制策略的常用格式有下面几种: Require all granted:

降权网站后该如何快速恢复?

本文是我最近接触的一件真实案例,我按照我们处理案例的方法将整个过程记录下来和大家分享.文章大概分为3个部分:1,判断是否真的降权 2,排查降权原因 3,制定权重恢复计划并有步骤的执行,等待权重恢复. 判断是否降权: 网站被百度降权是一件很让人困扰的事情,尤其是对于一些以往排名较好的网站,降权的打击几乎是毁灭性的,于是乎各位站长几乎都是谈降权为之色变,其实降权并不是那么容易出现,百度对于网站的容忍度相比之前也越来越高,除非网站有很明显的失误,一般不会出现降权,有时候站长们看到一点点波动就以为被降权

WIN7安装COGNOS8后配置IIS网站后,访问COGNOS站点网页一直显示空白,解决方法(转载)

今天我机器上(WIN7)安装了COGNOS8后,发现IIS里发布的网站访问出现了空白,再翻阅众多的帖子网友的回答中看到一丝希望,便照着做,果不然真的能成功. 方法如下: 进入:控制面板 - 卸载程序 - 打开或关闭Windows功能 如果访问任何不存在页面或页面出错时空白: Internet 信息服务 - 万维网服务 - 常见 HTTP 功能 - HTTP 错误 打勾 如果访问任何存在的页面时出现空白: Internet 信息服务 - 万维网服务 - 静态内容 打勾 然后单击“确定”即可.

WIN2008中部署网站后样式及JS加载不了

今天在一台刚刚装好的WIN2008上部署一个问题,一切按流程来:① 控制面板加IIS,把.NET 3.5打勾② 装.NET 4.0框架③ 装MSSQL2012④ IIS中部署网站⑤ 修改web.config中的数据库连接字符串⑥ 网站目录加Everyone权限 弄好后直接输入IP浏览网站,发现网站可以运行,但是一切样式及JS都加载不了,网上都搜索不到相应的解决方案,最后自己东搞西搞才弄好,原来是在第一步添加IIS的时候,除了勾上那个.NET 3.5,还得再勾上那个"静态内容",这样才能

笔记4:IIS6发布网站后“对XX路径的访问被拒绝”

最近用MVC4开发网页应用,发布到服务器后无法访问,提示对路径XXX的访问被拒绝. 异常详细信息:System.UnauthorizedAccessException: 对路径“H:\My Website\CYEMS\Plugins\CY.Plugins.Core.BaseCode\Views\Web.config”的访问被拒绝. 因为网站启动的时候我复制了文件到该目录. 最后在网上找到了解决办法: 步骤一:在服务器上打开IIS管理器,找到网站对应的应用程序池 步骤二:打开高级设置后,找到“标识

【ASP.NET 问题】IIS发布网站后出现 &quot;处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误&quot;的解决办法

新装IIS,然后发布网站,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 于是去网上找资料,轻松搞定.o(∩_∩)o 哈哈 原因: vs2010默认的是4.0框架,4.0的框架是独立的CLR,和2.0的不同,如果想运行4.0的网站,需要用aspnet_regiis注册4.0框架,然后用4.0的Class池,就可以运行4.0的web项目了. aspnet_regiis注册4.0