React Fiber   16版本

registerServiceWorker 的作用

PWA  progressive web application  写手机app应用   在断网的情况下,第二次访问会缓存

ReactDOM.render 会把组件挂载到真实DOM节点上

JSX语法   js里面写html + 自定义组件(自定义组件名称必须大写)

bind(this,  index) 可以在bind里面传递参数

list.splice(index, 1) 删除一项

state 不允许直接做任何改变     不要 this.state.list.splice(index, 1)

解析 html  可能存在XSS攻击

<li  dangerouslySetInnerHTML = {{ __html:item }}>

label扩大点击区域

<label  htmlFor="inputa">输入内容</label>

<input id="inputa"/>

render 返回的内容  注释和其他部分不能是同一级别

不允许在子节点中直接修改父组件中的state

样式引入放在最后面

this.setState((prevState)=>{
return {value:e.target.value} // 需要提前获取value
}) 否则可能会有问题

直接操作DOM, 是命令式编程, 大部分都在进行DOM操作

声明式编码  数据驱动

单向数据流:父组件传值给子组件  子组件只能使用而不能改变

否则会报错

好处是不容易出错, 因为可能在多个子组件中修改父组件的数据,可能导致出错

函数式编程给测试带来了便捷

propTypes和defaultProps

import PropTypes from 'prop-types';

// 规定类型
TodoItem.propTypes = {
test:PropTypes.string.isRequired,
content: PropTypes.string,
handItem: PropTypes.func,
idx: PropTypes.number
} // 默认值
TodoItem.defaultProps = {
test:"hello,world"
}
PropTypes.arrayOf(string,number) 数组的内容类型
oneOfType([string,number]) 才是 多种类型的一种

props state 与 render函数的关系

当组件的state或者 props发生变化的时候 render方法重新直接

当组件的render方法被执行时,它的子组件的render方法也会被执行

生成DOM替换原来的DOM都会非常消耗性能

一点点改变  都会导致新DOM的生成

改变:新生成的DOM和原来的DOM做对比找差异

只替换改变的DOM部分

缺陷:性能提升并不明显

改进:生成虚拟DOM(虚拟DOM就是一个js对象,用它来描述真实DOM)

<div id=’abc’>aaa</div>
React.createElement(“div”, {id:’abc’}, abc)

数据发生了改变,生成新的 虚拟DOM

然后和原来的 虚拟DOM做对比

通过diff算法,找到不同的部分,然后直接操作DOM替换改变的部分

js生成一个js对象代价小,但是生成一个DOM代价高

只要和DOM相关的操作都极大消耗性能(不管是比较还是生成)

用虚拟DOM的结构生成真实DOM

jsx --> createElement 方法 --> 生成虚拟DOM(js对象) --> 真实DOM

该方法偏向底层  和<div>aaa</div> 效果是一样的  只是这么写比较简便

jsx 语法并不是真实的DOM,只是一个模板

所以就算没有jsx语法 也可以通过 createElement来替代

虚拟DOM生成在前 真实DOM生成在后

虚拟DOM的好处:

1.性能提升了

2.它使得跨端应用得以实现 (虚拟DOM 并不生成真实DOM) 而生成原生应用的组件

Diff算法   对比虚拟DOM (js对象)

1. 同级比对 + key 值比对

如果一致  继续比对第二层

如果不一致 则不再进行下一层的比对

好处是:比对算法比较简单

为什么setState 要设计成异步函数

多次短时间的操作可以合并成一次操作   减少对比虚拟DOM的次数

循环的时候 key的意义   比对和 key 值做关联

为什么key值 不要设置为 index

因为插入数组元素的时候   div 的index可能 改变成其他div的index

导致 key值不稳定  就失去了存在的意义

react中ref的使用

<input  ref={ inp=> this.inp = inp }>

在使用的时候,直接使用 this.inp即可

不推荐使用ref

注意:ref和setState一起使用的时候可能导致结果不正确

因为setState 是异步的

this.setState((prevState)=>{}, ()=>{})  第二个参数的意思是setState 执行完成之后,执行某些操作

这样就可以保证在更新完数据以后正确的执行某些操作

声明周期函数:

componentWillReceiveProps(props)

当一个组件从父组件接受参数  ==>  执行的时机

只要父组件的render函数重新被执行了,子组件的render函数也会被执行

换个说法

如果这个组件第一次存在组件中,不会被执行

如果这个组件之前已经存在于父组件中,才会被执行

当一个组件是父组件没有props值就不会被执行

shouldComponentUpdate 返回 bool

只会执行一次

componentWillMount / componentDidMount / componentWillUnmount

生命周期函数的使用场景

1. input 值改变,就会导致state改变 页面重新渲染

浪费了性能 使用shouldComponentUpdate

shouldComponentUpdate(nextProps,nxtState){
return nextProps.content !== this.props.content? true:false;
}

在发送ajax请求的时候, 不能放在render方法中,因为render可能会被反复执行

componentDidMount 最好

componentWillMount 可能和react native 有冲突

