React@16.0 文档阅读笔记

花了一周读了React@16的文档和代码(没有读react-dom,找时间读一下),刚开始没想做笔记,后来发现需要记的东西比较多,是以记之。
reactjs.org/docs

  1. 属性名使用小驼峰。其中class变为className,tabindex变为tabIndex。aria-*data-*依然使用小写。(JSX)

  2. 组件名,在JSX中使用时必须大些(组件传递时可以小写),调用createElement时无需大写。(JSX转createElement时使用小写,会传递字符串标签名作为type;而使用大写时会找到并传递作用域内的同名函数作为type。)(Component in JSX)

  3. props实际上是一个被冻结的对象。(props)

  4. 不要直接修改state,不会触发更新机制,使用setState。(state)

  5. state可能是异步的,不要在setState后面同步的取state。(state)

  6. setState支持两个参数,第一个参数是:部分新state 或 一个传入原有state参数并返回部分新state的函数,第二个可选参数是setState完成的回调。(state)

  7. React处理事件使用小驼峰,JSX中传递函数作为事件处理程序,而不是字符串。(Event JSX)

  8. 类方法默认没有绑定this,使用this时将会是undefined。(bind)

  9. 解决bind的方法有:使用类属性(class-properties)、使用箭头函数回调(每次会生成新的回调函数)、使用autobind工具。(bind)

  10. 事件回调函数需要附加参数时onClick={(e) => this.deleteRow(id)}onClick={this.deleteRow.bind(this, id)}等同,同样会产生新的函数。(bind)

  11. 不要使用index作为key。如果项目列表顺序可变的话,会导致性能问题和状态异常。(key)

  12. key和ref是特殊props,不会传递到组件代码中,即组件代码无法取用(程序中不能读取,只有React才能读取)。(key ref)

  13. 如果需要传递ref属性可以使用其他的属性名,如inputRef。(exposing-dom-refs-to-parent-components

  14. 给受控组件props.value从有效值变为null或者undefined后,组件会保留有效value并允许编辑。(input/textarea/select...)

  15. 不建议建立组件的继承层次结构,请使用props和构造(composition)来细化组件职能。(Composition vs Inheritance

  16. JSX中props中值为true的项可以省略值。(JSX props)

  17. 传递props使用扩展语法很容易把不必要的props传递给子组件,而且也不容易维护。(props)

  18. true、fasle、null、undefined作为子元素会被忽略,但是0、''(空字符串)会被渲染。(props.children)

    • 尤其是ReactNative需要注意0、''。字符串的渲染需要放到组件Text中。使用&&表达式进行渲染时,如果前值为0或'',则整个表达式的值为0或'',而一般并不会使用Text组件包裹着,导致错误。
  19. React会在组件Mount、Unmount时调用ref回调,即ref需要生命周期来支持,所以函数式组件不能够接受ref属性。函数式组件内部可以使用ref属性。(refs-and-functional-components

  20. ref应该定义成类上的bind方法。(定义为内联函数时,更新时会调用两次回调函数,分别传入null释放旧ref、DOM元素设置ref)(refs-and-the-dom#caveats

  21. 在React中,<input type =“file”/>总是一个不受控制的组件。它的值只能由用户设置,而不能以编程方式设置。

  22. React两个假设:不同类型的元素会产生不同的子树,开发者可以通过key来指明子元素在不同的渲染中保持稳定。(React)

  23. 绝大多数情况下不需要使用Context,如果你不知道要不要使用Context那就不要使用Context。(Context

    • Context是实验性的API,可能被修改或移除。(React@16.3-beta提供了新的Context的API

    • Context变更无法像props和state那样通知使用Context的组件进行更新。

    • 如果不熟悉像Redux或MobX这样的状态管理库,请不要使用Context。多数情况下这些库和绑定库已经是很好的选择了。

    • 如果您不是经验丰富的React开发人员,请不要使用Context。

    • 如果坚持使用Context,请隔离到尽可能小的范围,并尽量避免直接使用Context的API以便容易升级。

  24. React@16.2新增Fragment组件,支持返回一组节点。简写<>...</>,仅接受key属性。(Fragment)

  25. 可以使用Portals把子组件挂载到其他位置,但其行为依然像子组件一样。(Portals)

  26. 错误边界仅捕获子组件树生命周期中的异常。(Error Boundaries)

    不包括:

    1. 事件处理程序
    2. 异步代码
    3. 服务器渲染
    4. 错误边界本身(可以传播到上级错误边界)
  27. React@16开始,未被处理的错误将导致整个React组件树的卸载。(Error)

  28. 高阶组件(higher-order-components

    1. 约定
      • 将不相关的props传递给包装组件。
      • 最大化组合性。
      • 包装显示名以便于调试。
    2. 注意事项
      • 不要在render中使用高阶组件。(每次渲染创建一个新版本的高阶组件,不仅仅是性能问题,组件状态将无法保持)
      • 必须复制静态方法。(比如使用库hoist-non-react-statics进行复制,或者将静态方法和组件本身分开导出)
      • 避免对高阶组件使用ref。(或者参考14.使用替代的名字,但这不是最好的解决方案。)
  29. 渲染属性是使一个组件知道如何去渲染的函数,一些情况下能够很好的解耦。另外可以使用带有渲染属性的常规组件来实现大多数高阶组件。(render-props

  30. 代码分割(感觉基于webpack的代码分割更现实)(Code-Splitting)

    • 动态import
    • react-loadable和基于路由的react-loadable
  31. 在componentWillMount中调用setState不会产生额外的渲染。在componentDidMount中调用setState会在浏览器更新屏幕之前触发一次额外的渲染,用户虽然看不到,但是可能会有性能问题,常用于渲染依赖于大小或位置的内容之前测量DOM节点。(Component Lifecycle)

  32. shouldComponentUpdate返回false(Component Lifecycle)

    • 会阻止组件以及子组件更新props和重渲染,直到下次render。
    • 不会阻止组件state数据更新(只是不进行重渲染)。
    • 不会阻止子组件因其state发生变化而重新渲染。
  33. shouldComponentUpdate中进行props和state比较时不要使用JSON.stringify,非常影响性能。(Component Lifecycle and Performance)

  34. 事件对象是被池化的、跨浏览器的封装对象,可以使用nativeEvent获取原始的事件对象。不要直接引用事件对象,它可能会意外被清空。如有必要请使用event.persist()从池中移除并允许用户持有事件对象。(SyntheticEvent)

  35. 事件处理程序返回false不会停止事件传播,可以手动使用e.stopPropagation()e.preventDefault()阻止事件冒泡和默认的事件处理行为。(SyntheticEvent)

  36. 关于注释,标签外可以使用JS风格注释,标签内可以使用{/* ... */}风格注释,但是会生成空节点,即{undefined},尽管不会渲染,但是在一些仅支持一个子节点的组件下会报错,比如Touch类的部分组件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,794评论 0 24
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,026评论 2 35
  • 自己最近的项目是基于react的,于是读了一遍react的文档,做了一些记录(除了REFERENCE部分还没开始读...
    潘逸飞阅读 3,304评论 1 10
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,195评论 2 21
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,204评论 0 9