【问题标题】:react-redux connect with Formik - Maximum call stack size exceededreact-redux 与 Formik 连接 - 超出最大调用堆栈大小
【发布时间】:2018-11-24 15:18:08
【问题描述】:

当我尝试将我的表单组件连接到 redux 时,我得到了一个无限循环。 如果它不令人沮丧会很有趣,因为代码今天早些时候工作,而现在在我恢复 1 次提交后它就没有了。

代码几乎相同,并且 connect()() 有效,并且我有 signUserUp 函数可作为 prop 使用。我删除了 node_modules 和 package-lock 以防万一,然后重新安装,还是一样。

Signup.js

import { connect } from "react-redux";
import signupActions from "../modules/signup";

function Signup() {
  return <BasicForm />
}

const BasicForm = () => (
  <Formik
    initialValues={{ email: "", password: "", confirmPassword: "" }}
    validationSchema={signupSchema}
    onSubmit={(values, actions) => {
      console.log("form data: ", values);
    }}
    render={({ values, errors, touched, isSubmitting, handleChange, handleBlur, handleSubmit }) => (
      <Container>
        <Form onSubmit={handleSubmit}>
          <Form.Input
            type="text"
            placeholder="Email"
            onChange={handleChange}
            onBlur={handleBlur}
            value={values.email}
            name="email"
          />
          {errors.email && touched.email && <div>{errors.email}</div>}

          <Form.Input
            type="password"
            placeholder="Password"
            onChange={handleChange}
            onBlur={handleBlur}
            value={values.password}
            name="password"
          />
          {errors.password && touched.password && <div>{errors.password}</div>}

          <Form.Input
            type="password"
            placeholder="Confirm Password"
            onChange={handleChange}
            onBlur={handleBlur}
            value={values.confirmPassword}
            name="confirmPassword"
          />
          {errors.confirmPassword && touched.confirmPassword && <div>{errors.confirmPassword}</div>}

          <Button primary type="submit" onSubmit={handleSubmit} disabled={isSubmitting}>
            Submit
          </Button>
        </Form>
      </Container>
    )}
  />
);

export default connect(
  null,
  signupActions
)(Signup);

当我添加连接时,我显然在这里得到了错误...

这是带有 redux 东西的单文件模块 signup.js

import api from '../utils/api';

const SIGN_UP = 'signup/SIGN_UP';

const initialState = {
  isAuthenticated: false,
  jwt: '',
  authError: '',
  formErrors: [],
};

export default (state = initialState, action = {}) => {
  switch (action.type) {
    case SIGN_UP:
      return { ...state, isAuthenticated: true, jwt: action.payload, authError: '', formErrors: [] };
    default:
      return state;
  }
};

export const signup = token => ({
  type: SIGN_UP,
  payload: token,
});

export const signUserUp = credentials => {
  return dispatch => api.post('auth/signup', credentials).then(token => dispatch(signup(token)));
};

rootReducer.js 我像这样导入该 signupReducer

import signupReducer from './modules/signup';

export default combineReducers({
  signup: signupReducer,
});

这是codesandbox 示例,至少在我尝试访问注册页面时可以看到错误。

【问题讨论】:

    标签: javascript reactjs redux react-redux formik


    【解决方案1】:

    问题在于您如何将signupActions(默认导出为reducer,而不是action creator)应用到connect

    工作示例(包括以下注释):https://codesandbox.io/s/4rook7ryv4


    注意事项:

    将您的containers 与您的components 分开:https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0

    将您的actionsreducerstypes 分开。

    我已对您的应用程序进行了重组,使其更易于理解/阅读。我强烈建议您使用下面列出的此流程和结构(或者,如果您希望组件/视图更加模块化,请将与该组件/视图相关的所有内容捆绑到一个文件夹中 - 如果您在一个大型团队中工作)。

    ├── build
    |   ├── css
    |   |   ├── main.[contenthash:8].css
    |   |   └── main.[contenthash:8].css.map
    |   ├── js
    |   |   ├── main.[hash].js
    |   |   └── main.[hash].js.map
    |   ├── media
    |   |   └── [hash].[ext]
    |   └── favicon.ico
    |   └── index.html
    |
    ├── public
    |   ├── favicon.ico
    |   └── index.html
    |
    ├── src
    |   ├── actions
    |   ├── components
    |   ├── containers
    |   ├── images
    |   ├── reducers
    |   ├── routes
    |   ├── store
    |   ├── styles
    |   ├── tests
    |   ├── types
    |   ├── utils
    |   ├── views
    |   ├── index.js
    |   ├── serviceWorker.js
    |   └── setupTests.js
    |
    ├── .eslintrc
    ├── .gitignore
    ├── README.md
    ├── package.lock.json
    └── package.json
    

    【讨论】:

    • 我想我从不喜欢将东西放在这样的文件夹中的想法:reducers、容器、组件、操作等,我更喜欢按身份验证或用户或帖子等功能进行分隔。感谢您的帮助和努力并为迟到的回复感到抱歉
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2015-10-24
    • 2015-12-29
    • 2017-12-27
    • 2020-12-06
    相关资源
    最近更新 更多