实战总结

react实战基础

遇到的一些坑

  1. li里要带key值否则会警告,这个问题在vue中也存在, 考虑到虚拟DOM中diff,所以不要用index作为key值,而要用item。

2.immutable: state不允许我们做任何的改变,所以拷贝一份list,修改完再用setSate设置

  removeClick(index) {
// immutable
// state不允许我们做任何的改变,所以拷贝一份list,修改完再用setSate设置,不建议用以下写法
// this.state.list.splice(index, 1);
// this.setState({
// list: this.state.list
// })
const list = [...this.state.list];
list.splice(index, 1);
this.setState({
list: list
});
}

3.Uncaught Error: Can only set one of children or props.dangerouslySetInnerHTML

解决方法

  • 使用dangerouslySetInnerHTML属性的虚拟dom元素之间可能有内容,应该没有任何内容

  • 改正

遇到之前不会的知识点

1.bind: 绑定this使得this指向组件todolist

this.handleChange = this.handleChange.bind(this);
this.handClick = this.handClick.bind(this); or 在事件后面直接绑定: {this.handleChange.bind(this)}

bind还可以把下标index传过去

<button onClick={ this.removeClick.bind(this, index)
removeClick(index) {
const list = [...this.state.list];
list.splice(index, 1);
this.setState({
list: list
});
}

2.input里的值通过e传递。

handleChange(e) {
// console.log(this);
this.setState({
inpputValue: e.target.value
})
}

3.angerouslySetInnerHTML: 为了防xss攻击

4.propTypes: 用于传值校验,避免传过来的值类型错误。

import PropTypes from 'prop-types';
// 用于传值校验,避免传过来的值类型错误。
TodoItem.propTypes = {
content: PropTypes.string,
delete: PropTypes.func,
index: PropTypes.number
}

假如把content: PropTypes.string改成content: PropTypes.number,则会警告,因为content是字符串类型,不是数字类型。

![](https://user-gold-cdn.xitu.io/2019/1/31/168a203baefb19d4?w=563&h=67&f=png&s=14767

5.defaultProps:用于设置isRequired的默认值

// 用于设置isRequired的默认值
TodoItem.defaultProps = {
test: 'Hello World'
}

6.props, state的每次改变都会引发render函数。

  • props引发子组件的render函数;
  • state引发父组件的render函数;

7.DOM操作的三个方案

第一种方案:

  • 1.state数据
  • 2.jsx模板
  • 3.数据+模板结合,生成真实的DOM,来显示
  • 4.state发生改变
  • 5.数据+模板结合,生成真实的DOM,替换原始的DOM

缺陷:

  • 第一次生成一个完整的DOM片段
  • 第二次生成一个完整的DOM片段
  • 第二次的DOM替换第一次的DOM,非常耗性能

第二种方案:

  • 1.state数据
  • 2.jsx模板
  • 3.数据+模板结合,生成真实的DOM,来显示
  • 4.state发生改变
  • 5.数据+模板结合直接生成真实的DOM,并不直接替代原始的DOM
  • 6.新的DOM(DocumentFragment)和 原始的DOM作对比,找差异
  • 7.找到input框发生的改变
  • 8.只用新的DOM中的input元素,替代掉老的DOM中的input元素

缺陷: 性能的提升并不明显

第三种方案:

  • 1.state数据
  • 2.jsx模板
  • 3.数据+模板结合,生成虚拟DOM(虚拟DOM是一个js对象,用了描述真实DOM)损耗了性能['div', {id: 'abc'}, ['span', {}, 'hello world']
  • 4.用虚拟DOM的结构生成真实的DOM,来显示<div id='abc'><span>hello world</span></div>
  • 5.state发生改变
  • 6.生成新的虚拟DOM['div', {id: 'abc'}, ['span', {}, 'bye bye']]
  • 7.比较原始虚拟DOM和新的虚拟DOM的叙别,找到区别的内容
  • 8.直接操作DOM,改变span的内容。

优点:

  • 1.性能提升了
  • 2.它使得跨端应用得以实现。React Native

diff算法

  • 1.setState使用异步函数是为了把多次setSate合并成一次,节约性能。

  • 2.diff算法实际上是同层比对虚拟DOM的算法,只要对比一层不同,就删除下面的,用新的虚拟DOM替换,这样可以节约比对时间,节约性能。

  • 3.循环列表中,li里要带key值否则会警告,这个问题在vue中也存在, 考虑到虚拟DOM中diff,所以不要用index作为key值,而要用item。

8.JSX原理

JSX->createElement->虚拟DOM(js对象)->真是的DOM

9.ref: 用来操作DOM,但不建议使用,一般在动画时要操作DOM才使用。

<input id = "insertArea" ref={(input)=>{this.input=input}}/>
this.input.value==e.target.value;

注意在setState中使用时,因为setSate是异步的,直接写console.log(this.ul.querySelectorAll('div').length);

就会使得在setSta之前执行,所以要这样使用

handleClick() {
this.setState((prevState)=>({
list: [...prevState.list, prevState.inputValue],
inputValue: ''
}), ()=>{
console.log(this.ul.querySelectorAll('div').length);
})
}

10.生命周期函数指在某一时刻组件会自动调用执行的s函数

  • componentWillMount:组件即将被挂载到页面时被执行(在挂载时执行一次)
  • render:props和state改变时被执行
  • componentDidMount:组件载到页面之后,被执行(在挂载时执行一次)
  • shouldComponentUpdate:组件被更新之前,他会自动被执行,要求返回一个布尔类型
  • componentWillUpdate: 组件被更新之前,它会自动执行,但是他在shouldComponentUpdate之后执行,如果shouldComponentUpdate返回true它才执行,如果返回false,这个函数不会被执行
  • componentDidUpdate: 更新后被执行,在render之后
  • componentWillReceiveProps: 一个组件从父组件接受参数,只要父组件的render函数重新被执行了,子组件的这个生命周期函数就会被执行

11.react性能优化

  • 1.在constructor用bind绑定this。
  • 2.setState设计成异步的,虚拟DOM: diff同层比对算法(如果有一层不同就舍弃以下的层),列表key值。
  • 3.子组件里shouldComponentUpdate返回false。
  • 4.如果UI组件无逻辑处理,就可以用无状态组件

12.在react里使用ajax,用axios在componentDidMount里使用

13.利用Charles工具mock数据

  • 1.创建todolist.json
  • 2.使用Charles网络代理工具





  • 3.mock
axios.get('/api/todolist')
.then((res)=>{
this.setState(()=>({
list: [...res.data]
}))
})
.catch(()=>alert('error'))

14.css过渡动画和动画

  • transition:过渡动画
  • animation:动画
.show {
/* opacity: 1;
transition: all 1s ease-in; */
animation: show-item 2s ease-in forwards;
}
.hide {
/* opacity: 0; */
/* transition: all 1s ease-in; */
animation: hide-item 2s ease-in forwards;
}
@keyframes show-item {
0% {
opacity: 0;
color: deeppink;
} 50% {
opacity: 0.5;
color: pink;
} 100% {
opacity: 1;
color: purple;
}
} @keyframes hide-item {
0% {
opacity: 1;
color: deeppink;
}
50% {
opacity: 0.5;
color: pink;
}
100% {
opacity: 0;
color: purple;
}
}
  • react-transition-group

15.redux

由于一些中大型项目中,组件之间的传值比较复杂,所以就要引入redux来管理数据状态。

redux原理

实现redux: 在store文件夹里实现store,然后在组件中使用,通过store.subscribe(this.handleStoreChange)订阅,通过store.dispatch(action)修改store

基础API

  • createStore
  • dispatch
  • getState
  • subscribe

三大原则:

  • 单一数据源:整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。
  • State 是只读的唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象, state只由store改变。
  • 使用纯函数来执行修改为了描述 action 如何改变 state tree ,你需要编写 reducers。纯函数指的是给固定的输入久一点有固定的输出,而且不会有任何副作用,修改state的数据。

16.UI组件、容器组件、无状态组件

  • UI组件:又称‘傻瓜组件’,一般只负责UI渲染,不负责逻辑处理
  • 容器组件: 又称‘聪明组件’,负责逻辑处理
  • 无状态组件: 组件只有render函数就可以用无状态组件,如果UI组件无逻辑处理,就可以用无状态组件

无状态组件好处:提高性能,它只是一个函数,而写成类,有周期函数,渲染比较慢

react16实战总结的更多相关文章

  1. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  2. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  3. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  6. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  7. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  8. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  9. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

随机推荐

  1. gcc各个版本下载

    http://www.gnu.org/order/ftp.html http://ftp.gnu.org/gnu/gcc/

  2. 探索JavaScript中Null和Undefined的深渊

    当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单,行为符合常识.但是,本文将更多聚焦独特的原始数据类型Null ...

  3. 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest

    A. Advertising Strategy 最优策略一定是第一天用$y$元,最后一天再用$x-y$元补满. 枚举所有可能的$y$,然后模拟即可,天数为$O(\log n)$级别. 时间复杂度$O( ...

  4. sqlite3使用总结(转并且修改)

    此文来自http://blog.csdn.net/shengfang666/article/details/7937200,我在这儿重新发一下,备份参考. 前序:一.       版本二.       ...

  5. Wireshark简单使用教程3——附视频

    视频https://www.bilibili.com/video/av35763613?from=search&seid=10176480091153063668 目录 抓取干净流量包的用处所 ...

  6. OO第二次阶段性总结

    前两次作业我都无效了……用了很久时间但还是没能弄明白多线程的写法,以后还是要学会即时的多问问会的同学吧…… 以及我的Mertrics在挣扎很久之后还是用不了……跪了 第七次作业 第七次作业能够完成的原 ...

  7. n&m位运算

    在C/C++语言里,&代表取地址或者“位与”运算 1.取变量的地址:&变量名,这将获得该变量的地址,例:int a = 1, &p = a. 2.进行位与运算,格式是:变量1& ...

  8. 报文分析6、ARP报头结构

    ARP报头结构   硬件类型 协议类型 硬件地址长度 协议长度 操作类型 发送方的硬件地址(0-3字节) 源物理地址(4-5字节) 源IP地址(0-1字节) 源IP地址(2-3字节) 目标硬件地址(0 ...

  9. TCP三次握手那些事

    临近5月,春招和实习招聘逐渐进入尾声.本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识. 参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次 ...

  10. 并查集的Java实现

    Java实现并查集,合并时采用路径压缩算法. 如果合并时使用循环修改的方法,一次合并的时间复杂度就为N,无法接受 public class Union { public int[] id;//对应索引 ...