使用Redux处理异步问题

 更新时间:2024年03月13日 14:14:46   作者:song854601134  
这篇文章主要介绍了使用Redux处理异步问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

useSelector,useDispatch

首先,也是最重要的一点。如果你不知道要不要用redux,那么最好不要用。

redux主要解决的问题是统一来源的状态管理。

  • 全局state存放在store里。store.getState()可以获得state树。
  • 给store,发送action可以通过reducer生成新的state。store.dispatch({type:SOME_ACTION, data: {})
  • 订阅store,或者新的state。store.subscribe(() => store.getState())

React-redux主要解决的是第二条。使用connect方法把state和actions都作为props注入到了组件里。

比如现在有一个Counter组件。increment做为action creator。状态就是value++。

那么可以写成:

function Counter(props) {
  // ...
  return (<Button onClick={() => props.increment()}>+</Button>)
}

const mapStateToProps = (state) => ({
  value: state.value,
});
const mapActionToProps = (dispatch) => ({
  increment: dispatch(increment()),
})
connect(mapStateToProps, mapActionToProps)(Counter);

大概就是上面这样的。使用了react-redux的hooks呢,画风一转。整个显得清晰了很多。当然这里也不能少了redux toolkit的帮助。

要实现redux应用的完全体就少不了要创建redux的store等这些前期的配置工作。为了减少这些繁琐的配置,redux开发了toolkit这一套工具。项目代码中都有,可以参考。这里不多介绍。

使用了react-redux之后看起来就是这样了。我们在前期没有多做action(action creator)和reducer的介绍。突然出现不能体现它的简化后的好处。有一点,action和reducer通常都放在不同的地方。使用起来不是十分方便。

在新的实现中这些都在slice文件中,方便统一的管理。维护起来也好很多。

import { createSlice } from '@reduxjs/toolkit';

export const counterSlice = createSlice({
  name: 'counter',
  initialState: {
    value: 0,
  },
  reducers: {
    increment: state => {
      state.value += 1;
    },
    decrement: state => {
      state.value -= 1;
    },
    incrementByAmount: (state, action) => {
      state.value += action.payload;
    },
  },
});

// Action creators are generated for each case reducer function
export const { increment, decrement, incrementByAmount } = counterSlice.actions;

这是使用了redux toolkit的好处。action的部分基本不用处理。它会自动生成出来action creator。

react-redux的connect方法也省去了。

代替的方案是useSelector和useDispatch两个方法。

ReduxCounter组件里:

// ...

const ReduxCounter: React.FC<ReduxCounterProps> = props => {
  // ...
  const count = useSelector((state: RootState) => { // 1
    return state.counter.value;
  });
  const dispatch = useDispatch();    // 2
  const onAdd = () => dispatch(increment()); //3

  return (
          <View>
            <Text>{count}</Text>
          </View>
        <View style={styles.buttonWrapper}>
          <TouchableHighlight style={styles.button} onPress={onAdd}>
            <View style={styles.buttonInsider}>
              <Text>+</Text>
            </View>
          </TouchableHighlight>
  );
};

export { ReduxCounter };
  • 1. 使用useSelector获取state树对应到这个组件的状态
  • 2. 使用useDispatch获取dispatch方法,可以发送action
  • 3. 在处理add点击的时候调用dispatch方法发送increment() action creator生成的action。

处理异步

在一般的开发中需要处理很多的网络请求,缓存读写等情况。这些都是异步的。

Redux提供了两种方法来处理异步的情况:

  • createAsyncThunk
  • RTK Query, redux toolkit query

下面主要通过异步缓存读写来演示如何使用这两种方法。

在React Native里用来处理简单的字符串存取的库一般是

@react-native-async-storage/async-storage

import:

import AsyncStorage from '@react-native-async-storage/async-storage';

读、写,删除:

// inside a async function

const ret = await AsyncStorage.getItem('@your-key');
await AsyncStorage.setItem('@your-key', xxx-xxx-xxx);
await AsyncStorage.removeItem('@your-key');

createAsyncThunk

很久以前,有一个用redux就用过的redux插件叫做redux-thunk

现在我们有了createAsyncThunk

在使用的时候和前文提到的slice的套路基本一致。首先我们来新建一个slice叫做authSlice

在里面填空比如:name,initialState。

reducers为空对象,处理非异步的情况。

新增的是:

  • 新建相关的thunk
  • extraReducers

新建thunk

const authenticate = createAsyncThunk<boolean, string, any>(
  'users/auth',
  async (token: string) => {
    try {
      await AsyncStorage.setItem(GITHUB_TOKEN_KEY, token);
      return true;
    } catch (e) {
      console.error('ERROR:', e);
      return false;
    }
  },
);

const authSlice = createSlice({
  name: 'auth',
  initialState: {
    authed: false,
  },
  reducers: {},
});

添加extraReducers

异步的thunks就放在extraReducers里:

const authSlice = createSlice({
  name: 'auth',
  initialState: {
    authed: false,
  },
  reducers: {},
  extraReducers: builder => {
    builder.addCase(authenticate.fulfilled, state => {
      state.authed = true;
    });

    builder.addCase(removeToken.rejected, state => {
      state.authed = false;
    });
  },
});

最后export出去:

export { authenticate, removeToken, authSlice };

后续还要在store里绑定reducer。

export const store = configureStore({
  reducer: { counter: counterSlice.reducer, auth: authSlice.reducer },
});

使用上和之前的countSlice一样:

// 读取state值const authed = useSelector((state: RootState) => state.auth.authed);

在TokenScreen.tsx文件里可以看到具体代码。

发出thunk:

  const dispatch = useAppDispatch(); // 1
  try {
    const ret = await dispatch(authenticate(text)).unwrap(); // 2
    if (ret) {
      console.log('>result action: ', 'DONE');
    }

    navigation.replace('Tabs');
  } catch (e) {
    // TODO: deal with the error 
  }

拿到useAppDispatch方法。在src/store.ts文件里。

本质就是useDispatch

处理分发的thunk的结果的时候可以用redux提供的unwrap方法直接得到结果。

在catch语句里处理错误。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。

相关文章

  • 用react实现一个简单的scrollView组件

    用react实现一个简单的scrollView组件

    这篇文章主要给大家介绍一下如何用 react 实现一个简单的 scrollView组件,文中有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • react中路由和按需加载的问题

    react中路由和按需加载的问题

    这篇文章主要介绍了react中路由和按需加载的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • React文件分段上传实现方法详解

    React文件分段上传实现方法详解

    这篇文章主要介绍了React文件分段上传实现方法,将文件切成多个小的文件;将切片并行上传;所有切片上传完成后,服务器端进行切片合成;当分片上传失败,可以在重新上传时进行判断,只上传上次失败的部分实现断点续传;当切片合成为完整的文件,通知客户端上传成功
    2022-11-11
  • React路由管理之React Router总结

    React路由管理之React Router总结

    React项目通常都有很多的URL需要管理,最常使用的解决方案就是React Router了,本篇文章主要介绍了React路由管理之React Router总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • react项目引入antd框架方式以及遇到的一些坑

    react项目引入antd框架方式以及遇到的一些坑

    这篇文章主要介绍了react项目引入antd框架方式以及遇到的一些坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JS中使用react-tooltip插件实现鼠标悬浮显示框

    JS中使用react-tooltip插件实现鼠标悬浮显示框

    前段时间遇到的一个需求,要求鼠标悬停显示使用描述, 用到了react-tooltip插件,今天写一个总结,感兴趣的朋友跟随小编一起看看吧
    2019-05-05
  • react+redux仿微信聊天界面

    react+redux仿微信聊天界面

    这篇文章主要介绍了react+redux仿微信聊天IM实例|react仿微信界面 ,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 深入分析React源码中的合成事件

    深入分析React源码中的合成事件

    合成事件不是浏览器本身触发的事件,自己创建和触发的事件。本文将从源码角度带大家一起深入了解下React中的合成事件,需要的可以参考一下
    2022-11-11
  • React?18中的state概念与使用、注意问题解决

    React?18中的state概念与使用、注意问题解决

    state和props类似,都是一种存储属性的方式,但是不同点在于state只属于当前组件,其他组件无法访问,这篇文章主要介绍了React?18中的state概念与使用、注意问题,需要的朋友可以参考下
    2022-12-12
  • React模仿网易云音乐实现一个音乐项目详解流程

    React模仿网易云音乐实现一个音乐项目详解流程

    这篇文章主要介绍了React模仿网易云音乐实现一个音乐项目的详细流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论

?


http://www.vxiaotou.com