redux-toolkit查询验证坚持

发布于 2025-02-11 20:43:47 字数 3780 浏览 0 评论 0 原文

您好,我创建了一个功能良好的应用程序,可以创建用户,获取用户,添加帖子,反应,删除帖子。现在,我想将Auth添加到我的应用程序中。但是我很困惑如何坚持状态,添加还原器,动作并初始化这样的状态。

我在这里分享一些代码:

import { LOCAL_LOGIN, LOGIN, SIGN_OUT} from '../types';
const initialState = {
    user:null,
    token:null,
    is_logged_in:false
};
const LoginReducer = (state = initialState, action) => {
    switch(action.type) {
        case LOGIN:
            return {
                ...state,
                user:action.payload.data,
                token:action.payload.access_token,
                is_logged_in:true,
            };
        case LOCAL_LOGIN:
            return{
                ...state,
                user:action.payload.data,
                token:action.payload.access_token,
                is_logged_in:true,
            }
        case SIGN_OUT:
            return{
                ...state,
                user:null,
                is_logged_in:false
            }
        default:
            return state;
        }
    }
export default LoginReducer;

这很好。这是我的新代码

/// apislice.js

import {
    createApi,
    fetchBaseQuery
  } from "@reduxjs/toolkit/query/react";
  
  export const apiSlice = createApi({
    reducerPath: "api",
    baseQuery: fetchBaseQuery({
      baseUrl: "https://ab91-203-82-55-110.ngrok.io/"
    }),
    tagTypes: ['Post', 'User'],
    endpoints: builder => ({})
  });

/// postslice.js

import {
    createSelector,
    createEntityAdapter
} from "@reduxjs/toolkit";
import { apiSlice } from "../api/apiSlice";
const usersAdapter = createEntityAdapter()
const initialState = usersAdapter.getInitialState()
export const usersApiSlice = apiSlice.injectEndpoints({
    endpoints: builder => ({
        getUsers: builder.query({
            query: () => '/users',
            transformResponse: responseData => {
                return usersAdapter.setAll(initialState, responseData)
            },
            providesTags: (result, error, arg) => [
                { type: 'User', id: "LIST" },
                ...result.ids.map(id => ({ type: 'User', id }))
            ]
        }),
        getUserByUserId: builder.query({
            query: id => `users/${id}`,
        })
    })
})

export const { useGetUsersQuery, useGetUserByUserIdQuery } = usersApiSlice

// returns the query result object
export const selectUsersResult = usersApiSlice.endpoints.getUsers.select()

// Creates memoized selector
const selectUsersData = createSelector( selectUsersResult,usersResult => usersResult.data)

//getSelectors creates these selectors and we rename them with aliases using destructuring
export const {
    selectAll: selectAllUsers,
    selectById: selectUserById,
    selectIds: selectUserIds
    // Pass in a selector that returns the posts slice of state
} = usersAdapter.getSelectors(state => selectUsersData(state) ?? initialState)

and she userslice.js

我的目标是添加 authslice 使用自定义还原器,当我致电登录时,该状态将被初始化,这是我尝试做的。

import { createSlice,  createSelector,createEntityAdapter } from "@reduxjs/toolkit";
const usersAdapter = createEntityAdapter()
const initialState = usersAdapter.getInitialState({
    user: null,
    is_logged_in:false,
    token:null
  })

  
  export const loginSlice = createSlice({
    initialState,
    name: 'userSlice',
    reducers: {
      logout: () => initialState,
      setUser: (state, action) => {
        state.user = action.payload.user,
        state.token = action.payload.token,
        state.is_logged_in = true
      },
    },
  });
  
  export default loginSlice.reducer;
  
  export const { logout, setUser } = loginSlice.actions;

但是我很困惑如何将其称为还原器。

Hello I have created a application that working fine to create user, fetch users, add post, reaction, delete a post. now I want to add AUTH to my application. but I m confused how to persist the state, add reducers, actions and initialize a state like this.

I am sharing some code here:

import { LOCAL_LOGIN, LOGIN, SIGN_OUT} from '../types';
const initialState = {
    user:null,
    token:null,
    is_logged_in:false
};
const LoginReducer = (state = initialState, action) => {
    switch(action.type) {
        case LOGIN:
            return {
                ...state,
                user:action.payload.data,
                token:action.payload.access_token,
                is_logged_in:true,
            };
        case LOCAL_LOGIN:
            return{
                ...state,
                user:action.payload.data,
                token:action.payload.access_token,
                is_logged_in:true,
            }
        case SIGN_OUT:
            return{
                ...state,
                user:null,
                is_logged_in:false
            }
        default:
            return state;
        }
    }
export default LoginReducer;

this was working fine. Here is my new code

/// apiSlice.js

