希望本文能帮助没接触过 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 组件,如下图。

Wrap组件效果图

组件化小结

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

二、数据驱动

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

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

组件的状态 State

先来看效果:

组件 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="秦书羽" />

Props 使用效果图

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

数据驱动的理解

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

再说下数据驱动的理解:

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

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

“数据驱动”的理解图

数据驱动模式带来的收益

个人见解:

  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(仅供参考)

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

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

  1. React 组件封装之 Tree 树形控件

    React 组件封装之 Tree 树形控件 一.Tree 树形结构 二.使用案例 三.API 使用指南 四.源代码 五.总结 一.Tree 树形结构 组件说明: 实现树形控件,适用于组织架构.文章列表 ...

  2. React 组件封装之 Card 卡片

    React 组件封装之 Card 一.Card 卡片 二.使用案例 三.API 使用指南 四.源代码 一.Card 卡片 组件说明: 使列表成为卡片形式的布局. 效果展示: 二.使用案例 import ...

  3. react 代码编写原则_如何编写易读的React代码— 10种编码风格技巧

    react 代码编写原则 by Nirmalya Ghosh 由Nirmalya Ghosh 如何编写易读的React代码- 10种编码风格技巧 (How to write highly readab ...

  4. react 组件连动效果_记一个缓动水柱React动画组件的初次尝试

    写完意识到这是第一篇,算是前言吧... 以后在zhihu写点东西...就当是博客好了,个人观点和体会而已,不求高大上,但求回头看的时候能够让以后的自己瞧不起. 背景:写React也一年多了,从一开始的 ...

  5. react 组件遍历】_从 Context 源码实现谈 React 性能优化

    (给前端大全加星标,提升前端技能) 转自:魔术师卡颂 学完这篇文章,你会收获: 了解Context的实现原理 源码层面掌握React组件的render时机,从而写出高性能的React组件 源码层面了解 ...

  6. react 组件怎么公用_用 react 做一个跟随组件的 tooltip

    定位的难题 你可能听说国很多关于定位型组件种类.名词:popup, tooltip, popover, overlay...(后面将统称为 overlay).这些都是定位型组件,当你需要触发显示它们的 ...

  7. hooks组件封装 react_react-hooks amp; context 编写可复用react组件的一种实践

    在新context API出来的时候,就已经有人提出可以用context进行状态管理.react-hooks的更新,使得这一想法的实现更为方便.以一个例子组件进行分析. 前置条件:阅读过react官方 ...

  8. react组件设计原则_React组件设计规则

    react的目的是将前端页面组件化,用状态机的思维模式去控制组件.组件和组件之间肯定是有关系得,通过合理得组件设计,给每一个组件划定合适得边界,可以有效降低当我们对页面进行重构时对其他组件之间得影响. ...

  9. 微信小程序和vue双向绑定哪里不一样_个人理解Vue和React区别

    本文转载自掘金,作者:binbinsilk, 监听数据变化的实现原理不同 Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化,不需要特别的优化就能达到很好的性能 Reac ...

最新文章

  1. 一键编译php,编译安装php 附加一键安装php5.6.30脚本
  2. lunbuntu install mysql5.7
  3. easyui不同的jsp页面之间混乱_16.jsp九大内置对象,四大作用域
  4. git revert和reset区别
  5. 小米游戏手柄pc插件_在电视上玩电脑游戏
  6. ubuntu 14.04 linux下wifi驱动安装使用的一些笔记
  7. DeepMind和Unity合作,创建虚拟世界来训练AI
  8. Confluence 6 让一个空间可以公众访问
  9. 「洛谷5017」「NOIP2018」摆渡车【DP,经典好题】
  10. android ndk opencv 3,opencv_and_opencv_contrib
  11. 换SSD,WIN10系统备份镜像迁移GHOST入坑,DISM好用,修复WINRE,绿联集线器导致USB硬盘供电不足
  12. 推荐-最新1000多个单机游戏下载,不用注册直接下载!(3)
  13. 1寸、小2寸、2寸证件照片是多大尺寸?
  14. 卡通头像生成器Avataaars generator
  15. 边沿触发是什么意思_epoll 水平触发 边沿触发
  16. 【杂谈】从零开始组建团队开发一款APP的人力成本以及时间成本解析
  17. 计算机科学与技术反思录
  18. VOIP/LTE/VOLTE/VOWIFI
  19. 阿里云 SLB示例配置
  20. 做门户网站 个人站长的新好出路

热门文章

  1. ROJECT SERVER如何与OUTLOOK集成使用
  2. as的使用技巧及注意点
  3. 全球最囧的爱情测试.....
  4. WinDBG 技巧:如何生成Dump 文件(.dump 命令)
  5. backtrader指标
  6. Java笔记01-数组相关
  7. C++中operator的主要用法
  8. 曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台
  9. C语言srand((unsigned)time(NULL))…
  10. 最近在ST公司的STxp70的dsp平台上开发音频codec模块.