2017-05-26 60 views
1

我已经使用-create-react-app安装了反应。我正在使用onSubmit()函数提交表单。从LoginRegister.js组件提交表单,下面是我的LoginRegister.js文件代码 -根据API反应显示消息js

import React from 'react'; 
import DefaultLayout from '../Layout/DefaultLayout'; 
import PropTypes from 'prop-types'; 
import { connect } from 'react-redux'; 
import { userSignupRequest } from '../actions/signupActions'; 



class LoginRegister extends React.Component { 
    constructor(props) { 
    super(props); 
     this.state = {first_name: '',last_name: '',email:'',password:'',c_password:'', phone_no:'',user_role:2, errmsg:''}; 
     //this.state = {about: ''}; 

     this.handleInputChange = this.handleInputChange.bind(this); 
     this.handleSubmit = this.handleSubmit.bind(this); 
    } 


    handleInputChange(event) { 
     this.setState({ [event.target.name]: event.target.value}); 
     } 

    handleSubmit(event) { 
     event.preventDefault(); 
     this.props.userSignupRequest(this.state); 
    } 

    render(){ 
     return (
      <DefaultLayout> 
       <section id="page-title"> 

        <div className="container clearfix"> 
         <h1>My Account</h1> 
         <ol className="breadcrumb"> 
          <li><a href="/">Home</a></li> 
          <li><a href="/">Pages</a></li> 
          <li className="active">Login</li> 
         </ol> 
        </div> 

       </section> 

       <section id="content"> 

        <div className="content-wrap"> 

         <div className="container clearfix"> 
          <div className="col_two_third col_last nobottommargin"> 


           <h3>Dont have an Account? Register Now.</h3> 

           <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde, vel odio non dicta provident sint ex autem mollitia dolorem illum repellat ipsum aliquid illo similique sapiente fugiat minus ratione.</p> 
           <p id="msg">{this.state.errmsg}</p> 
           <form id="register-form" name="register-form" className="nobottommargin" method="post" onSubmit={this.handleSubmit}> 

            <div className="col_half"> 
             <label htmlFor="register-form-name">First Name:</label> 
             <input type="text" id="register-form-firstname" name="first_name" value={this.state.first_name} className="form-control" onChange={this.handleInputChange} /> 
            </div> 

            <div className="col_half col_last"> 
             <label htmlFor="register-form-email">Last name:</label> 
             <input type="text" id="register-form-lastname" name="last_name" value={this.state.last_name} className="form-control" onChange={this.handleInputChange} required={true} /> 
            </div> 

            <div className="clear"></div> 

            <div className="col_half"> 
             <label htmlFor="register-form-email">Email Address:</label> 
             <input type="text" id="register-form-email" name="email" value={this.state.email} className="form-control" onChange={this.handleInputChange} required={true} /> 
            </div> 

            <div className="col_half col_last"> 
             <label htmlFor="register-form-repassword">Phone no.:</label> 
             <input type="text" id="register-form-phone" name="phone_no" value={this.state.phone_no} className="form-control" onChange={this.handleInputChange} /> 
            </div> 

            <div className="clear"></div> 

            <div className="col_half"> 
             <label htmlFor="register-form-password">Choose Password:</label> 
             <input type="password" id="register-form-password" name="password" value={this.state.password} className="form-control" onChange={this.handleInputChange} /> 
            </div> 

            <div className="col_half col_last"> 
             <label htmlFor="register-form-repassword">Re-enter Password:</label> 
             <input type="password" id="register-form-repassword" name="c_password" value={this.state.c_password} className="form-control" onChange={this.handleInputChange} /> 
            </div> 
            <input type="hidden" name="user_role" value={this.state.user_role} className="form-control" /> 
            <div className="clear"></div> 

            <div className="col_full nobottommargin"> 
             <button className="button button-3d button-black nomargin" id="reg-submit" name="register-form-submit" value="register">Register Now</button> 
            </div> 

           </form> 

          </div> 

         </div> 

        </div> 
       </section> 

      </DefaultLayout> 
     ) 
    } 
} 

LoginRegister.propTypes = { 
    userSignupRequest: PropTypes.func.isRequired  
} 

