react 组件封装原则_我理解的React:React 到底是什么?

希望本文能帮助没接触过 React 的同学,对React有个大致的理解。

最近要做一个“前端零基础的入门课程分享”,很多非前端同学可能只是知道 React 是个前端框架,整体对 React 的理解还是很模糊,借此机会,分享一下我对 React 的理解。

最重要的写在前面

React是一个前端UI库。我对React的理解主要就两点:

  1. 组件化
  2. 数据驱动

在React基础上,周边生态提供了更多强大功能:状态管理、路由、React Native等。

一、组件化

这里就有了第一个抽象概念:​组件​。

什么是组件?组件是对逻辑的封装。对于前端 UI 层来说,组件就是将 UI 封装起来。供任意组装和调用。

太抽象了?我提炼成三个点,帮助大家理解:

  1. 写React就是写组件。将一个界面分成若干个组件组合包装成完整页面
  2. 写每一个组件的时候:每个组件有自己的生命周期,在组件不同的周期里做自己想要做的逻辑
  3. 子组件接受父组件的参数(Props) 、 以及维护组件内部的状态(State)

最简单的组件 HelloWorld

下面我们看一个最简单的类组件 HelloWorld

// HelloWorld.jsx
class HelloWorld extends React.Component {componentDidMount () {console.log('HelloWorld 第一次挂载到界面上');}componentWillUnmount () {console.log('HelloWorld 即将移除(销毁)');}render() {return (<div>Hello World!</div>);}
}

这样就完成了一个简单的 ​HelloWorld​ 组件

  1. componentDidMountcomponentWillUnmount是两个常用的生命周期函数,传送门:更多生命周期。
  2. render 函数在每次渲染时调用,返回的内容就是组件最终的界面,示例中return 了一个Hello World 的 div。

子组件调用示例

再写一个 按钮组件 ​HelloButton

// HelloButton.jsx
class HelloButton extends React.Component {render() {return (<button>我是一个按钮</button>);}
}

写一个父组件 把 HelloWorld 和 HelloButton 两个组件包裹进来

// Wrap.jsx
class Wrap extends React.Component {render() {return (<div><HelloWorld></HelloWorld><HelloButton></HelloButton></div>);}
}

可以看到 React 调用子组件其实就是把子组件当做一个标签,跟 div 这些标签一样。

Wrap 组件最终的展示就是,一个HelloWord 组件 + 一个HelloButton 组件,如下图。

0fcb86e2e42ae10c9803f3ac8ff3a281.png
Wrap组件效果图

组件化小结

基于对组件化的理解:写 React 就是写一个个组件,再组装起来。所以如果用分治的思想,我们只要关注每个组件怎么实现就好了。

二、数据驱动

现在来讲我的另一个理解——​数据驱动​,那么组件有哪些数据呢?

组件有两种数据:父组件传递的参数 Props组件内部的状态State,先来分别看一个例子。

组件的状态 State

先来看效果:

8265d32d6eefed7e8651a0b62ac35693.png
组件 State 示例,效果图

完整代码如下:

// App.jsx 
class App extends React.Component {constructor () {super()this.state = {count: 0}}onIncrease = () => {this.setState({ count: this.state.count + 1 })}onDecrease = () => {this.setState({ count: this.state.count - 1 })}render() {return (<div><div>当前数值:{this.state.count}</div><button onClick={this.onIncrease}>点我-1</button><button onClick={this.onDecrease}>点我+1</button></div>);}
}

解析:

  1. constructor方法中,设置了一个 State 属性 ​count​,初始值为 0;
  2. 声明了两个方法 ​onIncrease​ 和 ​onDecrease​,方法里对 count 设置了 +-1 的操作;
  3. render 函数里渲染了一行文字 + 两个按钮,这里有两个注意点:
    1. return里面的内容是 jsx 模板,大括号内的内容是一个 js 变量或者表达式,React 会自动渲染。例如 ​{this.state.count}​ 渲染时就会渲染成count的值
    2. 给 button 指定了属性(Props) ​onClick​,即当 button 点击时,会自动调用 指定的函数。

建议没看到上面例子的同学,带着上面的解析,重新尝试能否看懂。

上面的例子中,​count​ 就是 App组件 的一个 State

  1. 用来直接将 count 显示在界面上;
  2. 当接收到点击事件时,改变了 count 这个 State。

父组件传递的属性 Props

从语义上理解:Props 是父组件传递给子组件的属性,与 State 不同的是子组件不能修改,只有父组件才能修改。

先看看如何使用 Props:

// HelloMessage.jsx
class HelloMessage extends React.Component {render() {return (<div><div>Hello {this.props.username}</div></div>);}
}

上述例子,使用的示例、效果如下:

<HelloMessage username="秦书羽" />

335770e38474187721bcfe73e919ad4e.png
Props 使用效果图

