React

1.基础的React

1.1 Context与ContextType

Context提供了一种方式,能够让数据在组件树中传递而不必一级一级的手动传递,但会让组件失去独立性。


context结构

API:createContext(defaultValue?)

import {createContext} from 'react'
const BatteryContext = createContext()

<BatteryContext.Provider value={}>
</BatteryContext.Provider>

<BatteryContext.Consumer>
{
    battery=><h1>{battert}</h1>
}
</BatteryContext.Consumer>

static  contextType = BatteryContext
render(){
    const battery = this.context
}

1.2 lazy与Suspense

暂时没有资源展示---->延迟加载:

  • Webpack - Code Splitting
    把一个页面人为的划分为模块进行导入
  • import
    1.做静态模块导入
    import 。。。 from
    2.动态模块导入
    import('').then(...)
    typeof import
    webpack就会做一次代码拆分,把import的依赖打包成一个独立的文件,默认情况下,不会马上加载它,只有用到的时候才会导入。指组件渲染的时候。封装的是组件导入的行为,而不是组件本身。而且导入意味着网络请求。
const About = lazy=(()=>import(/*webpackChunkName:'about'*/'./about.jsx'))

lazy的返回就是一个组件
用了lazy后,会存在一个加载中的空档,不知道什么时候加载
这时候用Suspense

<Suspense fallback=(<div>About</div>)>
    <About>
    </About>
</Suspense>

block request url阻止获取请求(当出现加载错误的时候,suspense不能捕获,但错误边界可以)

//ErrorBoundary错误边界
componentDidCatch(){
  this.setState({
  hasError:true
})
}
//一旦发生错误,就返回一个新的state数据,并合并到新的state之中
static getDerivedStateFromError(){
  return {
    hasError:true
}
}

页面首次加载时的性能问题

1.3 memo

shouldComponentUpdate(nextProps,nextState){
  if(nextProps.name === this.props.name){
  //下一次属性中的name和当前属性中的name,如果相等就不再重新渲染,不想等就重新渲染
    return false
    }else{
        return true
          }
}
//或者用PureCompent,需要导入{PureCompent } from React,只有传入数据的本身对比
//(第一级发生变化,比如对象内部不算)2.传入回调函数每次都会重新渲染),内部的数据变化就不行
class Foo extends PureCompent{
  
}

memo

//函数式的不能用Pure,但是有memo
import {memo} from 'react'
const Foo =  memo(function Foo(props){//返回一个组件
  return ()
})

2.React Hooks

类组件的问题:

  • 状态难以复用(渲染组件,高阶组件)
  • 渲染属性和高阶组件导致层级冗余
  • 生命周期函数混杂不相干逻辑
  • 相干逻辑分散在不同的生命周期
  • this指向复杂
    hooks优势:
  • 函数组件无this问题
  • 自定义hooks方便复用状态逻辑
  • 副作用关注点分离

2.1 useState

import {useState} from 'react'
const [count ,setCount] = useState(0)
onClick={()=>{setCount(count +1)}}

use每次渲染按照稳定的顺序和稳定的次数。

2.2 useEffect

副作用:

  • 绑定事件
  • 网络请求
  • 访问DOM

副作用的时期:

  • Mount之后
  • Update之前
  • Unmount之前
useEffect
useEffect(()=>{
  window.addEventListener('resize',onResize)
  console.log('count')
  return () => {
  //清空状态函数
window.removeEventListener('resize',onResize)
}
},[])

传入空数组说明只执一次。

2.3 useContext与useMemo/useCallback

import {createContext,useContext} from 'react'
const CountContext = createContext()
<CountContext.Provider value={}></>
function Counter(){
  const count = useContext(CountContext)
console.log(count)
}

useMemo:
仅仅用来做性能优化使用,不能做改变渲染逻辑的用途
const double = useMemo(()=>{
return count *3
},[count])调用时机在渲染期间,而useEffect是在副作用时期,useMemo是有返回值,可以参与渲染,不能循环依赖
useCallback:

const onClick = useMemo(()=>{
  return ()=>{
  console.log('click')
}
},[])

const onClick = useCallback(()=>{
  console.log('click')
},[])

useMemo返回值是一个函数。则等价于useCallback
使onclick函数不会变化,useCallback会创建函数,但是如果没有变化,则不会返回,当依赖变化时,才会执行。

2.4 useRef

  • 获取子组件或者DOM节点的句柄
  • 渲染周期之间共享数据的存储
    state也能储存数据,但state会触发重渲染。
import {useRef} from "react"
const counterRef = useRef()
<Counter ref= {counterRef}>
console.log(counterRef.current)
//注意只能是类组件
const it = useRef()
it.current = ....
下一次渲染就能获取到了

2.5 Redux

redux:状态容器与数据流管理

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