React 基础学习总结

React 基础学习总结

1、创建虚拟DOM对象的两种方式

  • React.createElement(type, props, ...children)
  • <h1></h1> jsx语法
  • virtual-dom可以看做js对象

2、React 的 jsx 语法

  • 作用:用来创建虚拟DOM对象
  • 语法:
    • 以<开头就会去解析,如果式html同名标签就解析html同名元素,如果不是就以其他方式解析
    • 以{开头就会去解析,将其中的代码当作js代码解析
      • if / for循环 不能用

3、定义组件两种方式

  • 工厂函数 --> 简单组件
    function MyComponent() {
        return <h1></h1>
    }
    
  • ES6类 --> 复杂组件
    class MyComponent extends React.Component{
        render() {
            return <h1></h1>
        }
    }
    
  • 注意事项:
    • 组件首字母大写
    • 标签必须是闭合的
    • 有且只有一个根标签

4、React 组件的实例对象上 三大属性(what why how)

  • state
    • 作用:
      • 用来定义组件内部状态数据
      • 用来更新页面
    • 使用:
      • 初始化 在constructor中 this.state = {xxx: xxx}
      • 读取 this.state.xxx
      • 更新 this.setState({xxx: xxx})
  • props
    • 作用:
      • 用来组件外向组件内传递数据
    • 使用:
      • 约束属性的类型和必要性 static propTypes = {xxx: PropTypes.func.isRequired}
      • 定义属性的默认值 static defaultProps = {xxx: xxx}
      • 读取 this.props.xxx
      • 设置 <List name={xxx}>
  • refs
    • 作用:
      • 用来获取DOM元素
    • 使用:
      • 设置:
        • 在constructor中 this.xxx = React.createRef()
        • 在虚拟DOM对象上 <input ref={this.xxx} />
      • 使用:this.xxx.current
  • 属性扩展:
    • static属性 不会传送给实例对象,永远在组件(类)上
    • 普通属性 会传给实例对象

5、组件化编码流程和套路

  1. 拆分组件: 根据页面功能进行拆分
    App
    AddTodo
    TodoList
  2. 实现静态组件
    先实现大的组件(最外层组件),再实现里面的组件。
    有一个基本的显示效果
  3. 实现动态组件
  • 需不需要定义状态数据?
    看页面是否有变化,有变化就要定义状态数据
  • 状态数据定义再哪里?
    如果数据是单个组件需要,就定义再单个组件内
    如果数据是多个组件需要,就定义再公共的父组件中
  • 状态数据定义成什么?
    定义成对象、数组、基本数据类型。
    方便插入数据和遍历展示,所以用数组
  • 子组件如何操作父组件的数据?
    父组件定义操作数据的方法(数据再哪,操作数据的就在在哪)
    父组件将操作数据的方法传给子组件,子组件调用就改父组件的数据
  1. 组件特别注意事项:
      1. 组件内置的方法中的this为组件对象
      1. 在组件类中自定义的方法中this为null
        a. 强制绑定this: 通过函数对象的bind()
        b. 箭头函数(ES6模块化编码时才能使用)

6、 收集表单数据(受控组件与非受控组件)

  • 受控组件(官方推荐使用)
    • 定义组件状态,绑定触发事件,再通过事件目标信息更新组件状态
  • 非受控组件
    • 通过ref操作DOM节点的方式操作form信息
  • 组件间的数据传输(重点)--------->
    1. 父组件传送给子组件 --利用props属性传值
    2. 子组件对父组件传值 简单来说就是利用回调来完成
    3. 兄弟之间传值 传值者先将值传给父组件,再由父组件传送给需要收值者

7、 组件的生命周期(Component-lifecycle)

  • 概念:

    • 组件对象从创建到死亡它会经历特定的生命周期阶段
    • React组件对象包含一系列的勾子函数(生命周期回调函数), 在生命周期特定时刻回调
    • 我们在定义组件时, 可以重写特定的生命周期回调函数, 做特定的工作
  • 第一部分: 初始化加载,生命周期函数执行顺序

    1. construtor (只会执行一次)
      • 初始化状态数据
      • 初始话Rreat.createRef()
      • 绑定自定义函数this指向
    2. componetWillMount (18将废弃) (只会执行一次) 将要插入回调
    3. Render 渲染DOM (每当组件状态有变化就执行) 用于插入虚拟dom回调
    4. componetDidMout (只会执行一次) // 已经插入回调
      • 发送请求
      • 设置异步任务 ---> 绑定事件或者设置定时器
  • 第二部分: 组件接收数据,生命周期函数执行顺序

    1. componentWillReviceProps (将废弃) 第一次props不会调, 在有新的props才调用
    2. shouldComponentUpdate (this.setState触发)
      • 专门用来做React性能优化的:将之前的状态/属性和当前的状态/属性进行对比,如果一样,就不更新,如果不一样就更新
    • 返回值为true就更新
    • 返回值为false就不更新
    1. componentWillUpdate (this.forceUpdate触发) 将废弃
    2. render()
    3. componentDidUpdate
      • 可以获取更新后DOM元素,进而进行操作
  • 第三部分: 组件将移出

    1. componentWillUnmout (unmountComponentAtNode 1秒执行) 组件将要移出的回调
      • 做一些首尾工作,清除定时器,局部变量,取消ajax请求

Diff算法------->

  1. 总结:
    • React 通过制定大胆的 diff 策略,将 O(n3) 复杂度的问题转换成 O(n) 复杂度的问题;

    • React 通过分层求异的策略,对 tree diff 进行算法优化;

  • React 通过相同类生成相似树形结构,不同类生成不同树形结构的策略,对 component diff 进行算法优化;

    • React 通过设置唯一 key的策略,对 element diff 进行算法优化;
  • 建议,在开发组件时,保持稳定的 DOM 结构会有助于性能的提升;

    • 建议,在开发过程中,尽量减少类似将最后一个节点移动到列表首部的操作,当节点数量过大或更新操作过于频繁时,在一定程度上会影响 React 的渲染性能。
  1. 作用:
    • 最小化页面重绘、减少重排重绘的次数

key 与 index 对比

  1. 为什么列表的key尽量不要用index
  • 简单来说: 当数组中的数据发生变化时: React 比较更新前后的元素 key 值,
  • 如果相同则更新,如果不同则销毁之前的,重新创建一个元素
  1. 结论:
  • 如果今后需要往数组最前面插入数据,必须用id作为key的值,
  • 如果不是,而是往最后追加,可以用index作为key的值,(如果数据中有id属性,就用id)

react-scaff 脚手架

1.简述:
* 1) xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目
* a. 包含了所有需要的配置
* b. 指定好了所有的依赖
* c. 可以直接安装/编译/运行一个简单效果
* 2) react提供了一个用于创建react项目的脚手架库: create-react-app
* 3) 项目的整体技术架构为: react + webpack + es6 + eslint + babel
* 4) 使用脚手架开发的项目的特点: 模块化, 组件化, 工程化

  1. 安装启动:
