react做h5 例子_使用React写一个网站的心得体会

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

网站最初前端使用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.valuethis.setState({value})this.props.inputChange(value)

}

render () {return }

}

class ParentComponent extends Component {

constructor () {

super()this.state = {

val: ''}

}

inputChange (val) {this.setState({val})

}

render () {return ( {this.state.val}

)

}

}

如果使用如下的写法或许看起来更好

class InputComponent extends Component {

render () {

let {val, inputChange} = this.props// 这里的val并不是必须的,但是当一个值来自非输入控件的时候,如可编辑的div,ace在每次执行render函数的时候都会导致原来输入的值被清空。return }

}

class ParentComponent extends Component {

constructor () {

super()this.state = {

val: ''}

}

inputChange (e) {this.setState({val: e.target.value})

}

render () {

let val = this.state.valreturn ( {val}

)

}

}

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中进行处理后在dispathaction到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,但是都不是基于整个项目的),开发流程变得更加可控,数据流向变得清晰,而在开发中各个工具耦合性也变得更低,总的来说这是一次不错的尝试。不过个人觉得不管使用什么技术,复杂程度随着业务的增加必定变得更高,而要维持一个项目的稳定,健壮,易于维护将变得更加困难。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux命令小常识

作为一个tester我们必须要会linux,也许你会说不用也可以。那么我想问,你部署测试环境在哪里,你下载war包并部署war包呢,你看日志在哪里? 基于测试需要用到liunx,我这里只针对需要用到的,工作就是不断在探索中学习&…

ubuntu联网不稳定,时断时连问题的解决办法

概览 ubuntu联网不稳定,时断时连问题的解决办法现象网络一会儿连上,过一会又自动断开,再等一会儿又断了。问题原因可能是受ipv6的影响解决办法关闭掉ipv6 详细步骤 1、编辑连接,打开“ipv6 settings”,将method设置…

如何根据原理图画封装_常用原理图封装

原理图常用库文件:Miscellaneous Devices.ddbDallas Microprocessor.ddbIntel Databooks.ddbProtel DOS Schematic Libraries.ddbPCB元件常用库:Advpcb.ddbGeneral IC.ddbMiscellaneous.ddb分立元件库部分 分立元件库元件名称及中英对照AND 与门ANTENNA …

搭建GitLab+Jenkins持续集成环境图文教程

GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自动化构建、测试或部署任务。所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率自动运行测试、构建和部署的任务,…

随笔-1031

随笔1030 学习第四天 样式表的样式 一、大小宽度width高度height 二、背景1.background-color 背景色2.background-image 背景图片3.background-repeat:no-repeat 背景图的平铺方式4.background-position 背景图的位置 center等5.background-attachment 背景图是否滚…

exception日志 php_PHP 错误与异常的日志记录

提到 Nginx PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志、error 日志以及 PHP 的 error 日志。虽然看起来是个很简单的问题,但里面其实又牵扯到应用配置以及日志记录位置的问题,如果是在 ubuntu 等系统下使用 apt-get 的方…

threejs-经纬度转换成xyz坐标的方法

用threejs做3D应用时,很经常会接触到球状物体,比如说地球,要定义球上的一点,用经纬度是常用的办法。现在,我们要在北京这个地方标一个点,北京的坐标为——北纬39.9”,东经116. 3”,该…

两个tplink路由器有线桥接_TP-Link路由器如何设置有线方式桥接(两个或多个路由器串联上网)图文教程...

第一页:TP-Link路由器有线方式桥接设置图文教程第二页:TP-Link路由器有线方式桥接设置图文教程本文介绍了TP-Link路由器有线桥接的设置方法,路由器有线桥接其实严格上应该叫做:两个(多个)路由器串联上网。主要适用于这样的网络环境…

双内核问题

<meta http-equiv"Content-Type" content"text/html; charsetutf-8"><!--优先使用 IE 最新版本和 Chrome--><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"><!--360浏览器QQ,搜狗等双内核浏览器&am…

