




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Reactimmer與ReduxToolkit使用教程詳解目錄1.immer1.1setState結合immer使用1.2useState結合immer使用1.3immer和redux集合2.ReduxToolkit
1.immer
概述:
它和immutable相似的,實現(xiàn)了操作對象的數(shù)據共享,可以優(yōu)化性能。它實現(xiàn)的原理使用es6的Proxy完成的。小巧,沒有像immutable哪樣有新數(shù)據類型,而是使用js類型。
安裝:
yarnaddimmer@9
1.1setState結合immer使用
簡單使用:
importReactfrom'react'
//把源數(shù)據使用Proxy進行代理處理,后面就可以精準的去找到變化的數(shù)據
import{produce}from'immer'
conststate={
count:1
//進行代理后,并修改
//draft就是代理對象,它就是state代理對象
constnewState=produce(state,draft={
draft.count++
console.log(newState.count)//2
constApp=()={
returndiv/div
exportdefaultApp
使用immer進行proxy代理,源數(shù)據中只有變化的了的數(shù)據才更新,沒有變化則共享,這樣做可以提高性能:
importReactfrom'react'
//把源數(shù)據使用Proxy進行代理處理,后面就可以精準的去找到變化的數(shù)據
import{produce}from'immer'
constbaseState={
arr:[1,2,3],
obj:{id:1,name:'張三'}
//使用immer進行proxy代理,源數(shù)據中只有變化的了的數(shù)據才更新,沒有變化則共享,提高性能
constnewState=produce(baseState,draft={
draft.arr.push(4)
//當前只修改數(shù)組,對象沒有修改,共享
console.log('arr',newState.arr===baseState.arr)//false
console.log('obj',newState.obj===baseState.obj)//true
constApp=()={
returndiv/div
exportdefaultApp
使用immer優(yōu)化setState使用:
importReact,{Component}from'react'
import{produce}from'immer'
//優(yōu)化setState更新數(shù)據
classAppextendsComponent{
state={
count:100,
carts:[
{id:1,name:'aa',num:1},
{id:2,name:'bb',num:2}
addCount=()={
//原來的寫法
//this.setState(state=({count:state.count+1}))
//使用immer來優(yōu)化setState操作
this.setState(
produce(draft={
//不用返回,返加不允許,draft它是一個代理對象,修改后,它能監(jiān)聽到數(shù)據的變化,更新視圖
draft.count++
render(){
return(
div
h3{this.state.count}/h3
buttonthis.addCount}++++++/button
hr/
{this.state.carts.map((item,index)=(
likey={item.id}
span{}/span
span/span
span
{item.num}--
button
()={
this.setState(
produce(draft={
//draft它就是當前的this.state
draft.carts[index].num++
++++
/button
/span
/li
/div
exportdefaultApp
1.2useState結合immer使用
importReact,{useState}from'react'
import{produce}from'immer'
constApp=()={
//普通的數(shù)字,不是proxy代理,proxy代理的是對象
//如果它是一個普通值,沒有必要使用immer來完成優(yōu)化操作
let[count,setCount]=useState(100)
//對象類型才是使用immer工作的場景
let[carts,setCarts]=useState([
{id:1,name:'aa',num:1},
{id:2,name:'bb',num:2}
return(
div
h3{count}/h3
button
()={
//之前的寫法
//setCount(v=v+1)
setCount(produce(draft=draft+1))
+++count+++
/button
hr/
button
()={
setCarts(
produce(draft={
draft.push({id:Date.now(),num:1,name:'aaaa--'+Date.now()})
添加商品
/button
{carts.map((item,index)=(
likey={item.id}
span{}/span
span/span
span
{item.num}--
button
()={
setCarts(
produce(draft={
//不能返回,寫上去感覺就像在vue的感覺
draft[index].num++
++++
/button
/span
span
()={
setCarts(
produce(draft={
draft.splice(index,1)
/span
/li
/div
exportdefaultApp
1.3immer和redux集合
redux/index.js:
import{createStore}from'redux'
import{produce}from'immer'
constinitState={
count:100
//以前的寫法
/*constreducer=(state=initState,{type,payload})={
if('add'===type){
//深復制
return{...state,count:state.count+payload}
returnstate
constreducer=produce((draft,{type,payload})={
//寫法就和vuex中的mutation中的寫法一樣的,簡化了
//操作數(shù)據無需深復制,提升性能
if('add'===type)draft.count+=payload
},initState)
exportdefaultcreateStore(reducer)
前端頁面:
importReactfrom'react'
import{useSelector,useDispatch}from'react-redux'
constApp=()={
constdispatch=useDispatch()
constcount=useSelector(state=state.count)
return(
div
h3{count}/h3
button
()={
dispatch({type:'add',payload:2})
++++
/button
/div
exportdefaultApp
2.ReduxToolkit
概述:
它開箱即用的高效Redux開發(fā)工具集,是redux新的庫,也是官方推薦今后在項目中使用的redux庫,內置了immer、redux-thunk和redux-devtools。
安裝:
yarnadd@reduxjs/toolkitreact-redux
使用:
前臺頁面:
importReactfrom'react'
import{useSelector,useDispatch}from'react-redux'
constApp=()={
constdispatch=useDispatch()
constcount=useSelector(state=state.count)
return(
div
h3{count}/h3
button
()={
dispatch({type:'add',payload:2})
++++
/button
/div
exportdefaultApp
redux入口文件:
import{configureStore}from'@reduxjs/toolkit'
//上來它就是分模塊,在項目中,所以的數(shù)據一定是分模塊來管理的
importcountfrom'./modules/count'
importuserfrom'./modules/users'
exportdefaultconfigureStore({
reducer:{
count,
user
})
同步操作(count.js):
import{createSlice}from'@reduxjs/toolkit'
//同步操作
constcountSlice=createSlice({
//命名空間名稱,比redux中更好,redux沒有
//它的名稱要和入口文件中configureStore中的reducer配置對象中的key名稱要一致
name:'count',
//初始化數(shù)據源
initialState:{
num:10
//修改數(shù)據源的方法集合
reducers:{
//組件中派發(fā)dispatch(setNum(2))//2就會給payload
//state它就是proxy對象[immer]
setNum(state,{payload}){
state.num+=payload
//導出給在組件中調用
exportconst{setNum}=countSlice.actions
//把當前模塊的reducer導入,集合到大的reducer中
exportdefaultcountSlice.reducer
異步操作(users.js):
import{createSlice,createAsyncThunk}from'@reduxjs/toolkit'
//方案2
//寫在上面,進行網絡請求
exportconstfetchUser=createAsyncThunk('user/fetchUser',asyncpage={
//實現(xiàn)異步數(shù)據獲取
letret=await(awaitfetch('/api/userspage='+page)).json()
//return中的數(shù)據就是返回到state中的users中的數(shù)據一定要return
returnret.data
//異步操作
constuserSli
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療大數(shù)據挖掘技術發(fā)展趨勢分析
- 2025年線上教學階段性工作總結模版
- 3固定合同范例
- 讀陋室銘學生讀后心得體會模版
- 上海家裝室內設計合同范例
- 2024年氧化鋯纖維隔膜布項目資金籌措計劃書代可行性研究報告
- 醫(yī)療領域下的區(qū)塊鏈與專利保護研究
- 上海網約車買車合同范例
- 醫(yī)療器械租賃行業(yè)的市場前景與挑戰(zhàn)
- 倉庫吊裝合同樣本
- 《阿莫西林的生物合成》課件
- 2025年機制砂項目可行性研究報告
- 【課件】2025屆高三英語一輪復習語法填空專題課件
- 2025年低壓電工資格證復審試題及答案詳解攻略
- 四川省瀘州市2025屆高三第三次教學質量診斷性考試地理試題(含答案)
- 2025新版靜療規(guī)范
- 水價與水市場機制聯(lián)動機制-全面剖析
- 初中會考地理試題及答案
- 離婚協(xié)議書正規(guī)打印電子版(2025年版)
- 2025年函授土木工程試題及答案
- 《衛(wèi)星遙感技術》課件
評論
0/150
提交評論