react-native - React Native / Redux Toolkit 状态渲染总是落后一步
问题描述
我在使用 React Native 构建的应用程序中遇到了一些状态管理问题,所以我决定尝试 Redux-Toolkit。在 YouTube 上观看了一些教程后,我能够实现我需要的功能。不幸的是,似乎当我使用调度为变量设置新状态时,状态总是落后一步/状态。例如,根据我的代码,变量“term”的初始值为“spring”。共有三个按钮(春季、夏季和秋季)。如果我点击“summer”,一个警报会显示“spring”,这是初始值,如果我随后点击三个按钮中的任何一个,就会显示“summer”(这是之前的状态)。显示的状态始终是之前的状态。我的代码逻辑有问题吗?基本上,这三个按钮将用于根据学期/学期更改 SQLite 查询过滤器。请在下面查看我在代码中遇到的问题的重新创建。谢谢你
TermSlice.js
import { createSlice } from "@reduxjs/toolkit";
export const termSlice = createSlice({
name: "termChanger",
initialState: {
term: 'Spring'
},
reducers: {
setTerm: (state, action) => {
state.term = action.payload;
}
}
});
export const { setTerm } = termSlice.actions;
export default termSlice.reducer;
Store.js
import { configureStore } from "@reduxjs/toolkit";
import termSlice from "./TermSlice";
export default configureStore({
reducer: {
termChanger : termSlice
},
});
主页.js
import React from "react";
import { StyleSheet, View, Button, Text} from "react-native";
import { StatusBar } from "expo-status-bar";
import {useSelector, useDispatch } from "react-redux"
import { setTerm } from "../redux/TermSlice";
export default function Home() {
const dispatch = useDispatch();
const { term } = useSelector((state) => state.termChanger);
return (
<View style={styles.container}>
<Button onPress={() => {
alert(term);
}} title="Term">Term</Button>
<Button onPress={() => {
dispatch(setTerm("Spring"));
alert(term);
}} title="Spring">Spring</Button>
<Button onPress={() => {
dispatch(setTerm("Summer"));
alert(term);
}} title="Summer">Summer</Button>
<Button onPress={() => {
dispatch(setTerm("Fall"));
alert(term);
}} title="Fall">Fall</Button>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});
应用程序.js
import React from "react";
import { Provider } from "react-redux"
import store from "./src/redux/Store";
import Home from "./src/screens/Home";
export default function App() {
return (
<Provider store={store}>
<Home />
</Provider>
);
}
解决方案
dispatch(setTerm("Spring"))
动作和alert(term)
函数都在同一个渲染周期中调用,所以alert(term)
在.term
dispatch
你的useSelector
钩子正在更新。您可以alert
通过使用useEffect
响应值变化的钩子来使用新值term
。
或者只是坚持你的“期限”按钮。此按钮将获得正确的值,因为它也不会更改term
它正在显示的值。
export default function Home() {
const dispatch = useDispatch();
const term = useSelector((state) => state.termChanger.term);
useEffect(() => {
alert(term);
}, [term]);
return (
<View style={styles.container}>
<Button onPress={() => alert(term)} title="Term">
Term
</Button>
<Button onPress={() => dispatch(setTerm("Spring"))} title="Spring">
Spring
</Button>
<Button onPress={() => dispatch(setTerm("Summer"))} title="Summer">
Summer
</Button>
<Button onPress={() => dispatch(setTerm("Fall"))} title="Fall">
Fall
</Button>
<StatusBar style="auto" />
</View>
);
}
推荐阅读
- java - 使用最新版本 Lucene 的示例
- flutter - 在 Flutter 中到达图像时打破文本行?
- javascript - 如何检查变量 null 以及如果它是数组然后检查长度
- android - RetroFit 只映射了一半的对象 Android studio
- javascript - 我如何通过反应动态地将道具作为变量分配给我自己在 scss/css 中的颜色托盘中的颜色?
- splunk - Splunk 查询根据同一索引中的其他事件过滤掉
- flutter - 如何解决飞镖的未来?
- jmeter - Jmeter停止当前的迭代问题
- python-3.x - 如何操作 CSV。Jupyter Notebook 上的文件
- reactjs - 如何使用 mobx-react-lite 使子组件对 mobx 中的状态变化做出反应