无论是vue还是react,核心思想离不开组件化,而组件化中,脱离了传统的操作DOM对UI状态的改变,更进一步通过对数据的操作来改变UI状态,避免了直接操作DOM的繁琐和易出现的bug。

而组件化中的关键两点就是组件的props和state,说直白一点就组件的属性和状态。这两点是如何贯穿在组件化开发流程中和怎样颠覆传统的操作DOM对UI状态改变,在此稍作个人理解输出。

下面换一种不同以往列举代码的方式和一张拙劣的简笔画来输出一下个人见解。

盖房子

要想理解这些概念是什么以及如何使用它们,我们先来写一个小示例。就盖个房子如何?

组件

组件化开发

第一步是将 UI 分解成多个组件。例如,我们可以这样来拆分房子:

现在来编码!

House:<div><Roof />     // 房顶<Wall />     // 墙<Window />   // 窗<Door />     // 门</div>复制代码

等一下,怎么看起来这么像 HTML ?没错!React 的部分代码看上去就是非常像 HTML ,其实就是这样设计的,这是为了让 Web 设计师理解和编写 React 代码更容易一些。

因此,在上面的代码中,我们使用 <div> 作为容器,这基本和 HTML 中是一样的。而像 Roof 和 Wall 这样的标签是我们即将定义的自定义标签/组件。

温馨提示: 上面的代码并非实际的 React 代码,甚至连 JavaScript 都算不上。暂时,我们只使用这种宽松的语法来介绍概念。一旦你理解这些概念后,我们再来学习 JavaScript 的细节并将上述概念转换成真实代码。

为了让这个例子更容易理解一些,我再简化一下: 从现在开始,我们来写一个超级简单的 Web 应用,连图片都不用,只显示文字。

例如,Roof 其实就是一个里面有文字的 div :

Roof:<div>roof</div>复制代码

其他组件也是如此,都是只有文字的 div 而已。首先,我们来看下房子的完整的 React 风格的代码:

House:<div><Roof /><Wall /><Window /><Door /></div>
Roof:<div>roof</div>
Wall:<div>wall</div>
Window:<div>window</div>
Door:<div>door</div>复制代码

这没什么不好理解的,是吧?House 是由 Roof、Wall、Window 和 Door 组成的,这些都是纯文本构成的组件。

最后,React 生成的 HTML 如下所示:

<div><div>roof</div><div>wall</div><div>windows</div><div>door</div>
</div>复制代码

使用 Props 来配置屋顶的颜色

想象一下,我们将规格说明书发给一个工厂,这个工厂负责代工所有的零部件。在规格说明书中,我们可以告诉工厂每个部件的固有属性,比如屋顶的颜色、门的形状,等等。在按照我们的要求将屋顶和门生产出来后,它们的属性不会产生任何变化,屋顶还是蓝色的,门依旧是矩形的。这些属性压根不会改变。

在 React 里,我们将这些属性称之为 Prop ,即 property 的缩写。关于 Prop ,你需要记住两点: 首先,我们来决定 Prop 的值,并在组件构建之前将其作为组件设计的一部分。其次,Prop 的值永远不会改变。

那 prop 在代码中是怎样的呢?在 House 组件中,如果我们想要蓝色屋顶的话,只需在 Roof 组件上添加 “color” 属性。这就好比是在发给工厂的规格说明书中指定颜色。

这有点类似于给 HTML 标签添加属性:

House:<div><Roof color="blue"/>...</div>复制代码

那Roof里面又是怎么样使用 prop 的呢?代码如下所示:

Roof:<div>{props.color} roof</div>复制代码

就这样?没错!但是有几点需要注意:

定义组件的 HTML 风格代码是一个模板,而不是单纯的 HTML 标签。这意味着我们可以在其中放置占位符来改变 HTML 输出的内容,而不必重复编写不同的 HTML (还记得 Domo 的帽子吗?这就是占位符的概念!)。在这个示例中,<Roof color="blue" /> 生成的 HTML 是 <div>blue roof<div>,而 <Roof color="red" /> 生成的是 <div>red roof</div>,以此类推。

