React简单快速学习

React出现的历史

  • 传统DOM API 关注太多的细节
  • 优点: React 始终刷新整体页面

React

  • 一个新概念: 组件
  • 4个必须api
  • 单向数据流
  • 完善的错误提示

Flux 架构: 单向数据流

衍生产品: Redux Mobx


以组件方式考虑 UI构建

class CommentBox extends Component {
  render () {
    return (
      <div>
        <CommentList />
        <CommentFrom />
      </div>
    )
  }
}
  • 理解 React 组件
    • props + state = View
      1. React 组件一般不提供方法, 而是某种状态机
      2. React组件可以理解为一个纯函数
      3. 单项数据绑定

创建一个简单的组件

  1. 创建静态UI
  2. 考虑组件的状态组成
  3. 考虑组件的交互方式

受控组件 vs 非受控组件

  1. 受控: 表单元素状态由使用者维护
  2. 非受控: 表单元素状态DOM 自身维护

何时创建组件: 单一职责原则

  • 每个组件只做一件事
  • 如果组件变得复杂, 那么应该拆分小组件

数据状态管理: DRY原则

  1. 能计算得到的状态就不要单独存储
  2. 组件尽量无状态, 所需数据通过props 获取

JSX: 一种语法糖

  • JS 代码中直接写 HTML 标记
const name = 'yym'
const element = <h1>Hello, {name}</h1>
  • JSX本质: 动态创建组件的语法糖
  • JSX 中使用表达式
    • jsx本身也是表达式
    const element = <h1>Hello, world</h1>
    
    • 在属性中使用表达式
    <MyComponent foo={1 + 2 + 3} />
    
    • 延展属性
    const props = {firstNmae: 'yym', lastName: 'bruce'}
    const greeting = <Greeting {...props} />
    
    • 表达式作为子元素
    const ele = <li>{ props.name }</li>
    
  • JSX约定: 自定义组件以大写字母开头
    1. React认为小写的tag是原生 DOM 节点, 如 div
    2. 大写字母开头为自定义组件
    3. JSX标记可以直接使用属性语法, 如<menu.Item />

React组件的生命周期

  1. Render阶段
    • 纯净且没有副作用.可能会被React暂停, 中止或重新启动
  2. Pre-commit阶段
    • 可以读取DOM
  3. Commit 阶段
    • 可以使用DOM, 运行副作用, 安排更新
生命周期图示

constructor 构造函数

  1. 用于初始化内部状态, 很少使用
  2. 唯一可以直接修改 state 的地方

getDerivedStateFromProps

  1. 当 state 需要从 props 初始化时使用
  2. 尽量不要使用: 维护两者状态一致性会增加复杂度
  3. 每次 render 都会调用
  4. 典型场景: 表单控件获取默认值

componentDidMount

  1. UI 渲染完成后调用
  2. 只执行一次
  3. 典型场景: 获取外部资源

componentWillUnmount

  1. 组件移除时被调用
  2. 典型场景: 资源释放

getSnapshotBeforeUpdate

  1. 在页面 render 之前调用, state 已更新
  2. 典型场景: 获取 render 之前的 DOM 状态

componentDidUpdate

  1. 每次 UI 更新时被调用
  2. 典型场景: 页面需要根据 props 变化重新获取数据

shouldComponentUpdate

  1. 决定 Virtual DOM 是否要重绘
  2. 一般可以由 PureComponent 自动实现
  3. 典型场景: 性能优化

理解 Virtual DOM 和 key 属性的作用

JSX运行基础: Virtual DOM

  • 虚拟DOM的两个假设
    1. 组件的 DOM结构相对稳定
    2. 类型相同的兄弟节点可以被唯一标识: key

组件设计模式: 高阶组件和函数作为子组件

高阶组件和函数子组件都是设计模式
可以实现更多场景的组件复用

  1. 高阶组件(HOC)

    • 高阶组件接受组件作为参数, 返回新的组件


      高阶组件
  2. 函数作为子组件


    函数作为子组件

    ]


理解 Context API使用场景

context
  • 根节点称为 provide
  • 使用 context 称为 consume
const ThemeContext = React.createContext('light')

class App extends React.Component {
  render () {
    return (
      <ThemeContext.Provide value="dark">
        <ThemeButton />
      </ThemeContext.Provide>
    )
  }
}

function ThemeButton(props) {
  return (
    <ThemeContext.Consume>
      { theme => <Button {...props} themen={ theme } />}
    </ThemeContext.Consume>
  )
}

使用脚手架创建React应用

  1. Create React App
  2. Codesandbox
  3. Rekit

为什么需要脚手架
一个项目需要的应用挺多: React Redux React/Router BABEL Webpack ESlint ...

$ create-react-app

打包和部署

为什么需要打包? 使用 webpack 打包

  • 编译 ES6 语法特性, 编译 JSX
  • 整合资源, 例如图片, Less/Sass
  • 优化代码体积

打包注意事项

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

推荐阅读更多精彩内容

  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,758评论 0 24
  • react 基本概念解析 react 的组件声明周期 react 高阶组件,context, redux 等高级...
    南航阅读 1,009评论 0 1
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 976评论 0 1
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,143评论 0 9
  • React简介 (1)简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaSc...
    鱼鱼吃猫猫阅读 1,587评论 1 6