#javascript #reactjs #typescript #redux #socket.io
Вопрос:
Это мой код:
export const Wrapper = ({ children }) => {
const authState = useAppSelector((state) => state.auth);
const dispatch = useAppDispatch();
const { clientsState, setClientsState } = useContext(ClientsContext);
const token = getAuthenticationToken();
// Configure socket
useEffect(() => {
if (authState.socket) return;
const socket: SocketIOClient.Socket = WebsocketClient.connect('...', token);
dispatch(setAuthState({ ...authState, socket, isAuthenticated: true }));
});
});
authSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { IAuthState } from '../../types';
const initialState: IAuthState = {
isAuthenticated: false,
profile: null,
socket: null,
};
export const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
setAuthState(state, action: PayloadAction<IAuthState>) {
state = action.payload;
},
},
});
export const { setAuthState } = authSlice.actions;
export const authReducer = authSlice.reducer;
Я пытаюсь передать сокет в redux, так как позже мне нужно будет вызвать различные методы для него. Но при этом я получаю эту ошибку:
A non-serializable value was detected in an action, in the path: `payload.socket`. Value:
Object { io: {…}, nsp: "/", json: {…}, ids: 0, acks: {}, receiveBuffer: [], sendBuffer: [], connected: false, disconnected: true, flags: {}, … }
Take a look at the logic that dispatched this action:
Object { type: "auth/setAuthState", payload: {…} }
(See https://redux.js.org/faq/actions#why-should-type-be-a-string…t-least-serializable-why-should-my-action-types-be-constants)
(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)
Что я понимаю. Это приводит меня сюда, и объяснение имеет смысл. Мне нужно добавить исключение в конфигурацию магазина.
Мой вопрос в том, как мне это сделать? Где я могу получить эти данные?
configureStore({
//...
middleware: getDefaultMiddleware({
serializableCheck: {
// Ignore these action types
ignoredActions: ['your/action/type'],
// Ignore these field paths in all actions
ignoredActionPaths: ['meta.arg', 'payload.timestamp'],
// Ignore these paths in the state
ignoredPaths: ['items.dates'],
},
}),
}) // from docs
Комментарии:
1. Не было бы лучшей идеей держать розетку в своем торце? Состояние Redux не предназначено для хранения таких объектов, и вы не будете знать, какие расширения сломаются позже, если вынудите это сделать.
2. Я дам ему прочитать