【问题标题】:useSelector() return undefineduseSelector() 返回未定义
【发布时间】:2021-07-03 18:19:46
【问题描述】:

我只是学习 react-native 基础,在使用 redux 时,我遇到了 useSelector 的问题,这是我的一些代码

这里是 store 组件

//store.js
    initState = {
        loginStatus: false,
    }
    const LoginAction = (state = {initState}, action) => {
        if (action.type == 'changeLogin') {
            return { loginStatus:!state.loginStatus }
        }
        return state
    }
    const store = createStore(LoginAction, composeWithDevTools());
    export default store

这里是登录功能

function LoginScreen({ navigation, props }) {
 
 

     const dispatch = useDispatch()
      const Login = useSelector(state => {
        return state.LoginStatus
      })
    
      function getLogin() {
        return Login
      }
      function handleLogin() {
        dispatch({ type: 'changeLogin' })
      }
      console.log('Login ' + Login) // it return undefined

我试过这个方法useSelector state returns undefined (React-Redux)但是没用! 这是发生的截图

但是当我将它添加到登录按钮时,它返回 true,然后继续未定义

<Formik
        validateOnMount
        validationSchema={loginValidationSchema}
        initialValues={{ email: '', password: '' }}
        onSubmit={
          () => {
            handleLogin()
            console.log('When submit ' + Login) // true then undefined
            SetTimer();
          }
          // () => navigation.navigate('Login')
        }
      >

请帮忙,非常感谢

【问题讨论】:

  • 我对 Formik 不熟悉,但它会在幕后的 onSubmit 处理程序中阻止默认吗?因为如果不是,则意味着您的浏览器窗口会刷新,失去其整个状态。
  • 我觉得应该是const LoginAction = (state = initState)而不是const LoginAction = (state = {initState})
  • 关于formik防止默认stack
  • 嘿它工作!!!! @WebbH,但为什么????????
  • 我对 formik 真的不太了解,但我将它全部刷新,因为当我在 formik 中记录一个变量时,它会循环

标签: javascript reactjs react-native redux react-redux


【解决方案1】:

您的选择器中的大小写错误。应该是return state.loginStatus。此外,您的LoginAction 在技术上是一个reducer,而不是一个动作。

const Login = useSelector(state => {
  return state.loginStatus
})

编辑:reducer 中的另一个问题是初始状态有 initState 作为对象中的顶级键,而意图只是为了直接分配它:

const LoginAction = (state = initState, action) = {
  // reducer code here
}

【讨论】:

  • 是的,我会解决这个问题,但是当我将state={initState} 更改为state=initState 时问题就解决了,你能告诉我发生了什么吗?我只是学习 react-native 所以我很好奇
  • state = {initState} 表示state = { initState: { loginStatus: false } }。我假设您不希望 initState 实际上成为您所在州的顶级密钥。 state = initState 做你想做的事:state = { loginStatus: false }
  • 所以如果我想调用它,我会使用state.initState.loginStatus 或其他什么?我只是好奇如果我使用{ } 符号如何使用
  • 是的,没错。不过,这似乎不是您想要的!
  • 一开始它显示为假,但是当我点击按钮时它显示错误,就像这样ibb.co/Bnw5pQq。我该如何解决才能使其与state = { initState: { loginStatus: false } } 一起使用,是的,这不是我的意图,但我只是想更深入地了解redux,请帮助,非常感谢
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2022-11-16
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多