export default connect((state) => { return{} }, {userSignupRequest}) (LoginRegister); 

和行动/ signupActions文件中有下面的代码,在调用API和使用Reducer处理响应 -

import axios from 'axios'; 

export function userSignupRequest(userData){ 
     return dispatch => { 
      dispatch({"type":"CALL_START"}); 
      axios.post('../user/register', userData).then(response => { 
       dispatch({"type":"RECEIVE_RESPONSE", "payload":response.data}); 
      }).catch(error => { 
       dispatch({"type":"RECEIVE_ERROR", "payload":error}); 
      }); 
     } 

    } 

减速。 js有下面的代码 -

const reducer = (state={}, action) => { 
    switch(action.type){ 
     case "CALL_START" :{ 
      alert("Hi1"); 
      return {} 
      break; 
     } 
     case "RECEIVE_RESPONSE" : { 
      //return {...state, data:action.payload} 
      alert("Hi2"); 
      return {data:action.payload} 
      break; 
     } 
     case "RECEIVE_ERROR" : { 
      alert("Hi3"); 
      alert(JSON.stringify(action.payload)); 
      return {data:action.payload} 
      break; 
     } 

    } 

} 

export default reducer; 

API正在调用,我得到的响应正常,但在这里我不知道如何显示成功/错误在我的'LoginRegister.js'组件上根据响应发送r消息。

请帮我解决这个问题。

+0

您是否在使用提供程序,并且您是否使用了联合减速器组合了更多的减速器 –

+0

是的我正在使用“提供程序”,但是现在我不使用“combineReducers”。 – Atul

+0

您可以添加您的登录注册代码 –

回答

2

所以我会建议哟反对派做出一些改变

  1. 当您使用连接,那么你或许应该连接到调度的动作或直接通过不提供连接的第二个参数在组件中调用它

  2. 获取组件中的状态。为此,您可以使用mapStateToProps

  3. 你可能会想显示上注册一个适当的消息,你能做到这一点的形式userSignupRequest行动。

改变你的代码下面

UserSignUpRequest行动

import axios from 'axios'; 

export function userSignupRequest(userData){ 
     return dispatch => { 
      dispatch({"type":"CALL_START"}); 
      axios.post('../user/register', userData).then(response => { 
       dispatch({"type":"RECEIVE_RESPONSE", "payload":"Successfully Registered"}); 
      }).catch(error => { 
       dispatch({"type":"RECEIVE_ERROR", "payload":"Error Registering " + JSON.stringify(error)}); 
      }); 
     } 

    } 

登录登录注册

import {bindActionCreators} form 'redux'; 
class LoginRegister extends React.Component { 
    constructor(props) { 
    super(props); 
     this.state = {first_name: '',last_name: '',email:'',password:'',c_password:'', phone_no:'',user_role:2, errmsg:''}; 
     //this.state = {about: ''}; 

     this.handleInputChange = this.handleInputChange.bind(this); 
     this.handleSubmit = this.handleSubmit.bind(this); 
    } 


    handleInputChange(event) { 
     this.setState({ [event.target.name]: event.target.value}); 
     } 

    handleSubmit(event) { 
     event.preventDefault(); 
     this.props.userSignupRequest({...this.state}) 
    } 