import {
    createApi,
    fetchBaseQuery
  } from "@reduxjs/toolkit/query/react";
  
  export const apiSlice = createApi({
    reducerPath: "api",
    baseQuery: fetchBaseQuery({
      baseUrl: "https://ab91-203-82-55-110.ngrok.io/"
    }),
    tagTypes: ['Post', 'User'],
    endpoints: builder => ({})
  });

/// postSlice.js

import {
    createSelector,
    createEntityAdapter
} from "@reduxjs/toolkit";
import { apiSlice } from "../api/apiSlice";
const usersAdapter = createEntityAdapter()
const initialState = usersAdapter.getInitialState()
export const usersApiSlice = apiSlice.injectEndpoints({
    endpoints: builder => ({
        getUsers: builder.query({
            query: () => '/users',
            transformResponse: responseData => {
                return usersAdapter.setAll(initialState, responseData)
            },
            providesTags: (result, error, arg) => [
                { type: 'User', id: "LIST" },
                ...result.ids.map(id => ({ type: 'User', id }))
            ]
        }),
        getUserByUserId: builder.query({
            query: id => `users/${id}`,
        })
    })
})

export const { useGetUsersQuery, useGetUserByUserIdQuery } = usersApiSlice

// returns the query result object
export const selectUsersResult = usersApiSlice.endpoints.getUsers.select()

// Creates memoized selector
const selectUsersData = createSelector( selectUsersResult,usersResult => usersResult.data)

//getSelectors creates these selectors and we rename them with aliases using destructuring
export const {
    selectAll: selectAllUsers,
    selectById: selectUserById,
    selectIds: selectUserIds
    // Pass in a selector that returns the posts slice of state
} = usersAdapter.getSelectors(state => selectUsersData(state) ?? initialState)

and same has userSlice.js

my goal is to add AuthSlice with custom reducers and when I call login then the state will be initialize , Here is what I tried to do.

import { createSlice,  createSelector,createEntityAdapter } from "@reduxjs/toolkit";
const usersAdapter = createEntityAdapter()
const initialState = usersAdapter.getInitialState({
    user: null,
    is_logged_in:false,
    token:null
  })

  
  export const loginSlice = createSlice({
    initialState,
    name: 'userSlice',
    reducers: {
      logout: () => initialState,
      setUser: (state, action) => {
        state.user = action.payload.user,
        state.token = action.payload.token,
        state.is_logged_in = true
      },
    },
  });
  
  export default loginSlice.reducer;
  
  export const { logout, setUser } = loginSlice.actions;

but i am confused how can i call there reducers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情话已封尘 2025-02-18 20:43:47

这很旧,但是如果有人找到这个。 进行此操作的方式

这就是您在rtk-Query API中

export const api = createApi({
  reducerPath: 'OIS-API',
  baseQuery: fetchBaseQuery({
    baseUrl: `${base_url}`,
    credentials: 'include',
    extractRehydrationInfo(action, { reducerPath }) {
      if (action.type === REHYDRATE) {
        return action.payload[reducerPath];
      }
    },
    prepareHeaders: (headers, { getState }) => {
      const token =
       const token = getState().auth.token;
      if (token) {
        headers.set('authentication', `Bearer ${token}`);
      }
      return headers;
    },
  }),
  tagTypes: ['data'],
  endpoints: (builder) => ({
    signInWithgoogle: builder.mutation({
      omitted
     })

,然后在您的auth slice中

extraReducers: (builder) => {
    builder.addMatcher(
      api.endpoints.signInWithgoogle.matchFulfilled,
      (state, { payload }) => {
          state.token = payload.token;
          state.user = payload.user;
          state.isLoggedIn = true;
      }
    );
  },

更多信息

您将令牌添加到每个HTTP请求中。

this is very old but in case anyone finds this. this is how you go about this

in your rtk-query API

export const api = createApi({
  reducerPath: 'OIS-API',
  baseQuery: fetchBaseQuery({
    baseUrl: `${base_url}`,
    credentials: 'include',
    extractRehydrationInfo(action, { reducerPath }) {
      if (action.type === REHYDRATE) {
        return action.payload[reducerPath];
      }
    },
    prepareHeaders: (headers, { getState }) => {
      const token =
       const token = getState().auth.token;
      if (token) {
        headers.set('authentication', `Bearer ${token}`);
      }
      return headers;
    },
  }),
  tagTypes: ['data'],
  endpoints: (builder) => ({
    signInWithgoogle: builder.mutation({
      omitted
     })

then in your auth slice

extraReducers: (builder) => {
    builder.addMatcher(
      api.endpoints.signInWithgoogle.matchFulfilled,
      (state, { payload }) => {
          state.token = payload.token;
          state.user = payload.user;
          state.isLoggedIn = true;
      }
    );
  },

more info Simulating Axios-like interceptors with a custom base query

you are adding the token to every HTTP request to the header.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文