React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异。在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用了同样的UI,同样的框架,实现方式确实有差异,这其实就是工程化的问题。
回到React中父组件与子组件之间的数据传递的问题上来。
父组件与子组件之间的数据传递的实现方式大致可以分为2种情况:
1、子组件用自己的flux环传递数据,最后调用父组件的onChange事件将数据传给父组件。
2、子组件调用父组件的onChange事件,在父组件中的onChange事件中调用flux环传递数据到付组件的View层
这2种方式各有优点,对比这两种方式,在实时性上,第二种方式是通过调用父组件的onChange事件,数据改变是通过父组件的flux环发生改变的,所以是实时的,而第一种方式的数据是通过子组件自己的flux环改变的,最终传给父组件,所以非实时;而在粒度上,这2种方式是相同的,都是维护了一个局部逻辑。我们一般用子组件来实现一些页面局部的复杂逻辑,如果这个逻辑内部的数据处理也很复杂(要根据各种情况作出不同的判定、改变),那么第一种无疑更为合适,而更为现实的情况是,往往局部的复杂逻辑的实现在子组件内部还有子组件的子组件,这种情况下,优先选择第一种方式;那么相对的如果这个数据处理比较简单,我们完全可以将整个子组件看做页面上的一个输入框(也可以是其他实现某个功能的对话框),那么父组件中的一个输入框调用父付组件的onChange事件来改变数据流,毫无疑问,第二种方式更为合理些。
按照第二种方式,我们经常可以在父组件中看到如下的局部代码:
onChange: function(property, value) {
Action.changePromotionDetail(property, value);
}, render: function() {
return (
<div className="xui-promotion-flashSalePage">
<ProductInfo onChange={this.onChange} />
<PromotionInfo onSubmit={this.onSubmit}
onChange={this.onChange}
promotionName={this.state.promotionName}
advert={this.state.advert}
promotionRangeDate={this.state.promotionRangeDate}
memberGrades={this.state.memberGrades}
memberGrade={this.state.memberGrade}
promotionPrice={this.state.promotionPrice}
numPerPurchase={this.state.numPerPurchase}
period={this.state.period}
numPerPeriod={this.state.numPerPeriod} />
</div>
)
}
如果传入子组件的属性和方法越多,那么代码的可读性其实越差,维护起来也更不方便,甚至在父组件的Store中还需要对数据流做许多处理,类似:
changePromotionDetail: function(action) {
if (...) {
this.data[action.data.property] = ...;
} else {
this.data[action.data.property] = action.data.value;
} this.__emitChange();
}
那么我们又需要思考,如果我们像上面所说的将子组件看做一个输入框,一个输入框应该只需要输入一个值,父组件不应该接受那么多的不同属性的数据,同时父组件需要做的只是将接受到的一个数据通过flux环传递给父组件的View层。那么我们可以采用的一种方法是子组件的数据变更先调用子组件的onChange事件,并在其中做好必要的数据处理,然后将数据添加到一个对象中,以一个数据处理完毕的对象的形式调用父组件的onChange事件:
onChange: function(property, value) {
if (property == '...') {
// do someting here...
} else {
// do someting here...
} var obj = {
// some key/value here
}; this.props.onChange(obj);
}
这样父组件中的代码就可以简化为如下:
onChange: function(obj) {
Action.changePromotionDetail(obj);
}, render: function() {
return (
<div className="xui-promotion-flashSalePage">
<ProductInfo onChange={this.onChange} />
<PromotionInfo onSubmit={this.onSubmit}
onChange={this.onChange}
infoObj={this.state.infoObj} />
</div>
)
}
再回到标准化的思考上,以React为例,React本身只是一个UI,facebook推荐了flux的架构,这就是一种实现方式,那么一个团队在大方向上采用的技术和实现方式其实就确定了下来。如果我们进一步的细分,对诸如父组件和子组件之间的数据传递的方式,数据传递的格式等等作出限制,看上去好像限制了研发编程的自由,同时将研发的工作变成了机械的重复,但是换个角度,这样的限制必然提高了研发效率,每个人碰到不同的场景都有了统一的应对策略;这样的限制也必然降低维护的成本,每个人都能理解他人的编程思路。这就是工程化的一部分。
编程就是为了解决问题,要想解决问题又需要考虑2个问题:
1、工具。
2、方式。
工具是学不完的,尤其现在前端的工具井喷式的发展(虽然侧面说明了前端工具的匮乏~),到这个公司用React,以后跳槽去了另一家又用Angular,后来换了部门,这个部门又用Vue。
那么,作为研发,或许可以思考第二个问题,标准化的方式。每个公司每个部门都会有一套标准,你需要做的是先学会这套标准,同时去思考可以完善的地方,譬如这种场景没有标准化的解决方案,你可以提出一个方案,如果被大家接受了,你的方案就成为了标准的一部分。
这或许也是一条前端之路,一条提高编程效率与维护性的路,一条解决工程化部分问题的路。
React中父组件与子组件之间的数据传递和标准化的思考的更多相关文章
- vue中父级与子组件生命周期的先后顺序
1.vue的生命周期 2.views/createrCustormer.vue为父级 <template> <expressService /> </ ...
- 关于css中父元素与子元素之间margin-top的问题
之前在使用经常遇到下面的问题: html: <div class="top"> <div class="one">I'm the fir ...
- C#中父窗口和子窗口之间实现控件互操作
很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...
- 九、React中的组件、父子组件、React props父组件给子组件传值、子组件给父组件传值、父组件中通过refs获取子组件属性和方法
一.概述 React中的组件: 解决html 标签构建应用的不足. 使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入. [父子组件]:组件的相互调用中,我们把调用者称为父 ...
- react父组件调用子组件方法
把子组件的参数回传到父组件中,并且赋值给子组件的一个实例方法. 参考React中文网: http://www.css88.com/react/docs/refs-and-the-dom.html im ...
- react 父组件向子组件传递函数
这段时间一直在使用react,由于这react是单向数据绑定,总感觉有点不适用,毕竟之前一直都在使用angular,但学习还是要继续,做了一个迭代的项目,都差点忘记要总结一下这个react了,现在可以 ...
- React Hook父组件获取子组件的数据/函数
我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用.文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hoo ...
- react学习-react父组件给子组件传值与设置传值类型以及是否必传参数
react 父组件给子组件传参时,父组件直接在引入的子组件内写入要传递的参数即可 <HeaderComponent title={"传递的参数"}></Heade ...
- VUe.js 父组件向子组件中传值及方法
父组件向子组件中传值 1. Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以 ...
随机推荐
- Redis系列四(keepalived+lvs搭建负载均衡)
1.安装Keepalived(主备服务器都要安装) 10.8.80.218 主服务器 10.8.80.217 备服务器 10.8.80.200 虚拟IP $ wget http://www.ke ...
- Oracle BEQ方式连接配置
Oracle BEQ方式连接配置 服务端和客户端在同一台机器上,可以使用BEQ连接,BEQ连接可以理解为进程间直接通信,不需要走网络监听,性能更高. 可以参考MOS:How To Connect Us ...
- Codeforces Round #257 (Div. 1)A~C(DIV.2-C~E)题解
今天老师(orz sansirowaltz)让我们做了很久之前的一场Codeforces Round #257 (Div. 1),这里给出A~C的题解,对应DIV2的C~E. A.Jzzhu and ...
- Callback Promise Generator Async-Await 和异常处理的演进
根据笔者的项目经验,本文讲解了从函数回调,到 es7 规范的异常处理方式.异常处理的优雅性随着规范的进步越来越高,不要害怕使用 try catch,不能回避异常处理. 我们需要一个健全的架构捕获所有同 ...
- redis安装-单机版
环境准备 因为redis使用c语言开发的,如果要运行在linux上,需要gcc-c++的环境.那么我们就要先看一下是否安装了gcc-c++如果没有的话,需要在虚拟机上安装gcc-c++环境(友情提示, ...
- chrome浏览器360浏览器图片无法加载提示等待可用套接字问题
前端时间遇到chrome,360浏览器无法加载图片问题,提示等待可用的套接字 后来发现原因,原来是使用html5<video>标签时使用了默认的配置,默认情况下<video>标 ...
- C语言 一维数组叠加为二维数组样例
这里参看memcpy的用法,将一个一维整型数组不停的叠加为二维数组 使用宏定义来控制二维数组的行列 代码如下: #include <stdio.h> #include <stdlib ...
- 【前端】:JavaScript
前言: 开始学JavaScript,Dom,jQuery了,知识好杂,本身记忆力就不行的~~这篇博客简单介绍下JavaScript. 下篇博客写关于Dom的. JavaScript是一门编程语言(之前 ...
- ssh免密码和ssh-copy-id命令
Linux系统配置免密码的方式: 1:ssh-keygen -t rsa 生成密钥 2:ssh-copy-id -i ~/.ssh/id_rsa.pub 127.0.0.1 把本机的公钥追到jifen ...
- javascript小测试
测试地址:http://toys.usvsth3m.com/javascript-under-pressure/ 在群里看到测试网站做着玩,希望你能过关,不能,且看下面答案(为了过关,不惜不够严谨) ...