无法使用Reactjs Toastr读取未定义的属性成功

时间:2018-11-02 22:29:23

标签: reactjs redux

我正在通过此链接https://www.npmjs.com/package/react-toastr中的 react toastr 使用我的react-redux表单。 我已安装为npm install --save react-toastr,并已按照要求导入

import { ToastContainer } from "react-toastr";
import { ToastMessage } from "react-toastr";
import { ToastMessageAnimated } from "react-toastr";
let container;

src / index.html ,我有 toastr.min.css和toastr.animate.css 文件

在RegisterPage Component上,当我按下面的代码单击“ Test Toastr”按钮时,一切正常

 <div className="container">
  <ToastContainer
    ref={ref => container = ref}
    className="toast-top-right"
  />
  <h1>
    React-Toastr
    <small>React.js toastr component</small>
  </h1>
  <div className="btn-container">
    <button
      className="primary"
      onClick={() =>
        container.success(`hi! Now is `, `success`, {
          closeButton: true,})
      }
    >
     Test Toastr
    </button>

  </div>

</div>

这是尝试做的事情。 表单注册成功后,我想显示Toastr消息警报,但显示错误

bundle.js:36689未捕获的TypeError:当我在下面的 user.service.js 文件中添加此代码时,无法读取未定义的属性'success'

setTimeout(()=>{ this.container.success(`hi! jmarkatti `, `success`, {closeButton: true,}); }, 400);

这是 user.service.js 文件

import config from 'config';
import { authHeader } from '../_helpers';

import { ToastContainer } from "react-toastr";
import { ToastMessage } from "react-toastr";
import { ToastMessageAnimated } from "react-toastr";
let container;

export const userService = {

    register,
    update,
};


function register(user) {
    const requestOptions = {
        method: 'POST',

return fetch(`../register.php`, requestOptions).then(handleResponse)
        .then(res => {

            if (res) {

//setTimeout(()=>{ this.container.success('Data added successfully'); }, 400);
setTimeout(()=>{ this.container.success(`hi! jmarkatti `, `success`, {closeButton: true,}); }, 400);
console.log('Data added suucessfully');
            }

            return user;
        });


}

下面的代码是 RegisterPage 组件。

import React from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';

import { userActions } from '../_actions';

import { ToastContainer } from "react-toastr";
import { ToastMessage } from "react-toastr";
import { ToastMessageAnimated } from "react-toastr";
let container;

class RegisterPage extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            user: {
                firstName: '',
                lastName: '',
                username: '',
                password: ''
            },
            submitted: false
        };

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

    handleChange(event) {
        const { name, value } = event.target;
        const { user } = this.state;
        this.setState({
            user: {
                ...user,
                [name]: value
            }
        });
    }

    handleSubmit(event) {
        event.preventDefault();

        this.setState({ submitted: true });
        const { user } = this.state;
        const { dispatch } = this.props;
        if (user.firstName && user.lastName && user.username && user.password) {
            dispatch(userActions.register(user));
        }
    }

    render() {
        const { registering  } = this.props;
        const { user, submitted } = this.state;
        return (
            <div className="col-md-6 col-md-offset-3">

                <h2>Test Toastr</h2>

 <div className="container">
  <ToastContainer
    ref={ref => container = ref}
    className="toast-top-right"
  />
  <h1>
    React-Toastr
    <small>React.js toastr component</small>
  </h1>
  <div className="btn-container">
    <button
      className="primary"
      onClick={() =>
        container.success(`hi! Jmarkatti `, `success`, {
          closeButton: true,})
      }
    >
     Test Toastr
    </button>

  </div>

</div>

                <form name="form" onSubmit={this.handleSubmit}>

// form input removed to reduce code

                    <div className="form-group">
                        <button className="btn btn-primary">Register</button>
                        {registering && 
                                         }

                    </div>
                </form>
            </div>
        );
    }
}

function mapStateToProps(state) {
    const { registering } = state.registration;
    return {
        registering
    };
}

const connectedRegisterPage = connect(mapStateToProps)(RegisterPage);
export { connectedRegisterPage as RegisterPage };

更新在这里

user.action.js 代码

function register(user) {
    return dispatch => {
        dispatch(request(user));

        userService.register(user)
            .then(
                user => { 

/*
                   dispatch(success());
                    history.push('/login');
                    dispatch(alertActions.success('Registration successful'));
*/

                },
                error => {
                    dispatch(failure(error.toString()));
                    dispatch(alertActions.error(error.toString()));
                }
            );
    };

user.reducer.js 代码

import { userConstants } from '../_constants';

export function registration(state = {}, action) {
  switch (action.type) {
    case userConstants.REGISTER_REQUEST:
      return { registering: true };
    case userConstants.REGISTER_SUCCESS:
      return {};
    case userConstants.REGISTER_FAILURE:
      return {};
    default:
      return state
  }
}

1 个答案:

答案 0 :(得分:0)

尝试一下

更改

   setTimeout(()=>{ this.container.success(`hi! jmarkatti `, `success`, {closeButton: true,}); }, 400);

收件人

    setTimeout(()=>{ 
            if(this.container){
                     this.container.success(`hi! jmarkatti `, `success`, {closeButton: true,}); 
             }
     }, 400);