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中父组件与子组件之间的数据传递和标准化的思考的更多相关文章

  1. vue中父级与子组件生命周期的先后顺序

    1.vue的生命周期 2.views/createrCustormer.vue为父级     <template>     <expressService />   </ ...

  2. 关于css中父元素与子元素之间margin-top的问题

    之前在使用经常遇到下面的问题: html: <div class="top"> <div class="one">I'm the fir ...

  3. C#中父窗口和子窗口之间实现控件互操作

    很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...

  4. 九、React中的组件、父子组件、React props父组件给子组件传值、子组件给父组件传值、父组件中通过refs获取子组件属性和方法

    一.概述 React中的组件: 解决html 标签构建应用的不足. 使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入. [父子组件]:组件的相互调用中,我们把调用者称为父 ...

  5. react父组件调用子组件方法

    把子组件的参数回传到父组件中,并且赋值给子组件的一个实例方法. 参考React中文网: http://www.css88.com/react/docs/refs-and-the-dom.html im ...

  6. react 父组件向子组件传递函数

    这段时间一直在使用react,由于这react是单向数据绑定,总感觉有点不适用,毕竟之前一直都在使用angular,但学习还是要继续,做了一个迭代的项目,都差点忘记要总结一下这个react了,现在可以 ...

  7. React Hook父组件获取子组件的数据/函数

    我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用.文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hoo ...

  8. react学习-react父组件给子组件传值与设置传值类型以及是否必传参数

    react 父组件给子组件传参时,父组件直接在引入的子组件内写入要传递的参数即可 <HeaderComponent title={"传递的参数"}></Heade ...

  9. VUe.js 父组件向子组件中传值及方法

    父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以 ...

随机推荐

  1. Codeforces374A

    A. Inna and Pink Pony time limit per test1 second memory limit per test 256 megabytes input standard ...

  2. .Net程序员学用Oracle系列(11):系统函数(下)

    1.聚合函数 1.1.COUNT 函数 1.2.SUM 函数 1.3.MAX 函数 1.4.MIN 函数 1.5.AVG 函数 2.ROWNUM 函数 2.1.ROWNUM 函数简介 2.2.利用 R ...

  3. Java如何判断字符串中包含有全角,半角符号

    首先介绍下全角跟半角之间的区别: 在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角" ...

  4. ASP.NET Core MVC 中设置全局异常处理方式

    在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...

  5. 从并发处理谈PHP进程间通信(一)外部介质

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  6. ios 学习动画的套路 (一)

    你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟~不知道从哪里下手去写!会连续的 ...

  7. Python抓取第一网贷中国网贷理财每日收益率指数

    链接:http://www.p2p001.com/licai/index/id/147.html 所需获取数据链接类似于:http://www.p2p001.com/licai/shownews/id ...

  8. Easy单例模式

    在学习单例模式前,不妨问自己几个问题:单例模式是怎么来的,单例模式怎么去用? 单例模式是怎么来的? 这就从设计模式起源开始,他是在实际实践中遇到类似情况可以通用经验所得到的总结,一般在其他模块或者方法 ...

  9. iOS 创建OpenGL 环境的思考

    关于如何从头开始创建环境,可以参考大神的博文OpenGL ES 3.0 数据可视化 0:Hello world,本文只是补充一些我在实践中的一些思考. CAEAGLLayer If you plan ...

  10. js、css3实现图片的放大效果

    今天看网易的网站上,当我把鼠标放上去的时候发现图片放大,移开图片缩小,于是自行尝试,结果如下. 方法一:使用js和css3 效果如图: 这样的实现非常简单,就是利用js的mouseover和 mous ...