使用Charles进行接口数据模拟
componentDidMount(){
axios.get('/api/todoList')
.then((res)=>{
this.setState(()=>({list:[...res.data]}));
tools – map local
css过渡动画
render(){
return <Fragment>
<div className={ this.state.isShow? "show":"hide"}>hello,React</div>
<button onClick={ this.handlerClick }>toogle</button>
</Fragment>
} .show {
opacity: 1;
transition: all 1s ease-in;
} .hide{
opacity: 0;
transition: all 1s ease-in;
}
动画效果 通过@keyframes来定义动画
.hide{
animation: hide-item 2s ease-in forwards;
} 加上forwards的作用是 保存动画最后一帧的CSS样式 @keyframes hide-item{
0%{
opacity: 1;
color: red;
}
50%{
opacity: 0.5;
color: green;
}
100%{
opacity: 0;
color: blue;
}
}
入场也是一样 反过来就可以了

使用react-transition-group 实现动画  yarn add

redux基础

组件树复杂的时候,组件传值非常麻烦

数据放在公共区域,而不是放在组件上

直接改变store里面的数据,组件就会自动感知到

Redux = Reducer + Flux

react是和Flux一起放出来的  Flux不是特别好用

Reducers 记录本

Component --> ActionCreators --> store --> Reducers --> Store --> Components

constructor(props){
super(props);
this.state = store.getState();
}

reducer的限制: reducer可以接收 state,但是绝对不要修改 state

newState 返回给了 Store

store.subscribe(()=>{this.setState(store.getState())
}) 这个组件去订阅store
handlerChange(e){
const action = {
type: 'change_input_value',
value: e.target.value
};
store.dispatch(action); //将action传递给 store
} 然后store就会自动把 action转发给reducer if(action.type === 'change_input_value'){
const newState = JSON.parse(JSON.stringify(state));
newState.inputVal = action.value;
return newState;
}

return 返回回来的数据 就会给 store 然后store替换原来的数据

UI组件和容器组件的拆分

ui组件页面的渲染  傻   只管页面  不管逻辑

容器组件   聪明   不管页面  只管逻辑

无状态组件性能比较高, 它就是一个函数

而普通组件要执行一些生命周期函数

可以用于UI组件中

Redux 设计和使用的三大原则

1.store是唯一的  只有改变store能够改变自己的内容

2. reducer是纯函数 (固定的输入差生固定的输出, 没有副作用)

所以里面不能有异步操作和时间相关的操作

例如: newState.date = new Date()   或者对参数直接进行修改  state.inputValue = action.value

是store拿到reducer返回的数据  然后store来进行更新

而不是reducer改版数据的  这也是为什么reducer一定不要直接改变store里面的数据

redux 中发送异步请求获取数据  放在组件的componentDidMount

使用redux-thunk 把异步的代码从组件的DidMount 中移除到action里面去

const composeEnhancers =
typeof window === 'object' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose; const enhancer = composeEnhancers(
applyMiddleware(thunk,…),
); const store = createStore(reducer,enhancer);
componentDidMount(){
const action = getInitData();//返回的是一个函数
store.dispatch(action); // 这一步就会发异步请求
当返现action是一个函数,那么就会执行一下这个函数
}
componentDidMount(){
const action = getInitData();//返回的是一个函数
store.dispatch(action); // 这一步就会发异步请求
当返现action是一个函数,那么就会执行一下这个函数
}

如果把异步请求的方法都放在组件的生命周期函数里面, 那么内容会越来越多,而且更加方便测试(测试函数比测试生命周期函数简单)

redux的中间件

中间指的是 action 和store的中间  只是对dispatch的升级

reset.css 加入到全局样式中去,在不同的内核上 不同的 标签的表现形式可能不同

background-size: contain  表示让图片包含在div中  正常大小

react只兼容到 IE8

create-react-app 有一个特性  在public下面 定义api目录 可以当做 请求地址模拟后端请求访问

render 方法 可以返回一个数组 和字符串

React16.4 中废弃了一些生命周期函数

componentWillUpdate   componentWillReceiveProps

res.send / res.json / res.sendfile 响应不同的内容

回到顶部功能

window.scrollTo(0,0)

每一个组件都调用了 connect方法 和store进行了连接,只要每一个数据发生了改变

那么每一个组件都会被重新渲染   这样不好 例如 input框里面的数据改变

性能很低:

在组件里面 都加上 componnentWillUpdate()  只要和自己相关的数据  就会返回 true 无关的就会返回false

将继承Component 都改为PureComponent  用了该组件就需要使用 immutable来管理数据 否则会出现坑

页面的跳转不要使用 a 标签  会加载 html  会消耗性能

import { Link } from ‘react-router-dom’
<Link to = ‘/detail’>
获取路由参数
<Link to=”/detail/:id”>
<Link to={ “/detail/” + “abc”>
<Route path=”/detail/:id”>

第二种方式
<Link to={ “/detail?id=” + “abc”>
<Route path=”/detail”>
这样就可以匹配到了
this.props.location.search 还要自己去解析这个字符串

styled-component 要通过 innerRef 得到原始的DOM结构

异步组件  yarn add react-loadable

第一个参数是要加载的组件  第二个参数是加载过程中显示的组件

axios 拦截器

在使用express中使用 cookie  依赖 cookie-parse

1. swiper loop 设为 true 时,同时有改变了 slidePreview 的值,这时轮播时,按prev按钮到第一个时

会出现空白页          解决办法: slidePrerview 设置为 auto  loopSliders 设置为你要显示的 slide个数

2. swiper-slide 为动态添加的内容 时  swiper的滑动效果会消失

解决办法: 初始化中设置 observer 为true observerParent 为true

componentDidCatch(error, errorInfo){}  出错的生命周期函数

React内容的更多相关文章

  1. React tutorial

    https://www.algolia.com Build Unique Search ExperiencesHosted Search API that delivers instant and r ...

  2. 写react项目需要注意的

    key应该是稳定的,且唯一的,尽量不要用索引作为key 都知道React组件渲染列表时需要为每个列表元素分配一个在列表中独一无二的key,key可以在DOM中的某些元素被增加或删除视乎帮助React识 ...

  3. [Full-stack] 跨平台大框架 - RN

    前言 React-Redux的大全栈代码复用理论有点意思,给出一个具体的例子:[React] 15 - Redux: practice IM 因为与react内容天然地部分重合,故这里将重点放在了对c ...

  4. webpack使用时可能出现的问题

    1.在配置完webpack.config.js准备进行热加载开发时,修改React内容浏览器不会自动局部刷新,而且会console出一些提示: The following modules couldn ...

  5. React Native知识1-FlexBox 布局内容

    一:理论知识点 1:什么是FlexBox布局? 弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其 ...

  6. 【JAVASCRIPT】React学习-巧用 props 的 children 属性实现内容填充

    背景 平常写组件,经常遇到需要获取内容放入组件内部的情形. 实现方法 我们有两种实现方式 1. 自定义 props render 的时候通过获取 this.props.content 填充到组件内部 ...

  7. react实现删除输入框内容

    react中实现删除输入框中的内容 import React,{Component} from 'react' class Clear extends Component{ constructor(p ...

  8. react修改app.js添加中文内容后中文部分乱码解决

    [问题]:配置完react后修改app.js内容时添加中文出现如下乱码的中文. [A解决]文档——文本编码——转换文本编码,在弹出窗口修改,确定,搞定 [B解决]首先在EditPlus内:工具——首选 ...

  9. (四)React高级内容

    1. React developertools安装及使用 2. PropTypes与DefaultProps 讲一下PropTypes, 先拿TodoItem来说: 从几种类型中选: 3 props ...

随机推荐

  1. java 内存溢出总结

    堆 /** * jvm 参数: -Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m * @author admin * */ public class HeapOutOfMemor ...

  2. MVC、MTV、FBV、CBV、母版和继承:

    cookie session cookie的定义: 保存在浏览器上的一组组键值对 (请求头) 为什么要有? http协议是无状态,每次的请求之间是相互独立的,没有办法保存状态. Django中操作co ...

  3. nginx学习(五):nginx.conf 核心配置文件详解

    整体结构 详细信息 1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody user root; 2.worker进程工作数设置,一般来 ...

  4. phoenix中添加二级索引

    Phoenix创建Hbase二级索引 官方文档 1. 配置Hbase支持Phoenix创建二级索引   1.  添加如下配置到Hbase的Hregionserver节点的hbase-site.xml  ...

  5. Sql Server 判断表是否存在方法总结

    #使用场景: 1.在创建表之前,需要先判断该表是否已经存在: 2.在删除表之前,需要先判断该表是否已经存在: #方法总结: 1.判断实体表是否存在的方法: 1).方法一: * from sysObje ...

  6. js常用但是不容易记住的代码

    <!-- iframe 自适应高度度 --><iframe src="__CONTROLLER__/showlist" frameborder="0&q ...

  7. 二维码生成 Gma.QrCodeNet (目前测试支持.net4.0及以上,但vs版本2010不可以 NuGet中搜索不到程序包)

    1.添加程序包 2.生产二维码方法 #region 二维码 /// <summary> /// 生成二维码 /// </summary> /// <param name= ...

  8. Python--方法/技巧在哪用的典型例子

    就我个人在学习Python的过程中,经常会出现学习了新方法后,如果隔上几天不用,就忘了的情况,或者刚学习的更好的方法没有得到应用,还是沿用已有的方法,这样很不利于学习和掌握新姿势,从而拉长学习时间,增 ...

  9. CSS3/CSS之居中解析(水平+垂直居中、水平居中,垂直居中)

    首先,我们来看下垂直居中: (1).如果是单行文本,则可以设置的line-height的数值,让其等于父级元素的高度! <!DOCTYPE html> <html lang=&quo ...

  10. Android 布局渲染流程与卡顿优化

    文章内容概要 一.手机界面UI渲染显示流程 二.16ms原则 三.造成卡顿的原因 四.过度绘制介绍.检测工具.如何避免造成过度绘制造成的卡顿 一.手机界面UI渲染显示流程 大家都知道CPU(中央处理器 ...