模板中使用的花括号告诉 React 我们要在此处使用占位符来替代纯文本。

props 可以看作是 Roof 组件所有属性值的集合。假设组件是这样使用的: <Roof color="blue" material="wood" /> ,那么在 Roof 组件的定义中就可以使用 props.color 和 props.material 。

使用 State 来开门

为组件添加 State

组件还可以拥有 state 。那么什么是 state ?state 是一种可以在组件创建后更改的数据。

举个例子,门既可以开,又可以关。我们可以说门的状态就是 state ,因为它的值是可以在门创建后更改的。在这点上,state 与 prop 是不同的,prop 是不会改变的,比如门的形状。

状态值的改变通常是由外部事件所引起的。在 Web 应用中,这些所谓的外部事件通常包括:用户输入了数据,或者从服务端获取了数据,又或者是定时器的触发。

下面,我们来为门添加 state :

Door:State:status   // "open" 或 "closed"<div>Door is {state.status}</div>复制代码

与 props 类似,state 也是组件内部所有状态值的集合。因此,我们可以在组件定义的模板中使用 state.[something] 。

接下来,我们来添加一些处理用户输入的“伪代码”来让门具有交互性。

Door:
State:status // "open" 或 "closed"<div>Door is {state.status}</div>// 处理用户输入当开门时将 state.status 修改成 "open"当关门时将 state.status 修改成 "closed"复制代码

这里的关键点是组件的 state 是随时间而变化的。模板的输出,也就是生成的 HTML 会根据 state 的变化而自动改变。

顺便说句,不要忘了上面的只是“伪代码”,而不是 React 代码。不要尝试将其复制黏贴到你的项目中!否则你的电脑炸了我不负责……

State 是私有的

组件的 state 是私有的。门无论是开还是关,这都仅仅是门的逻辑。与房子或其他组件没有任何关系。事实上,我们完全可以将门从房子中移出去,它仍然可以自己打开或关闭。

因此,门的状态只有在 Door 组件内部是可见的。在 Door 组件内,我们可以读取或改写它的 state 。

House:<div><Door />...<!-- 下面这句是错的 --><div>The door is {Door.state.status}</div></div>
Window:...<!-- 下面这句是错的! -->将 Door.state.status 修改成 'open'
Door:...<!-- 兄dei,这还是错的! -->if House.state.正在出售房产经纪人就可以开门复制代码

总结

这就是 prop 和 state 。prop 是组件的配置项,它的值是在组件创建之前就已经决定好了,比如门的形状和屋顶的颜色就可以定义为 prop。prop 的值永远不会改变。而 state 是组件的私有数据,当组件创建后才可以使用它。比如门的开关状态可以包括在 state 里面。state 会随着一些外部事件的发生而变化。这些所谓的外部事件通常包括:用户输入了数据,或者从服务端获取了数据,又或者是定时器的触发。

