安装依赖
1 | yarn add react-i18next i18next i18next-browser-languagedetector |
配置多语言JSON
1 | // en-us.json |
定义i18n.tsx
1 | import LanguageDetector from 'i18next-browser-languagedetector'; |
主文件引用
1 | import React from 'react' |
使用方式
1 | import React from 'react' |
1 | yarn add react-i18next i18next i18next-browser-languagedetector |
1 | // en-us.json |
1 | import LanguageDetector from 'i18next-browser-languagedetector'; |
1 | import React from 'react' |
1 | import React from 'react' |
每一个ReactElement对应一个Fiber对象
记录节点的各种状态
串联整个应用形成的结构
例如:FiberRoot的current指向RootFiber 的 child —->App 的child —> div 的child—->input 的sibling
属性:
1 | return // 指向父节点(每个节点只会有一个父节点) |
用于记录组件状态的改变
存放于Fiber对象的UpdateQueue中:UpdateQue单项链表的结构
多个Update可以同时存在:例如一个事件里面存在三个setState,创建三个update放到UpdateQueue中
1 | // 创建或更新updatequeue |
详解见:https://react.jokcy.me/book/update/expiration-time.html
1 | // ReactFiberReconciler.js中 |
1 | // 目前粗略的理解目前为止到js加载完成的时间差 |
1 | function recomputeCurrentRendererTime() { |
1 | const UNIT_SIZE = 10 |
1 | function computeExpirationForFiber(currentTime: ExpirationTime, fiber: Fiber) { |
1 | export const HIGH_PRIORITY_EXPIRATION = __DEV__ ? 500 : 150; |
1 | export const LOW_PRIORITY_EXPIRATION = 5000; |
1 | function computeExpirationBucket( |
计算为了将固定时间间断的,多次setState数据的更新当成一次更新,在这个时间间断内优先级是一样的
创建更新的方式
render的步骤
后续的是进入调度后,由调度器进行管理
今天开始学习react源码相关的内容,源码基于版本v16.6.0
。React16相较于之前的版本是核心上的一次重写,虽然主要的API都没有变化,但是增加了很多能力。并且首次引入了Fiber
的概念,之后新的功能都是围绕Fiber
进行实现,比如AsyncMode
,Profiler
等。
问题:react仅仅1000多行代码,而react-dom却将近2w行
答: React主要定义基础的概念,比如节点定义和描述相关,真正的实现代码都是在ReactDom里面的,也就是“平台无关”概念,针对不同的平台有不同的实现,但 基本的概念都定义在React里。
Flow 是 facebook 出品的 JavaScript 静态类型检查⼯具。所谓类型检查,就是在编译期尽早发现(由类型错误引起的)bug,⼜不影响代码运⾏(不需要运⾏时动态检查类型),使编写 JavaScript 具有和编写 Java 等强类型语⾔相近的体验。
简单示例🌰
1
2
3npm install -g flow-bin
flow init
touch index.js
1 | // index.js 进行类型注释 |
react-native开发使用的是JS,但是并不是纯正的JS,而是一种JSX语言,就是在JS中嵌入XML语言,因此,只要有一些JS的语法基础的原生开发者,就可以肯容易理解JSX的语法了,在RN中,推荐使用ES6的语法。
使用react-native开发的最大的有点在于开发效率,加入APP并不复杂的话,那么完全可以使用纯JS开发,也就是Android和iOS公用一套界面和逻辑。极大的提高了开发效率。在性能上,RN的表现比原生弱一些,但 是远好于H5。所以总体来看,其实RN的未来还是可以期待的。
RN是运行JS的,Android是运行Java字节码的,所以,实际上JS代码的最终运行是通过一层封装,把JS的代码映射成原生代码,而界面上的元素最终使用的也是原生的组件,而不是自己渲染(所以在性能上,RN比H5要 好很多)。
在Android中,主要交互容器是activity或Fragment,而在RN中,界面的交互容器是Component:组件。我觉得Component和原生的Fragment其实很像,都存在于activity中,都受制于activity的生命周期,都可卸 载和装载。
它来了,它来了,16.8版本hooks
成功加入(^▽^)
你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? —— 拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function。
你还在为搞不清使用哪个生命周期钩子函数而日夜难眠吗? —— 拥有了Hooks,生命周期钩子函数可以先丢一边了。
你在还在为组件中的this指向而晕头转向吗? —— 既然Class都丢掉了,哪里还有this?你的人生第一次不再需要面对this。
React的官方介绍是这样的:
In the typical React dataflow, props are the only way that parent components interact with their children. To modify a child, you re-render it with new props. However, there are a few cases where you need to imperatively modify a child outside of the typical dataflow. The child to be modified could be an instance of a React component, or it could be a DOM element. For both of these cases, React provides an escape hatch.
其中提到了这几个概念:
在典型的React数据流理念中,父组件跟子组件的交互都是通过传递属性(properties)实现的。如果父组件需要修改子组件,只需要将新的属性传递给子组件,由子组件来实现具体的绘制逻辑。
在特殊的情况下,如果你需要命令式(imperatively)的修改子组件,React也提供了应急的处理办法–Ref。
Ref 既支持修改DOM元素,也支持修改自定义的组件。
工作中,React社区推崇搭配一起使用Immutable,就像咖啡牛奶伴侣一样。众所周知React的性能优化我们可以优化组件的嵌套层级,
避免不必要的重绘,以及shouldComponentUpdate来判别组件是否会因为当前属性(props)和状态(state)变化而导致组件输出变化。
一提到React,大家第一时间就想到的虚拟DOM(Virtual DOM)和伴随其带来的高性能(在虚拟dom上进行节点的更改最后在反映到真实dom上)。
但是React提供的是声明式的API(declarative API),好的一方面是让我们编写程序更加方便,但另一方面,却使得我们不太了解内部细节。
正则表达式脱离语言,和数据结构与算法一样,作为程序员的软技能。目前存在的问题:不受重视 优点:
1 | var regex1 = /cosyer/g; |
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、 向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。 正则表达式的匹配模式支持下列 3 个标志。
新增的修饰符:
1 | var a1 = /\+d/g; // 字面形式 |
在JavaScript中建议使用字面形式的正则表达式,因为不需要担心字符串中的转义字符。比如上面示例代码中字面形式使用\d而构造函数使用的是\d;
1 | var text = "aaa "; |
概念: