react-toolkit

react-toolkit

创建reducer

import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
//createAsyncThunk创建异步action creator方法,可以执行dispatch方法
//通过dispatch实现异步方法
export const syncSlice=createAsyncThunk(
    'todos/type',//action对象的type属性值前缀
    (payload,thunkAPI)=>{//执行异步的函数
    setTimeout(() => {
    console.log(s,1234564);
        thunkAPI.dispatch()
    }, 2000);
})

//返回promise通过extraReducer处理
export const loadTodos=createAsyncThunk(
    'todos/type',//action对象的type属性值前缀
    (payload)=>axios.get(palload).then((res)=>res)
)


//actions保存action creator方法
 const {reducer: mySlicereducer,actions} = createSlice({
    name: 'name',//会作为action的type前缀
    initialState: { value: 10 },//初始值
    reducers: {
        //action creator方法
        addState:{
        reducer(state,action) => {//action有type和payload,就是dispatch传入的值
            console.log(state.value++, 'states');
        },
     	prepare(payload){//载荷预加载
            return {
                payload:{title:payload.title,id:nanoid()}
            }
        }
 		}
    },
      //用于接收异步操作的reducer                                           
    extraReducers:{
          //等待
          [loadTodos.pending](){},   
     		//成功
     		[loadTodos.fulfilled](state,action){},
                //失败
                [loadTodos.rejected](state,action){},
    }                                                   
})
export const { addState,syncSlices } = actions
export default mySlicereducer;

创建store

import {configureStore} from '@reduxjs/toolkit'
import logger from 'redux-logger'
//引入reduce文件
import mySliceReducer from 'reducer路径'

//暴露store文件
export default configureStore({
    DevTools:true,//开启浏览器redux调试工具
    reducer: {first:mySliceReducer},//可以配置多个reducer
    middleware:(getDefaultMiddeware)=>{//配置中间件
        //getDefaultMiddeware用于获取内置中间件
        return getDefaultMiddeware().concat(logger)
    }
})

绑定store到根节点

import { Provider } from 'react-redux'

import store from './redx/store路径';

<Provider store={store}><App /></Provider>

页面中使用

const store = useSelector((state) => state.mySilceReducer)

用了状态选择器可以写为
import {seletTodos} from '转态选择器的路径'
const state = useSelector(selectTodos)

实体适配器

实体作为状态stata保存在实体适配器中,实体适配器返回的状态保存在store对象

store中保存的是实体适配器返回的对象

{
    ids:[],//实体的ID的集合
    entities:{//存储实体集合
        1:{id:1}//将实体的ID作为了属性,键名;实体本身作为值
    }
}

创建与使用实体适配器

import {createEntityAdapter} from '@reduxjs/toolkit'
//createEntityAdapter用于创建实体适配器对象
const todoAdapter = createEntityAdapter()
//创建储存数据的实体适配器

const {reducer: mySlicereducer,actions} = createSlice({
    initialState: todoAdapter.getInitiallState(),//获取实体适配器初始值
    reducers: {
        addState:{
        reducer(state,action) => {
            //向实体适配器添加一条状态
            todoAdapter.addOne(state,action)
         }
    //可以简写为 reducer:todoAdapter.addOne
 		}
    },                                         
    extraReducers:{
        [loadTodos.pending](){},   
     	[loadTodos.fulfilled](state,action){
                //向实体适配器中添加多条状态
                todoAdapter.addMany(state,action)
            },
         [loadTodos.rejected](state,action){},
    }                                                   
})

//组件中获取(在原有基础上加上了entities)
const todos = useSelector((state) => state.reducerName.entities)
//拿到的是对象结构数据,就是实体适配器中的entities

状态选择器

import {createSelector} from '@reduxjs/toolkit'

const {seletAll} =todoAdapter.getSelectors()//获取处理实体适配器数据的状态选择器

export const selectTodos = createSelector((state) => {
    //state是状态对象
    return state.reducerName,//这里拿到了实体适配器格式的数据
},selectAll)

//组件中使用
const todos = useSelector(selectTodos)//这里拿到的就是数组格式的数据了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值