- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下切片:
export const authenticationSlice = createSlice({
name: 'authentication',
initialState: {
isFirstTimeLoading: true,
signedInUser: null
},
reducers: {
signOut: (state) => {
state.signedInUser = null
},
setUserAfterSignIn: (state, action: PayloadAction<SignInResult>) => {
// some logic...
state.signedInUser = {...}
}
},
extraReducers: builder => {
// Can I subscribe to signedInUser changes here?
}
})
有什么方法可以订阅的时候
signedInUser
更改(
setUserAfterSignIn
和
signOut
),内部
extraReducers
?
setUserAfterSignIn
我想在 axios 中添加一个拦截器,它使用用户的 accessToken 作为 Auth header 。
signedInUser
?
export const { signOut: signOutAction, setUserAfterSignIn: setUserAction } = authenticationSlice.actions
export const signInWithGoogleAccountThunk = createAsyncThunk('sign-in-with-google-account', async (staySignedIn: boolean, thunkAPI) => {
const state = thunkAPI.getState() as RootState
state.auth.signedInUser && await thunkAPI.dispatch(signOutThunk())
const googleAuthUser = await googleClient.signIn()
const signedInUser = await signInWithGoogleAccountServer({ idToken: googleAuthUser.getAuthResponse().id_token, staySignedIn })
thunkAPI.dispatch(setUserAction({ data: signedInUser.data, additionalData: { imageUrl: googleAuthUser.getBasicProfile().getImageUrl() } } as SignInResult))
})
export const signInWithLocalAccountThunk = createAsyncThunk('sign-in-with-local-account', async (dto: LocalSignInDto, thunkAPI) => {
const state = thunkAPI.getState() as RootState
state.auth.signedInUser && await thunkAPI.dispatch(signOutThunk())
const user = await signInWithLocalAccountServer(dto)
thunkAPI.dispatch(setUserAction({ data: user.data } as SignInResult))
})
export const signOutThunk = createAsyncThunk<void, void, { dispatch: AppDispatch }>('sign-out', async (_, thunkAPI) => {
localStorage.removeItem(POST_SESSION_DATA_KEY)
sessionStorage.removeItem(POST_SESSION_DATA_KEY)
const state = thunkAPI.getState() as RootState
const signedInUser = state.auth.signedInUser
if (signedInUser?.method === AccountSignInMethod.Google)
await googleClient.signOut()
if (signedInUser)
await Promise.race([signOutServer(), rejectAfter(10_000)])
.catch(error => console.error('Signing out of server was not successful', error))
.finally(() => thunkAPI.dispatch(signOutAction()))
})
最佳答案
Redux 实现了 flux architecture .
This structure allows us to reason easily about our application in a way that is reminiscent of functional reactive programming, or more specifically data-flow programming or flow-based programming, where data flows through the application in a single direction — there are no two-way bindings.
combineReducer
解决此问题。 .您不能确定
extraReducers
在
setUserAfterSignIn
之后执行 reducer 。
setUserAfterSignIn
中 reducer 。 setUserAfterSignIn: (state, action: PayloadAction<SignInResult>) => {
// some logic...
state.signedInUser = {...}
// update axios
}
const tokenSupplier = () => store.getState().signedInUser;
// ...
axios.interceptors.request.use(function (config) {
const token = tokenSupplier();
config.headers.Authorization = token;
return config;
});
function signInUser(state, action) {
state.signedInUser = {...}
}
function onUserSignedIn(state, action) {
// update axios interceptor
}
// ....
// ensure their order in the redux reducer.
setUserAfterSignIn: (state, action: PayloadAction<SignInResult>) => {
signInUser(state, action);
onUserSignedIn(state, action)
}
Given this architecture, What are my options if I have another slice that needs to react when signedInUser has changed?
A
和 reducer
RA
和一片
B
带 reducer
RB
.如果状态
B
取决于
A
表示 reducer
RB
应该在任何时候执行
A
变化。
RA
调用
RB
,但这引入了对
RB
的依赖.如果
RA
就好了可以发送类似
{ type: "stateAChanged", payload: stateA}
的 Action 以便其他切片可以监听该 Action ,但 reducer 无法分派(dispatch) Action 。您可以实现一个中间件,通过调度程序来增强操作。例如。
function augmentAction(store, action) {
action.dispatch = (a) => {
store.dispatch(a)
}
store.dispatch(action)
}
以便 reducer 可以分派(dispatch) Action 。
setUserAfterSignIn: (state, action: PayloadAction<SignInResult>) => {
// some logic...
state.signedInUser = {...}
action.dispatch({type : "userSignedIn": payload: {...state}})
}
但是这种方法不是标准方法,如果过度使用它,可能会引入导致调度中无限循环的循环。
RB
来自
RA
.您可以通过反转它来稍微管理它们之间的依赖关系。例如。
const onUserSignedIn = (token) => someOtherReducer(state, { type: "updateAxios", payload: token});
setUserAfterSignIn: (state, action: PayloadAction<SignInResult>) => {
// some logic...
state.signedInUser = {...}
onUserSignedIn(state.signedInUser.token)
}
现在您可以更换
onUserSignedIn
测试中的回调或使用调用其他注册回调的复合函数。
stateChangeMiddleware
.whenStateChanges((state) => state.counter)
.thenDispatch({ type: "text", payload: "changed" });
关于reactjs - 如何在 Redux Toolkit 中订阅 React 组件之外的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69053186/
Redux Toolkit 在尝试更新嵌套数组上的状态时给了我突变错误,我认为它是使用 immer 来解决这个问题并简化 reducer。 我的商店看起来像: 状态 -> 表单 -> 部分 我想向现有
DragonRuby Game Toolkit 中好像没有按钮的概念。如何创建按钮等 UI 组件? 最佳答案 按钮(和任何其他 UI 组件)可以解构为 primitives: 按钮有一个点击空间(通常
我正在使用 DragonRuby Game Toolkit 构建游戏。 如何检测一个对象(例如 Sprite)是否与另一个 Sprite 发生碰撞? 这是放置在屏幕上的两个 Sprite 。关于如何检
我正在通过 Template Toolkit 文件为 Template Toolkit 制作一些文档。目标是显示我正在使用的代码以及代码的输出。现在,我正在复制代码并将所有“%”字符替换为“%”字符串
我真的很喜欢 Template Toolkit并且喜欢它如何与 Catalyst 一起使用,但我想要更多“网络高级”工具包。 它可能只是 Web 对象的 *.tt 文件包,例如:Selector、Se
我需要为我正在处理的应用程序使用 Surface 项目模板,但我也想使用 MVVM Light Toolkit。我发现我可以“添加 | 新项目...”并为 View 、 View 模型或定位器选择一个
我们一直在使用 google identity toolkit 在我们的 alpha 和 beta 网站上登录,它非常流畅、简单且易于操作(Alpha 和 beta 用户获得了特定的登录说明)。当我们
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我想为 OpenCV 安装 CUDA,但当前的工具包 (7.5) 与 Visual Studio 2015 不兼容。我的问题是 - 安装 VS 2013 Express 是否允许我在 2015 年使用
我在添加 时遇到上述错误extraReducer 到我的 创建切片。 这是一个 react 原生应用程序 这是我的代码: export const login = createAsyncThu
使用 RTK Query , 如何使用获取功能来更新另一个切片的状态? 本质上,我试图让所有相关状态彼此相邻,因此在使用 useLazyGetQuery 查询数据后,我想使用结果并将其存储在现有切片中
我想使用模板工具包获取一个随机数。它不必特别随机。我该怎么做? 最佳答案 嗯,如果您没有(或无法导入)Slash::Test,您可能会遇到问题。 从 TT 的“vanilla”安装,您可以简单地使用
我的计算机上插入了两个屏幕,想知道 JFrame 或 Toolkit 中是否有检测窗口在哪个屏幕上的方法? 我有这个代码: java.awt.Toolkit.getDefaultToolkit().g
我正在使用 java 获取屏幕的尺寸和分辨率。当我运行以下代码时,我得到以下输出。 Toolkit toolkit = Toolkit.getDefaultToolkit (); Dimension
import { createSlice } from '@reduxjs/toolkit' export const countersSlice = createSlice({ name:
我有一个 azure 函数,我想在 IntelliJ IDEA 中本地运行和测试。我按照此处列出的所有步骤进行操作:https://learn.microsoft.com/en-us/azure/az
使用 VBA 我想将当前 word 文档的副本发送到 Web 服务?如何将当前文档作为字节数组获取? 我知道如何使用网络服务只是不确定如何将当前文件作为二进制对象发送? 附言从今天早上开始我一直在使用
如果要通过插件系统添加函数和/或虚拟方法,我想将自己的指令添加到Template Toolkit中。在不深入Template::Grammar的情况下,是否容易做到这一点?还有什么我可以在CPAN上学
如何使用 RTK 将整个数组分配给我的 intialState 对象? 做state = payload或 state = [...state, ...payload]不更新任何东西。 例子: con
我正在为我的网站使用谷歌翻译器。我想隐藏谷歌翻译器的顶部栏让我知道如何隐藏那个? 请在此处查看我的网站链接 http://www.rewords.com让我知道我要隐藏那个酒吧? 谢谢 最佳答案 通过
我是一名优秀的程序员,十分优秀!