dashboard windows 前端开发环境搭建

dashboard是kubernetes的云管平台UI界面&#xff0c;正常情况下&#xff0c;其是在linux下开发的&#xff0c;但是&#xff0c;有些特殊情况下&#xff0c;我们也可能希望在windows上搭建起dashboard的开发环境 这里我们将搭建的开发环境的结构如下&#xff1a; windows上只运…

a pycharm 标记多个_每周分享五个 PyCharm 使用技巧(二)

这是 「PyCharm 技巧分享」系列的第二篇分享。由于上一篇文章得到了大家的一些赞同&#xff0c;所以今天又来给大家推荐一些我平时自己有用的小技巧&#xff0c;大家择需所取即可。先声明下&#xff0c;并不保证对所有的人都是有帮助的&#xff0c;所以请大神嘴下留情&#xff…

Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法...

Visual Studio2012打开时弹出“遇到异常&#xff1a;这可能是由某个扩展导致的”错误的解决办法&#xff1a; 具体问题如下&#xff1a; 分析原因&#xff1a;网上搜集了以下&#xff0c;出现异常的原因是安装了第三方控件&#xff0c;然后删除是没有删除干净&#xff0c;导致日…

python url拼接_详解Python urlencode编码和url拼接方法

urlencode 调用方法urlencode的参数必须是Dictionaryimport urllibd {name1:www.pythontab.com,name2:bbs.pythontab.com}print urllib.urlencode(d)输出&#xff1a;name2bbs.pythontab.com&name1www.pythontab.com相当于拼接两个url参数&#xff0c;这个用法类似于PHP中…

跨域问题及CORS机制

跨域 跨域是指一个资源请求与其不在同一个域&#xff08;源&#xff09;的资源&#xff0c;不在同一个域&#xff08;源&#xff09;是指两个域的协议、域名或端口不同。 同源策略 出于安全考虑&#xff0c;浏览器制定了同源策略&#xff0c; 限制了某些跨域请求。同源策略是…

【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

模拟题&#xff0c;可以用树链剖分线段树维护。 但是学了一个厉害的。。树状数组的区间修改与区间查询。。 分割线里面的是转载的&#xff1a; -------------------------------------------------------------------------------- [ 3 ] 上面都不是重点……重点是树状数组的区…

oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...

一、Oracle数据库系统简介&#xff1a;ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间…

threejs- z-fighting 问题

Z-Buffer 在threejs中&#xff0c;使用深度缓冲&#xff08;Z-Buffer&#xff09;来完成场景可见性计算&#xff0c;即确定场景哪部分可见&#xff0c;哪部分不可见。深度缓冲&#xff08;Z-Buffer&#xff09;是一个二维数组&#xff0c;其中的每一个元素对应屏幕上的一个像素…

python2中文字符串遍历乱码_完美解决Python2操作中文名文件乱码的问题

Python2默认是不支持中文的&#xff0c;一般我们在程序的开头加上#-*-coding:utf-8-*-来解决这个问题&#xff0c;但是在我用open()方法打开文件时&#xff0c;中文名字却显示成了乱码。我先给大家说说Python中的编码问题&#xff0c;Python中的字符串的大概分为为str和Unicode…

bower overrides 配置

bower 是一个常用的包管理工具&#xff0c;用起来和npm很相似&#xff0c;但是两者又有一些区别&#xff0c;可以参考 —— What is the difference between Bower and npm。这里不说bower本身&#xff0c;而想说一下bower的overrides配置。 何谓override override 本身是覆盖…

装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法

这种情况一般是你以前安装过MySQL数据库服务项被占用了。解决方法&#xff1a;方法一&#xff1a;安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字改了就可以了。可以把默认的服务器的名称手动改为你没用过的其他名称。方法二&#xff1a;1、卸载MySQL …