携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
React Hooks
1.React Hooks解决了什么问题?
- 函数组件不能使⽤state
React Hooks让我们更好的拥抱函数式编程,让函数式组件也能使⽤state功能, - 副作⽤问题
使⽤useEffffect来处理组件副作⽤问题 - 有状态的逻辑重⽤组件
可以用函数组件去封装 - 复杂的状态管理
之前使⽤redux、dva、mobx第三⽅状态管理器来进⾏复杂的状态管理,现在可以使⽤useReducer、useContext配合使⽤实现复杂状态管理,不⽤再依赖第三⽅状态管理器 - 开发效率和质量问题
⽐class组件简洁,开发的体验更好,效率更⾼,同时应⽤的性能也更好
2.新特新
- useState---组件状态管理钩⼦
1)作用:useState能使函数组件能够使⽤state
2)基本使用:
const [state,setState]=useState(initState)
//state是要设置的状态
//setState是更新state的⽅法,只是⼀个⽅法名,可以随意更改
//initState是初始的state,可以是随意的数据类型,也可以是回调函数,但是函数必须是有返回值
- useEffect---副作⽤处理钩⼦
1)作用:useEffect也是componentDidMount、componentDidUpdate和componentWillUnmount这⼏个 ⽣命周期⽅法的统⼀
2)基本使用:
useEffect(callback,array)
//callback: 回调函数,作⽤是处理副作⽤逻辑
//array(可选参数):数组,⽤于控制useEffffect的执⾏
//分三种情况
1.空数组,则只会执⾏⼀次(即初次渲染render),相当于componentDidMount
2⾮空数组,useEffffect会在数组发⽣改变后执⾏
3不填array这个数组,useEffffect每次渲染都会执⾏
- useContext
1)作用:针对context上下⽂提出的⼀个Hooks提出的⼀个API,它接受React.createContext()的返回值作为参数,即context对象,并返回最近的context
2)注意:
1.使⽤useContext是不需要再使⽤Provider和Consumer的
2.当最近的context更新时,那么使⽤该context的hook将会重新渲染 3)基本使用:
const Context=React.createContext({age:'18',name:'miaozai'})
//组件1
const AgeComp= () =>{
//使⽤useContext
const ctx =useContext(Context)
return(
<div>年龄:{ctx.age}岁</div
)
}
- useReducer
useReducer是useState的⼀个增强体,可以⽤于处理复杂的状态管理
1)作用:
useReducer可以完全替代useState,只是我们简单的状态管理⽤useState⽐较易⽤,useReducer的设计灵感源⾃于redux的reducer
2)基本使用:
//useState的使⽤⽅法
const [state,setState]=useState(initState)
//useReducer的使⽤⽅法
const[state,dispatch]=useReducer(reducer,initState,initAction)
3)useReducer的参数介绍:
reducer是⼀个函数,根据action状态处理并更新state
initState是初始化的state
initAction是useReducer初次执⾏时被处理的action
返回值state,dispath介绍:
state状态值
dispatch是更新state的⽅法,他接受action作为参数
- useMemo
1)作用:⽤于性能优化,通过记忆值来避免在每个渲染上执⾏⾼ 开销的计算 2)使用场景: 适⽤于复杂的计算场景,例如复杂的列表渲染,对象深拷⻉等 场景 3)基本使用
const memoValue =useMemo(callback,array)
//callback是⼀个函数⽤于处理逻辑
//array 控制useMemo重新执⾏的数组,array改变时才会重新执⾏useMemo
//useMemo的返回值是⼀个记忆值,是callback的返回值
4)注意: 不能在useMemo⾥⾯写副作⽤逻辑处理,副作⽤的逻辑处理放在useEffect内进⾏处理
- UseCallback
1)作用:⽤于性能优化
2)基本使用
const memoCallback= useCallback(callback,array)
//callback是⼀个函数⽤于处理逻辑
//array 控制useCallback重新执⾏的数组,array改变时才会重新执⾏useCallback
//跟useMemo不⼀样的是返回值是callback本身,⽽useMemo返回的是callback函数的返回值
- useRef 1)作用:⽅便访问操作dom 2)基本使用:
const UseRefComp=()=>{
//创建ref
const inputRef=useRef()
const getValue= () => {
//访问ref
console.log(inputRef.current.value)
}
//挂载
return (
<div>
<input ref={inputRef} type="text">
<button onClick={getValue}>获取input的值</button>
</div>
)
}
3.React Hooks的使⽤规则
(1)只在顶层调⽤Hooks
不要在循环,条件或者是嵌套函数中调⽤Hook,否则可能会⽆
法确保每次组件渲染时都以相同的顺序调⽤Hook
(2)只在函数组件调⽤Hooks
只⽀持函数组件,所以⼤家别在class组件或者普通的函数⾥⾯调⽤Hook钩⼦函数
(3)React Hooks的应⽤场景:
1.函数组件
2.⾃定义hooks
状态管理器Redux
Redux成员及其数据流
-
actions
actions其实是描述操作的对象,我们调⽤dispatch时需要传⼊此对象 -
store
store是整个应⽤的数据存储仓库,把全局管理的状态数据存储起来 -
reducers
reducers接收action并更新store
React封装的react-redux
1.安装:npm install react-redux --save 2.React-redux提供了两个api供我们使⽤
- Provider 顶级组件,功能为给我们提供数据
- connect ⾼阶组件,功能为提供数据和⽅法
路由react-router(版本4.x)
1.安装:npm install react-router-dom --save
2.特点:
1). 秉承react⼀切皆组件,路由也是组件
2). 分布式的配置,分布在你⻚⾯的每个⻆落
3). 包含式配置,可匹配多个路由
3.引⼊路由组件
- 引⼊Link组件编写路由导航\
<Link to="/">⾸⻚</Link>
// to 指定跳转去的路径
- 引⼊Route组件编写导航配置
<Route exact path="/" component={Home}></Route>
//path 配置路径
//component 配置路径所对应的组件
//exact 完全匹配,只有路径完全⼀致时才匹配
- 编写导航配置对应的component组件
4.路由传参取参
- 声明式导航路由配置时配置路由参数
//配置
<Route path="/detail/:course" component={Detail}></Route>
//传递
<Link to="/detail/react">react</Link>
//获取
//解构路由器对象⾥的match出来(macth获取参数信息)
{match.params.course}
- 编程式导航式传递参数与获取
//配置
//解构路由器对象获取到导航对象 history(⽤作命令式导航)
//传递
//通过事件执⾏history.push传递的参数装载在state⾥⾯
//获取
从路由信息解构出location(当前的url信息)对象location.state进⾏获取
5.嵌套路由及路由重定向
//嵌套路由(嵌套的⼦路由需要跟随⽗路由且不设置确切匹配)
<Link to="/mine/userinfo">个⼈信息</Link>
//重定向
<Redirect to="/mine/userinfo"></Redirect>