繁体   English   中英

react-native 中的 UseSelector 返回未定义,但 redux 中的变量已更新

[英]UseSelector in react-native return undefined but variable in redux get updated

我试图使用 UseSelector 在 redux 中获取数据,但它总是返回未定义,但是当我尝试记录我想在 redux 中获取的 console.log 变量时,它会被更新,但是当我尝试控制台记录 useSelector 时,它会返回不明确的

代码还原:

export const EXCHAHNGETOSECOND = 'EXCHANGETOSECOND'

export const exchangetosecwork = (hour,minute,second) =>({
    type:EXCHAHNGETOSECOND,
    payloadhourwork : hour,
    payloadminutework : minute,
    payloadsecondwork : second
})

let initialState ={
    resultWorkinSecond : 0
}

export const mainReducer = (state=initialState, action) =>{
    switch (action.type) {
        case EXCHAHNGETOSECOND:
            const hourTosecond = action.payloadhourwork * 3600
            const minuteTosecond = action.payloadminutework * 60
            const res = hourTosecond+minuteTosecond+action.payloadsecondwork
            state.resultWorkinSecond = res
            console.log(state.resultWorkinSecond);
            return state.resultWorkinSecond
        default:
            return state
    }
}

export default mainReducer

存储还原:

import { createStore } from "redux";
import mainReducer from "./redux";
import AsyncStorage from '@react-native-async-storage/async-storage';
import { persistStore, persistReducer } from 'redux-persist'


const persistConfig={
    key:'root',
    storage:AsyncStorage,
};

const persistedReducer = persistReducer(persistConfig,mainReducer)

export default() => {
    let store = createStore(persistedReducer)
    let persistor = persistStore(store)
    return{ store, persistor }
}

myConsole 日志测试:

 const resWorkinSec = useSelector((state)=>state.resultWorkinSecond)
    
    <Pressable onPress={()=>{
                            dispatch(exchangetosecwork(hour,minute,second))
                            console.log(resWorkinSec)
                        }}>

[控制台日志结果1

您的减速器有多个错误:

  • 它做一个分配,改变状态。 这在旧版 Redux 减速器中是不允许的,但仅在使用createSlice的现代 Redux 中
  • return state.resultWorkinSecond然后甚至更改完整的状态结构。

正确的遗留 Redux 代码如下所示:

export const mainReducer = (state=initialState, action) =>{
    switch (action.type) {
        case EXCHAHNGETOSECOND:
            const hourTosecond = action.payloadhourwork * 3600
            const minuteTosecond = action.payloadminutework * 60
            const res = hourTosecond+minuteTosecond+action.payloadsecondwork
            return { ...state, resultWorkinSecond: res }
        default:
            return state
    }
}

综上所述,这是自 2019 年以来我们不再推荐的旧式 Redux。它更复杂,而且容易出错。 大约是现代 Redux 代码的 4 倍。 现代 Redux 不使用 switch..case reducer、ACTION_TYPES、不可变的 reducer 逻辑(就像你需要在这里做的那样)、 createStore等。

我强烈建议你暂时放下你正在做的事情并阅读官方的 Redux 教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM