javascript - React Redux 操作未调度,但请求成功

标签 javascript reactjs redux fetch

我正在尝试对我的项目实现身份验证,正如标题所示,它注册了用户,但未调度操作。我有几乎相同的操作来获取数据,它可以工作,调度操作。是函数:

export const signIn = data => dispatch => {
  dispatch({ 
    type: SIGN_UP 
    })
  fetch(API_URL+'/register', { 
   method: 'POST',
   headers: {
      'content-type': 'application/json'
      },
   body: JSON.stringify(data),
    })
      .then(response => response.json())
      .then(message => dispatch({
         type: SIGN_UP_SUCCESS, payload: message
         }))
      .catch(error => dispatch({
        type: SIGN_UP_FAILED, payload: error
      }))
}

reducer :

export const authReducer = (state = initialState, action) => {
  switch(action.type) {
    case SIGN_UP: 
      return {
        ...state,
        loading: true
      }
    case SIGN_UP_SUCCESS: 
      return {
        ...state,
        loading: false,
        message: action.payload
      }
    case SIGN_UP_FAILED:
      return {
        ...state,
        loading: false,
        error: action.payload
      }
    default: 
      return state

  }
}

连接方法:

export default connect(null, { signIn })(RegisterForm);

Register Form组件代码(只是为了满足Stackoverflow的愿望):

import React, { Component } from 'react';
import { connect } from 'react-redux';

import { Form, Button, Message, Field } from 'semantic-ui-react';

import validator from 'email-validator';

import { signUp } from '../../actions/authActions';


class RegisterForm extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      data: {
        username: '',
        name: '',
        email: '',
        password: '',
        city: '',
        address: ''
      },
      errors: {}
    }
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  

  handleChange = e => {
    this.setState({
        ...this.state,
        data: { ...this.state.data, [e.target.name]: e.target.value}
    })
  }

  handleSubmit = e => {
    console.log(this.state.data)
    e.preventDefault();
    const errs = this.validate(this.state.data);
    this.setState({
      errors: errs
    });
    if(Object.keys(this.state.errors).length === 0) {
      this.props.signUp(this.state.data)
    }
  }

  validate = data => {
    const errors = {};

    if(!data.username) errors.username = 'Username is required';
    if(!data.name) errors.name = 'Name is required';
    if(!data.email) errors.email = 'Email is required';
    if (!validator.validate(data.email)) errors.email = "Invalid email";
    if(!data.password) errors.password = 'Password is required';
    if(!data.city) errors.city = 'City is required';
    if(!data.address) errors.address = 'Address is required'

    return errors
   }

render() {
  const { errors, data } = this.state
     return <Form onSubmit={this.handleSubmit}>
                <Form.Field>
                <label>Username</label>
                <input 
                placeholder='Username'
                name="username"
                type="text"
                onChange={this.handleChange}
                value={this.state.data.username}
                 />
                 </Form.Field>
                 {errors.username && <Message error header={errors.username}/>}
             
                <Form.Field>
                <label>Name</label>
                <input 
                placeholder='Name'
                name="name"
                type="text"
                onChange={this.handleChange}
                value={this.state.data.name} 
                 />
                 </Form.Field>
                 {errors.name && <Message error header={errors.name}/>}
             
                <Form.Field>
                <label>Address</label>
                <input 
                placeholder='Address'
                name="address"
                type="text"
                onChange={this.handleChange}
                value={this.state.data.address} 
                 />
                 </Form.Field>
                 {errors.address && <Message error header={errors.address}/>}


                <Form.Field>
                <label>City</label>
                <input 
                placeholder='City'
                name="city"
                type="text"
                onChange={this.handleChange}
                value={this.state.data.city} 
                 />
                 </Form.Field>
                 {errors.city && <Message error header={errors.city}/>}

                 <Form.Field>
                <label>Email</label>
                <input 
                placeholder='Email'
                name="email"
                type="email"
                onChange={this.handleChange}
                value={this.state.data.email}
                 />
                 </Form.Field>
                 {errors.email && <Message error header={errors.email}/>}

                  <Form.Field>
                <label>Password</label>
                <input 
                placeholder='Password'
                name="password"
                type="password"
                onChange={this.handleChange}
                value={this.state.data.password} 
                 />
                 </Form.Field>
                 {errors.password && <Message error header={errors.password}/>}

              <Button type='submit'>Register</Button>
        </Form>
  }
}

export default connect(null, { signUp })(RegisterForm);

最佳答案

您的代码似乎没问题,请确保您的 redux-devtools 已正确实现。

const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), applyMiddleware(thunk)) // [, rest of middlewares]

关于javascript - React Redux 操作未调度,但请求成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50323193/

相关文章:

javascript - 如何在 React 中突出显示页面滚动上的导航栏链接

javascript - 在 React 组件中使用 constructor 和 state = {} 声明状态有什么区别?

javascript - react-table 在行单击上添加引用

javascript - 如何只更新关联数组中嵌套对象的一个​​特定属性

javascript - redux reducer 在过滤状态时返回空数组

javascript - 如何将此 JavaScript 应用于所选图像?

javascript - 旋转 div 但防止在窗口边界处溢出

javascript - 如何在不复制 javascript 功能的情况下创建多个音频播放器(每个播放器包含不同的歌曲)?

javascript - 在 JS 中转换 OHLC 中的连续股票数据(开盘价、最高价、最低价、收盘价)

react-native - 使用 React Native 和 Redux 实现 'like tweet' 功能的更好方法