npm install -g create-react-app
create-react-app hello-react
cd hello-react
npm start

  1. json配置含义:
"scripts": {
    "start": "react-scripts start",  //启动服务器端口监听
    "build": "react-scripts build", //生产环境指令
    "test": "react-scripts test",   // 测试文件是否有问题
    "eject": "react-scripts eject"  //会webpack配置打包,在要大量修改时使用(一般不用)
  },

PubSubJS 利用第三方库组件进行交互

antD-UI构建库项目

  1. 创建项目,引入adtd

    • create-react-app react-admin
      • npm i antd
  2. 在根目录配置按需打包文件 config-overrides.js

    • 安装: yarn add react-app-rewired customize-cra babel-plugin-import -D
      • 配置: config-overrides.js
      const { override, fixBabelImports} = require('customize-cra');
      
         module.exports = override(
             fixBabelImports('import', {
                 libraryName: 'antd',
                 libraryDirectory: 'es',
                 style: true,
             }),
         );
      
      
  3. 在应用中使用antd组件

  4. 自定义antd主题

    • 安装: yarn add less less-loader -D
    • 功能: 编译less,和主题颜色配置
  5. 引入路由

    • 安装: yarn add react-router-dom
      • 配置路由: 项目应该首先设置路由
  6. 静态组件引入

    • 按需引入
    import {Form, Icon, Input, Button} from 'antd'    //按需引入
    const Item = Form.Item;   //替换成Item
    
    
  7. 表单验证

    • 利用高阶函数 给Form创建form属性
    @Form.create()
    class Login extends Component {...}
    export default Login     
    
    • 引入验证函数
            // 引入  
            render() {
       const { getFieldDecorator } = this.props.form;
               ...
            // 验证语法
            
               
    

antd-UI项目包管理

  1. antd-UI下载
    yarn add antd
  2. 路由管理
    react-router-dom
  3. 组件按需打包
    react-app-rewired -D
    customize-cra -D
    babel-plugin-import -D
  4. 修改主题颜色,编译文件
    less less-loader -D
  5. mongodb数据库
  6. postman接口测试
  7. ajax请求
    axios
  8. 本地存储
    store
  9. 文件路径配置
    node原生模块 path
  10. 轻量的处理时间和日期库
    apm i dayjs --save
  11. 跨域处理...
    npm i jsonp

redux状态管理

  1. React Component 组件
  • react-redux的Provider时store的抽象实例对象
  • 使用react-redux 的connect方法连接redux的store
  1. actions creator 事件行为定义,创造新的store行为
  2. reducers 新状态生成,并不更新
  • redux的combineReducers方法将处理后多状态同时返回给store
  1. store 存储比较新旧状态
  • redux的createStore方法将reducers的新状态创建为新的store
  • redux的applyMiddleware方法应用中间件
  • redux-thunk是一个redux-store日志记录的中间件
  • redux-devtools-extension的composeWithDevTools是一个调试扩展工具的方法

context

高阶组件

* 是一个函数,接收一个组件,返回一个组件
* 新组件

扩展:

Virtual-DOM(虚拟DOM) 和 真实DOM 的比较:

  • 真实DOM会有其他的一些属性,例如事件,属性等特性

  • 虚拟DOM就是真实DOM变为js对象, 再比较虚拟DOM变化,是比较js对象的变化, 所以加快了react的性能

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

推荐阅读更多精彩内容

  • 一、JSX语法 1、花括号 { } 把任意的 [JavaScript 表达式]嵌入到 JSX 中 2、JSX可作表...
    Scarlett_L阅读 323评论 0 2
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,428评论 1 33
  • [toc] REACT react :1.用来构建用户界面的 JAVASCRIPT 库2.react 专注于视图层...
    拨开云雾0521阅读 1,432评论 0 1
  • 1、什么是react React.js 是一个帮助你构建页面 UI 的库。React.js 将帮助我们将界面分成了...
    谷子多阅读 2,555评论 1 13
  • 一 天山啊,自从遇见你 我怎么会夜不成眠? 你那带着古风的沧桑始终缠绕着我 飞机似你峭壁的苍鹰 可是在寻找归巢? ...
    银城阅读 420评论 1 13