React.js和Vue.js有感—前端开发组件化思想的局部要点理解相关推荐

  1. jsx怎么往js里传参数_Angular、React 当前,Vue.js 优劣几何?

    在过去一年里,前端开发发展迅速,前端工程师的薪资亦是水涨船高.2019 更是热度不减,而作为近年来尤为热门的前端框架,Vue.js 自是积累了大量关注.那么,Vue.js 是适合你的框架吗? 以下为译 ...

  2. Angular、React 当前,Vue.js 优劣几何?

    在过去一年里,前端开发发展迅速,前端工程师的薪资亦是水涨船高.2019 更是热度不减,而作为近年来尤为热门的前端框架,Vue.js 自是积累了大量关注.那么,Vue.js 是适合你的框架吗? 作者 | ...

  3. React.js与Vue.js—两种流行框架的深度比较

    JavaScript的发展速度比以往任何时候都快,导致前端的发展也是日新月异,现在讨论最多的前端框架--React.js和Vue.js.因此,在React与Vue的比较中,我们来看看这两者之间更深入的 ...

  4. Vue.js(一) Vue.js + element-ui 扫盲

    Vue.js(一) Vue.js + element-ui 扫盲 2018年12月09日 20:32:59 vbirdbest 阅读数 7043更多 分类专栏: Vue.js + ElementUI ...

  5. nuxt解决首屏加载慢问题_Nuxt.js超过Vue.js:你什么时候应该使用它,为什么

    Nuxt.js是一个建立在Vue.js上的前端框架,它提供了很好的开发特性,比如服务器端渲染.自动生成路由.改进的元标签管理和SEO改进. Nuxt.js 我们的前端团队并没有真正考虑在客户端使用 N ...

  6. cleave.js_Cleave.js的Vue.js 2.x组件

    cleave.js 切裂分量 (vue-cleave-component) Vue.js component for cleave.js 对于Vue.js组件cleave.js View demo 查 ...

  7. 关于node.js 和vue.js的安装、卸载、浏览器测试问题?

    关于node.js 和vue.js的安装.卸载.浏览器测试问题? 最近忙于深入研究vue.js框架的适用问题,所以顺带也有必要系统的研究一下node.js是怎么一回事?! 闲话不多说,直接上文章链接: ...

  8. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  9. 30组常用前端开发组件库,前端组件收集整理列表

    0. 前端自动化 前端构建工具 gulp – The streaming build system grunt – the JavaScript Task Runner 前端模块管理器 Bower – ...

  10. Vue.js-资料-组件化思想 —上

    一.Vue中的组件 Vue视图层的灵魂 -  组件化 组件(Component)是 Vue.js 最强大的功能之一: 组件可以扩展 HTML 元素,封装可重用的代码: 在较高层面上,组件是自定义元素, ...

最新文章

  1. 尝试插入cctv视频
  2. BigMemory系列文章--2.Ehcache快速接入
  3. tcp out of order解决_分布式集群解决方案 学习笔记
  4. 【推导】【数学期望】Gym - 101237D - Short Enough Task
  5. Valgrind 使用方法
  6. ASP.NET MVC Controller Overview摘录
  7. strip python里面是什么意思_python中的strip是什么意思
  8. php excel parser pro v4.2,PHP Excel Parser Pro v4.2怎么用
  9. Excise_day03
  10. 如何用ps 在图片上面写字
  11. 3 RRC 系统消息 SI
  12. 如何用日志记录VSS中的用户修改行为
  13. 计算机专业名词(缩写、全称、中文全称)
  14. InDesign CS3 复合字体
  15. FleaPHP 学习笔记2
  16. 解决Web移动端Fixed布局的方案(防止页面露底、overflow-scrolling、iOS下的 Fixed + Input BUG现象、isScroll.js)
  17. js---函数基础练习题
  18. 如何创建网站?网站制作基本流程详解
  19. ROC-RK3588-PC 八核8K人工智能开源主板
  20. JAVA-把我的第一次给了蔡徐坤

热门文章

  1. 数据集:男女身高体重(二维)
  2. 西南大学计算机应用基础作业答案2020,2018秋【西南大学】[0483]《计算机应用基础》作业(资料)...
  3. sds数据结构,Simple Dynamic String,简单动态字符串
  4. 把数字翻译成字符串的方法数
  5. 【从线性回归到BP神经网络】第一部分:协方差与相关系数
  6. 《Thumbs up? Sentiment Classification using Machine Learning Techniques》笔记
  7. HBASE自带小工具,统计表的行数
  8. sas导出数据串行解决方案
  9. OpenCV3.4.13+OpenCV_contrib 双摄像头实时拼接 环境配置
  10. 简单记录 Part1.3