    render(){ 
     console.log(this.props.registerMessage) 
     return (
      <DefaultLayout> 
       <section id="page-title"> 

        <div className="container clearfix"> 
         <h1>My Account</h1> 
         <ol className="breadcrumb"> 
          <li><a href="/">Home</a></li> 
          <li><a href="/">Pages</a></li> 
          <li className="active">Login</li> 
         </ol> 
        </div> 

       </section> 

       <section id="content"> 

        <div className="content-wrap"> 

         <div className="container clearfix"> 
          <div className="col_two_third col_last nobottommargin"> 


           <h3>Dont have an Account? Register Now.</h3> 

           <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde, vel odio non dicta provident sint ex autem mollitia dolorem illum repellat ipsum aliquid illo similique sapiente fugiat minus ratione.</p> 
           <p id="msg">{this.props.registerMessage}</p> 
           <form id="register-form" name="register-form" className="nobottommargin" method="post" onSubmit={this.handleSubmit}> 

            <div className="col_half"> 
             <label htmlFor="register-form-name">First Name:</label> 
             <input type="text" id="register-form-firstname" name="first_name" value={this.state.first_name} className="form-control" onChange={this.handleInputChange} /> 
            </div> 

            <div className="col_half col_last"> 
             <label htmlFor="register-form-email">Last name:</label> 
             <input type="text" id="register-form-lastname" name="last_name" value={this.state.last_name} className="form-control" onChange={this.handleInputChange} required={true} /> 
            </div> 

            <div className="clear"></div> 

            <div className="col_half"> 
             <label htmlFor="register-form-email">Email Address:</label> 
             <input type="text" id="register-form-email" name="email" value={this.state.email} className="form-control" onChange={this.handleInputChange} required={true} /> 
            </div> 

            <div className="col_half col_last"> 
             <label htmlFor="register-form-repassword">Phone no.:</label> 
             <input type="text" id="register-form-phone" name="phone_no" value={this.state.phone_no} className="form-control" onChange={this.handleInputChange} /> 
            </div> 

            <div className="clear"></div> 

            <div className="col_half"> 
             <label htmlFor="register-form-password">Choose Password:</label> 
             <input type="password" id="register-form-password" name="password" value={this.state.password} className="form-control" onChange={this.handleInputChange} /> 
            </div> 

            <div className="col_half col_last"> 
             <label htmlFor="register-form-repassword">Re-enter Password:</label> 
             <input type="password" id="register-form-repassword" name="c_password" value={this.state.c_password} className="form-control" onChange={this.handleInputChange} /> 
            </div> 
            <input type="hidden" name="user_role" value={this.state.user_role} className="form-control" /> 
            <div className="clear"></div> 

            <div className="col_full nobottommargin"> 
             <button className="button button-3d button-black nomargin" id="reg-submit" name="register-form-submit" value="register">Register Now</button> 
            </div> 

           </form> 

          </div> 

         </div> 

        </div> 
       </section> 

      </DefaultLayout> 
     ) 
    } 
} 


function mapStateToProps(state){ 
     return { 
     registerMessage: state.data 
     } 
} 
function mapDispatchToProps(dispatch) { 
     return bindActionCreators({userSignupRequest: userSignupRequest}, dispatch) 
} 
export default connect(mapStateToProps, mapDispatchToProps) (LoginRegister); 

减速

const initialState = { 
    data: '', 
    status: '' 
} 
const reducer = (state=initialState, action) => { 
switch(action.type){ 
case "CALL_START" :{ 
alert("Hi1"); 
return {} 
break; 
} 
case "RECEIVE_RESPONSE" : { 
//return {...state, data:action.payload} 
return {...state, data:action.payload} 
break; 
} 
case "RECEIVE_ERROR" : { 
alert(JSON.stringify(action.payload)); 
return { ...state, data:action.payload} 
break; 
} 
default: { 
return state 
} 
} 

} 

export default reducer; 
+0

如果您需要更多说明或帮助,请告知 –

+0

它在cosole上给出此错误 - >>>>>>>>>>>>> LoginRegister.js:198 Uncaught TypeError:无法读取Function.exports.default.userSignupRequest [as mapToProps]中未定义的 的属性“数据”(LoginRegister.js:198 )>>>>>>>>>>>>>>第198行是 - >>>>>>导出默认连接((状态)=> {返回{registerMessage:state.data}},{userSignupRequest})(登录登录注册); – Atul

+0

请确保您将此组件包装在提供程序中,如 ' {/ * component here * /}'并尝试更新的答案 –

1

But here I don't know how to show success/error message on my 'LoginRegister.js' component on th basis of response

订阅使用@connect状态。

更多

+0

我已经应用于LoginRegister。js ------ import'connect} from'react-redux'; this.state = {errmsg:''}; 下面这个文件的结尾........................ export default connect((state)=> {return {}},{userSignupRequest })(LoginRegister); ..................我在设置--- >>> this.setState({errmsg:“Hello to all .........”}) ; on reducer.js文件,但没有通过LoginRegister.js进行更新................... – Atul