万字血书 React—走近 React
配置开发环境
脚手架工具 create-react-app
储备知识:终端或命令行、代码编辑器
获取地址:http://www.jnpfsoft.com/?from=infoq
create-react-app
其是基于 Node 的快速搭建 React 项目的脚手架工具。
npx 命令是 npm v5.2.0 引入的一条命令,无需安装脚手架包,就可以直接使用这个包提供的命令
yarn 是 Facebook 发布的包管理器,功能与 npm 相同,具有快速、可靠和安全的特点
React with TypeScript
About TypeScript
TypeScript 是 JavaScript 的超集
给原生 JavaScript 添加类型检查
与 ES6 一样目前无法被主流浏览器直接读取
Compile TypeScript
编译器:ts-loader、awesome-typescript-loader 以及 babel-loader
编译器配置文件:tsconfig.json
Update to TypeScript
React 基础
About React
History of FE
HTML、CSS、JavaScript——Ajax——jQuery——Angular MVC——Vue、React MVVM
Why is React?
单向数据流
你只需要描述 UI(HTML)看起来是什么样子,就和写 HTML 一样
React 负责渲染 UI,并在数据变化时更新 UI
虚拟 DOM
类似于 Docker 或 VMware 的 Snapshot 的快照技术
组件化
保持交互的一致性
保持视觉风格的统一
便于程序员之间的协作
学习一次,随意使用(必杀技)
使用 React 可以开发 Web 应用
使用 React 可以开发移动端原生应用(react-native)
使用 React 可以开发 VR(虚拟现实)(react 360)
What is React?
React 是一个用于构建用户界面(HTML 页面)的 JavaScript 库
主要用来写 HTML 页面,或构建 Web 应用
如果从 MVC 角度来看,React 仅仅是视图层(V),只负责视图的渲染,不提供完整的 M 和 C 的功能
(经典 MVC 模式中,M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式。)
起源:Facebook 的内部项目
JSX
What is JSX?
What's this?HTML?JS?
这是 ReactJS 自创的语言:JSX
JSX 不是标准的 ECMAScript 语法,只是语法扩展
对于 React 项目使用 js 和 jsx 都可以
ts 对应 tsx 语法
JSX 其实是React.createElement
的语法糖,下图的两种写法完全等价:
Why is JSX?
React 并不强制使用 JSX,也可以使用原生的 JavaScript
React 认为视图的本质是:渲染逻辑与 UI 视图表现的内在统一
React 把 HTML 与渲染逻辑进行了耦合,形成了 JSX
Features of JSX
HTML 代码可以与 JSX 兼容
可以在 JSX 中嵌入表达式
使用 JSX 指定子元素
Attention
React 元素的属性名使用小驼峰命名法
特殊的属性名:class->className、for->htmlFor、tabindex->tabIndex
如果元素没有子节点可以用
/>
结束
推荐使用小括号包裹 JSX,从而避免 JS 中的自动插入分号陷阱
基本使用
JXS 中使用(嵌入)Js 表达式
数据存储在 JS 中,语法:{JavaScript 表达式} 注意:语法是单大括号
React DOM 在渲染所有输入内容之前,默认会进行转义。它可以确保在你的应用中,永远不会注入那些并非自己明确编写的内容。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(cross-site-scripting, 跨站脚本)攻击。
拓展阅读:如何防止XSS攻击?
JSX 的条件渲染
场景:loading 效果
条件渲染:根据条件渲染特点的 JSX 结构
可以使用 if/else 或三元运算符或逻辑与运算符来实现
JSX 的列表渲染
应该使用数组的 map()方法(映射)
渲染列表时应该添加 key 属性,key 属性的值要保证唯一
原则:map()遍历谁,就给谁加 key 属性
注意:尽量避免使用索引号作为 key
JSX 的样式处理
CSS of React
The way of import css file
直接引入整个 css 文件
使用简单,但可能会造成样式的全局污染和样式冲突。
JSS 模块化引入组件
需要额外配置,ts 环境需要配置*.d.ts
的类型声明文件
CSS module/JSS
每个 jsx 或 tsx 文件被视为一个独立存在的原件
原件所包含的所有内容也同样都应该是独立存在的
拓展阅读:CSS in Js
CSS & TypeScript
Ts 的优势就是给 Js 进行类型检查,那么通过 JSS 将 CSS 转换为 Js 对象,是不是也可以给 CSS 添加类型?
插件:typescript-plugin-css-modules
在 tsconfig.json 文件 compilerOptions 新增:
新建.vscode 文件夹——新建文件 settings
配置后会发现编写 style 也会有只能提示
Media & fonts
State & Props
Difference
props 是组件对外的接口,而 state 是组件对内的接口
props 用于组件间的数据传递,而 state 用于组件内部的数据传递
State
State 是组件的“私有属性”
初始化
修改
异步更新 同步执行
调用 setState 后,state 不会立即改变,是异步操作(React 会将多个修改合并为一个)。所以,不要依赖当前的 State,计算下个 State。
setState 本身并非异步,但对 state 的处理机制给人一种异步的假象。
Props
本质上,props 就是传入函数的参数,是父组件传向子组件的数据。
父组件
子组件
Immutable
props 是只读的,一旦创建不可被改变,只能通过销毁、重建来改变数据。
优点:通过判断内存是否一致,来确认对象是否有经过修改,极大提高性能效率
使用 Immutable 来编写程序的方式就是函数式编程(组件)。
评论