解析:子组件在使用Props时,使用 ​this.props​ 直接调用即可,父组件在使用子组件时,应将需要的数据传给子组件。

数据驱动的理解

上面两个例子中,界面都是根据数据来渲染,且随着数据变化,自动更新,这就是数据驱动渲染。

再说下数据驱动的理解:

  1. 界面的渲染,由数据(State和Props)决定,数据变更驱动页面更新;
  2. 人机交互(点击、按钮操作等)驱动数据变更,界面根据数据自动更新;
  3. 对于开发者,开发一个组件,需要分成两部分:数据 和 视图,再根据用户行为,修改数据即可

从这个方面去理解,React 是一个 Model -> View 的一个框架。

fb919e0f6c45eed4c91a8a5f0cfd949e.png
“数据驱动”的理解图

数据驱动模式带来的收益

个人见解:

  1. 数据和视图分层,逻辑解耦清晰,优雅的多;
  2. 人机交互的行为太多、先点哪个按钮、再点哪个按钮,传统开发方式需要判断的东西太多,数据驱动的话,只需要根据当前的数据,修改对应的数据,大大简化;
  3. 利于单元测试。

三、总结

  1. 开发模式上,React 给我们带来了 组件化和数据驱动。其内部也基于此做了大量的性能优化;
  2. React 是一个基础的 UI 库,作者和社区提供了更多配套,如React-Router(路由)、Redux(全局状态管理),同学们可以在 React 的理解基础上 向上扩展;
  3. 本文都是在讲 React 的 组件化和数据驱动。但我认为不是因为有了 React 才有 组件化和数据驱动,而是组件化和数据驱动 的想法,为了达到这样的设计,最终实现了 React 。本文没有涉及原理,有兴趣的同学可以自行学习。

字节跳动杭州游戏中台急招Web前端(实习、P5-P6(1-5 年) 都要),新业务,发展好。欢迎简历 qinshuyu@bytedance.com,部门直推。职位JD(仅供参考)


感谢您的阅读,欢迎评论区指正、交流。

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

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

相关文章

解引用NULL为什么会导致程序挂死?

来源&#xff1a;公众号【编程珠玑】作者&#xff1a;守望先生ID&#xff1a;shouwangxiansheng解引用NULL指针为什么会出错&#xff0c;导致程序挂死&#xff1f;或者说访问内存地址为0的位置为什么会视为非法&#xff1f;先了解NULL参考《NULL,0,\0有何区别&#xff1f;》。解…

JAVA多线程实现的三种方式 ()

1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式&#xff0c;但Thread本质上也是实现了Runnable接口的一个实例&#xff0c;它代表一个线程的实例&#xff0c;并且&#xff0c;启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法…

关于主机的思维导图_送给孩子最好的思维导图课程

思维导图寒假班来了1关于思维导图思维导图是一种简单而有效的图形思维工具&#xff0c;主要元素包含图形、线条、关键字、颜色&#xff0c;配合下图&#xff0c;我们能理解思维导图利用了左脑和右脑的工作机理&#xff0c;能够充分调动大脑的分析推理和想象创新能力&#xff0c…

2016年10月计算机网络技术,2016年10月自考《计算机网络技术》练习题及答案1

2016年10月自考备考开始了&#xff0c;为了帮助自考生在考试阶段顺利复习&#xff0c;猎学网小编为你提供2016年10月自考《计算机网络技术》练习题及答案1&#xff0c;检测备考情况&#xff0c;从而进行查缺补漏。更多2016自学考试资讯请访问1、对地址转换协议(ARP)描述正确的是…

华为项目Tree canvas画图2

//添加数组找到box_content ul li 对应的indexct.lineTo($(".box_content ul li").eq(j).position().left57,($(".box_header ul li").eq(index).position().top)106140);//中点ct.lineTo($(".box_content ul li").eq(j).position().left57,($(&…

那年夏日我吃瓜

好吧&#xff0c;标题就是为了吸引读者进来增加阅读量的&#xff0c;作为一个公众号小编&#xff0c;我没有什么大量的墨水贡献给大家&#xff0c;但是就是想吹牛逼一下。我最近很懒&#xff0c;都有好几天没有更新新的文章了&#xff0c;然后大家也看到我自己写的东西没有什么…

验证python安装_Python环境搭建(安装、验证与卸载)

电脑系统版本 &#xff1a;Win8.1/64位Python官网地址&#xff1a;www.python.orgPython安装版本&#xff1a;3.7.2本文目录&#xff1a;一、Python的安装二、验证Python安装的情况三、Python的卸载四、Python环境变量配置一、Python的安装1.打开浏览器进入Python官网&#x…

未来计算机是否有意识或者人为的赋予意识,人工智能会有自我意识吗?

在西雅图的艾伦脑科学研究所&#xff0c;正在进行大规模的研究&#xff0c;以了解人脑中860亿个神经元是如何连接的。目的是产生所有连接的图&#xff1a;连接组。该研究所的科学家现在正在重建一立方毫米的老鼠大脑&#xff0c;这是有史以来最复杂的。绘制出大脑连接方式的映射…

别瞎找了,你要的C语言经典示例都在这~

大家周末好&#xff0c;这篇文章是从朋友的号那边看到的&#xff0c;确实不错&#xff0c;如果C语言还觉得没有胸有成熟的话&#xff0c;可以看看。里面的例子都很经典&#xff0c;有条件的同学实际操作一下。给大家找了一些C语言经典示例&#xff0c;github链接&#xff1a;ht…

【Java基础总结】网络编程

网络编程 InetAddress tcp udp转载于:https://www.cnblogs.com/lhat/p/6168909.html

广联达文件被锁怎么修复_事无巨细的绕过Apple id教程+修复蜂窝数据/电话

本次教程首发于Apple tech752大神&#xff0c;十分感谢他的nice job&#xff01;通过这份教程你可以绕过Apple id激活锁&#xff0c;并且保留通话和移动数据和短信的功能&#xff0c;解决了由于基带锁导致绕过ID的机器不可以打电话的问题。写在前面&#xff1a;1.请勿用于捡到/…

计算机辅助翻译专业院校,2017年北大计算机辅助翻译考研经验分享

2017年北大计算机辅助翻译考研经验分享【摘要】笔者完美地将自身优势与兴趣相结合&#xff0c;最终成功折桂北大计算机辅助翻译。►择校(兴趣优势)其实我最开始考研的目标并不是北大的计算机作者hhhhhh1111次阅读2017-07-06【摘要】笔者完美地将自身优势与兴趣相结合&#xff0…

如何写出让同事无法维护的代码?

译文&#xff1a;http://coolshell.cn/articles/4758.html原文&#xff1a;http://mindprod.com/jgloss/unmain.html文章转自公众号 strongerHuang对&#xff0c;你没看错&#xff0c;本文就是教你怎么写出让同事无法维护的代码&#xff0c;因为只有这样&#xff0c;别人才不能…

vs编译python好还是pycharm的好_Python学习 第3天 VS与PyCharm使用对比

前两天出差&#xff0c;趁着热情再玩玩Python吧IDE就在VS和Pycharm中选吧&#xff0c;这两个IDE都很喜欢一、VS能在VS中开发Python是最好&#xff0c;平时习惯了。可以安装PTVS&#xff0c;直接新建个Python项目&#xff0c;就会提示下载PTVS了&#xff0c;安装完试了下&#x…

CodeVs——T 4919 线段树练习4

http://codevs.cn/problem/4919/ 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题解查看运行结果题目描述 Description给你N个数&#xff0c;有两种操作 1&#xff1a;给区间[a,b]内的所有数都增加X 2&#xff1a;询问区间[a,b]能被7整除的个数 输入描述 Input Descri…

html tab与jQuery,使用jquery实现div的tab切换实例代码

jQuery实现Tab切换 接触jQ不久以前的js代码来写的简单效果现在用jQ来写&#xff1a;HTML代码&#xff1a;最新评论近期热评随机文章1234567890-11234567890-21234567890-3css代码&#xff1a;#sidebar-tab{border:1px solid #ccf;margin-bottom:1.5em;overflow:hidden;}#tab-ti…

调试,是一件有挑战的事情

如果你不是工程师&#xff0c;你应该享受不到加班调试的乐趣吧&#xff0c;我记得在大学的时候&#xff0c;我第一次调试I2C时序&#xff0c;当时用的芯片是24C02的RTC芯片&#xff0c;用51单片机模拟I2C时序&#xff0c;怎么整也整不出来&#xff0c;时序这个东西&#xff0c;…

make 命令_make考点总结(建议中、高考学生收藏)

考点一、“make宾语宾语补足语”结构1、这个结构表示“ 使…… 处于某种状态”“ 使……怎么样”。其中宾语的补足语&#xff0c;通常是表示情感的词(happy, sad)或者是表示状态的词(rich, strong, ill)。比如&#xff0c;Make your room clean.“使你的房间干净”&#xff0c;…

如何通俗易懂的解释PWM?

学过电力电子的小伙伴们都知道…交流电“整流”为直流电&#xff08;a&#xff09;…直流电“逆变”为交流电&#xff08;b&#xff09;…交流电“变压”为交流电&#xff08;c&#xff09;…直流电“斩波”为直流电&#xff08;d&#xff09;…“变压”&#xff08;c&#xff…

计算机与环境科学,计算机在环境科学与工程方向的应用

计算机技术与环境应用21世纪是信息时代&#xff0c;作为信息化社会标志的计算机也愈来愈广泛地为人类所掌握和利用。计算机的便捷和高效性提高着社会的生产力&#xff0c;使人们创造着前所未有的物质财富。与此同时&#xff0c;人口的快速增长、资源的过度消耗、环境污染和生态…