前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >reduxjs-toolkit 案例 — 登录

reduxjs-toolkit 案例 — 登录

作者头像
用户9914333
发布2022-12-14 17:44:11
1K0
发布2022-12-14 17:44:11
举报
文章被收录于专栏:bug收集bug收集

bug收集:专门解决与收集bug的网站

网址:www.bugshouji.com

redux新版本移动了@reduxjs/toolkit 这个库中, 不再使用类似redux-thunk等中间件,大大地简化了开发的流程。

今天分享一个@reduxjs/toolkit 实现的一个登录案例,供大家参考

目录结构

|- store

|- index.js 创建store

|- features

|- userSlice.js 用户切片

|- index.js 入口文件

|- pages 页面级组件

|- login.js 登录组件

案例:登录,调用redux中定义的异步数据,并保存数据

features / userSlice.js 的实现

代码语言:javascript
复制
import {createSlice,createAsyncThunk} from '@reduxjs/toolkit'
import service from './../../service'
const initialState={
    token:sessionStorage.getItem("token")?sessionStorage.getItem("token"):"",
    user:sessionStorage.getItem("user")?JSON.parse(sessionStorage.getItem("user")):{}
}
// 三种状态 ,在extraReducers去侦听,进行不同处理  fulfilled|pending|rejected
export const userLogin = createAsyncThunk("user/userLogin",async (userInput)=>{
     // 发起axios请求
        const res = await service.userSerive.User_Login(userInput); // 相当于then传的数据 
        return res;
})
export const {reducer} = createSlice({
    name:"userSlice",
    initialState,
    reducers:{ //纯函数,不能写异步操作
    },
    extraReducers:{
        // userLogin return 的值放在action.payload属性
        // payload: 负载
       [userLogin.fulfilled](state,{payload}){
           state.token = payload.token;
           state.user = payload.data;
           //将state更新的值同步更新到sessionStorage中
           sessionStorage.setItem("token",payload.token);
           sessionStorage.setItem("user",JSON.stringify(payload.data));

           console.log("fulfilled",payload);
       },
       [userLogin.pending](state){
        console.log("pending");
       },
       [userLogin.rejected](state){
        console.log("rejected");
       }
    }
})

store/inde.js

代码语言:javascript
复制
import {configureStore} from '@reduxjs/toolkit'

import {reducer} from './features/userSlice'

export const store = configureStore({
    reducer:{
        userReducer:reducer
    }
})

index.js 入口文件

代码语言:javascript
复制
import {Provider} from 'react-redux'
import {store} from './store'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Provider store={store}>
    <App />
  </Provider>
);

pages/Login.js

unwrapResult 可用于提取已完成操作的有效负载,实现在组件中拿到action的负载数据.

代码语言:javascript
复制
import { Button, Checkbox,message, Form, Input } from 'antd';
import React from 'react';
import './Login.css'
import {useNavigate} from 'react-router-dom'
import {useDispatch} from 'react-redux'
import {userLogin} from './../store/features/userSlice';
import {unwrapResult} from '@reduxjs/toolkit'
function Login(props) {
    const navigate = useNavigate();
    const diaptch = useDispatch();
    const onFinish = (values) => {
        console.log('Success:', values);
        // 将用户名和密码发送到后台,进行验证
        // 发起请求的操作,redux 中的action中进行

      /*  Redux工具箱导出一个unwrapResult函数,该函数可用于提取已完成操作的有效负载,
          或抛出错误,或抛出rejectWithValue从已拒绝操作创建的有效负载(如果可用)。*/
        diaptch(userLogin(values)).then(unwrapResult).then((data)=>{
            if(data.returnCode===200){
              message.success("登录成功");
              navigate("/index");
            }else{
              message.warning("登录失败");
            }

        }).catch((err)=>{
          message.error("登录出错");
        }); // 通过派发到指定action 
      };

      const onFinishFailed = (errorInfo) => {
        console.log('Failed:', errorInfo);
      };

      return (
         <div className='loginContainer'>
            <h2>登录</h2>
             <Form
          name="basic"
          labelCol={{
            span: 8,
          }}
          wrapperCol={{
            span: 16,
          }}
          initialValues={{
            remember: true,
          }}
          onFinish={onFinish}
          onFinishFailed={onFinishFailed}
          autoComplete="off"
        >
          <Form.Item
            label="用户名"
            name="userName"
            rules={[
              {
                required: true,
                message: '请输入用户名!',
              },
            ]}
          >
            <Input />
          </Form.Item>

          <Form.Item
            label="密码"
            name="userPwd"
            rules={[
              {
                required: true,
                message: '请输入密码!',
              },
            ]}
          >
            <Input.Password />
          </Form.Item>

          <Form.Item
            name="remember"
            valuePropName="checked"
            wrapperCol={{
              offset: 8,
              span: 16,
            }}
          >
            <Checkbox>记住密码</Checkbox>
          </Form.Item>
 
          <Form.Item
            wrapperCol={{
              offset: 8,
              span: 16,
            }}
          >
            <Button type="primary" htmlType="submit">
              登录
            </Button>
          </Form.Item>
        </Form>
         </div>
      );
}

export default Login

苟有恒 , 何必三更眠五更起

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档