Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • 白帽子讲web安全

    • HTML5安全
    • PHP安全
    • WebServer配置安全
    • Web框架安全
    • 互联网业务安全
    • 加密算法和随机数
    • 安全的开发流程
    • 安全运营
    • 应用层拒绝服攻击
    • 文件上传漏洞
    • 注入攻击
    • 点击劫持
    • 认证与会话管理
    • 访问控制
    • 跨站点请求伪造(CSRF)
    • 跨站脚本攻击
  • 深入react技术栈

    • chapter1
    • 高性能建站
    • 冴羽系列文章链接
    • books
    junwen
    2020-03-27

    chapter1

    # 第一章 初入React世界

    ## 重点词汇

    • 专注视图层

    React并不是完整的MVC/MVVM框架,它专注于提供清晰、简介的view层解决方案。而又和模板引擎不同,因为它又是一个包括view和controller的库。

    • Virtual DOM

    我们都知道DOM操作非常昂贵。在前端开发中,性能消耗最大的就是DOM操作。React把真实DOM树转换成JavaScript对象树,,诶次数据更新后,重新计算Virtual DOM,并和上次生成的VD作对比买对发生变化的部分做批量更新

    • 函数式编程

    构建一个规则使计算重复被利用。React充分利用很多函数式方法减少用于代码。此外它本身就是简单函数,所以易于测试。可以说函数式编程才是React的精髓

    • JSX

    jsx的官方定义是类XML语法的ECMAScript扩展。它完美地利用了js自带的语法和特性,并使用大家熟悉的HTML语法来穿件元素。
    例如:

      const List = () => (
        <div>
          <Title>This is a title</Title>
          <ul>
            <li>list item</li>
            <li>list item</li>
            <li>list item</li>
          </ul>
        </div>
      )
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    * 注意:定义标签时,只允许被一个标签包裹;标签一定要闭合;定义组件时命名应该使用大写字母开头!!!

    元素属性:js中的class和for均为关键字,class->className;for->htmlFor,boolean属性例如:

    <Checkbox checked={true} /> 
    // 可以简写为
    <Checkbox checked />
    //反之checked为false就可以省略不写
    <Checkbox checked={false}/>
    //不知道props里与有什么就最好不要设置它,使用es6的rest/spread特性来提高效率
    <Component {...data}>
    
    1
    2
    3
    4
    5
    6
    7
    • React组件
      代码实例详见p14-p15
      1、基本的封装性。
      2、简单的生命周期呈现
      3、明确的数据流动。根据不同的参数得到不同的响应,从而得出不同的渲染结果。

    在这个阶段,前端在应用级别并没有过多复杂的交互,组件化发展缓慢。这样的逻辑一旦复杂起来,就会存在大量的dom操作,开发和维护成本相当高。

    • React组件的构建

    React的本质就是关心元素的构成,它基本上由3个部分组成-----属性(props)、状态(state)以及生命周期方法

    • React组件的构建方法:1、使用React.createClass构建的组件时React最传统、也是兼容性最好的方法,例子:
    const Button = React.createClass({
      getDefaultProps() {
        return {
          color: 'blue',
          text: 'Confirm'
        }
      }
    
      render() {
        const {text,color} = this.props;
        return (
          <button className={`btn btn-${color}`}>
            <em>{text}</em>
          </button>
        )
      }
    })
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    2、ES6 classes

    import React,{Component} from 'react';
    class Button extends Component {
      static defaultProps = {
        color: 'blue',
        text: 'Confirm'
      }
      render() {
        const {color,text} = this.props;
        return (
          <button className={`btn btn-${color}`}>
            <em>{text}</em>
          </button>
        )
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    在React的开发中,常用的方式是将组件拆分到合理的粒度,用组合的方式合成业务组件,也就是HAS-A关系。

    * React的多有组件都继承自顶层React.Compoennt。它只是初始化了ReactComponent方法,声明了props、context、refs等,并在原型上定义了setState和forceUpdate方法。
    3、无状态函数

    无状态组件之传入props和context两个参数,不存在state,也没有生命周期方法。在适合的情况下,我们都应该切且必须使用无状态组件。

    • React的数据流

    在React中,数据是自顶向下单向流动的。这条规则让组件之间的关系变得简单可测。

    • 内部的状态同意成为state。值得注意的是,setState是一个异步的方法,一个生命周期内所有的setState方法都会结并操作。我们并不推荐开发者滥用state,过多的内部状态会让数据流混乱,程序变得难以维护。
    • props 是React中用来让组件之间相互联系的的一种机制,就像方法的参数一样。对于一个tabs组件它的props会有那些呢,1、className,根节点class方便覆盖原始样式;
      2、classPrefix:class的前缀,对于组件来说,定义一个统一的class前缀,对样式与交互分离起了重要的作用
      3、defaultActiveIndex和activeIndex
      4、onChange:回调函数
    • 子组件prop 在React中有一个重要且内置的prop-children,它代表组件的子组件合计 p25 最后TabContent组件的render方法只需要调用getTabPanes方法渲染即可,
      render() {
        return (<div>{this.getTabPanes()}</div>)
      }
    
    1
    2
    3

    这种调用方法叫做动态子组件(Dynamic Children)

    • 组件prop(component prop)
      可以将子组件以props的形式传递
    • 用function prop与父组件通信 this.props.onChange({activeIndex, preIndex})
      父组件将方法传递给子组件,子通过触发onChange给父亲回调需要的值
    • propTypes propTypes用来规范props类型的与必须的状态,常见的有(string、number、func、array、bool、oneOfType、node)

    # React的生命周期

    React的组件的生命周期可以分为挂在、渲染和卸载这几个阶段。大体我们可以分为两类:1、当组件在挂在或卸载时;2、当组件接受新的数据时

    • 组件的挂载 componentDidMount componentWillMount
    • 组件的卸载 compoentWillUnmount
    • 数据的更新过程
      class App extends React.Component {
        componentWillReceiveProps(nextProps) {
    
        }
        shouldComponentUpdate(nextProps, nextState) {
    
        }
        componentWillUpdate(nextProps,nextState) {
    
        }
        componentDidUpdate(prevProps, prevState) {
    
        }
      }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    如果组件发生自身更新那么次执行scu,cwu,render,cdu
    shouldComponentUpdate是一个特别的方法,接受props和state让开发者判断其是否需要更新。
    * 值得注意的是stateless组件没有生命周期方法,也意味着每次都会重新渲染。我们可以使用Recompose库的pure方法:const OptimizedComponent = pure(ExpensiveComponent)

    # 整体流程图

    - ReactDOM 主要方法findDOMNode(获取真实dom元素)、render(渲染VirtualDom到dom)、unmountComponentAtNode卸载操作
    在Github上编辑此页 (opens new window)
    上次更新: 3/22/2021, 3:47:15 AM
    跨站脚本攻击
    高性能建站

    ← 跨站脚本攻击 高性能建站→

    最近更新
    01
    如何打造全链路项目生命周期的统一交付平台
    04-10
    02
    如何建立前端标准化研发流程
    04-10
    03
    如何从0到1一步步成体系地搭建CI
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2019-2021 Syun
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式