我的反应应用程序中的消息如何解决这个问题

Posted

技术标签:

【中文标题】我的反应应用程序中的消息如何解决这个问题【英文标题】:message in my react app how to solve this 【发布时间】:2020-06-27 13:16:19 【问题描述】:

它一直在 react, redux 应用程序中向我显示此消息 我试图修复它,但没有任何效果,实际上我不知道我的代码有什么问题

未处理的拒绝(TypeError):props.setAlerts 不是函数

这是我的店

import  createStore, applyMiddleware  from 'redux';
import  composeWithDevTools  from 'redux-devtools-extension';
import thunk from 'redux-thunk';
import rootReducer from './reducers';

const initialState = ;

const middleware = [thunk];

const store = createStore(
  rootReducer,
  initialState,
  composeWithDevTools(applyMiddleware(...middleware))
);

export default store;

这是我的功能

import  SET_ALERT, REMOVE_ALERT  from './types';
import  v4 as uuidv4  from 'uuid';

export const setAlerts = (masg, alertType) => dispatch => 
  const id = uuidv4();
  dispatch(
    type: SET_ALERT,
    payload:  masg, alertType, id 
  );
;

这是我的减速器

import  SET_ALERT, REMOVE_ALERT  from '../actions/types';

const initialState = [];

export default function(state = initialState, action) 
  const  type, payload  = action;
  switch (type) 
    case SET_ALERT:
      return [...state, payload];
    case REMOVE_ALERT:
      return state.filter(alert => alert.id !== payload);
    default:
      return state;
  

这是我的动作类型

export const SET_ALERT = 'SET_ALERT';
export const REMOVE_ALERT = 'REMOVE_ALERT';

这是我要在其中使用我的功能的组件

import React,  Fragment, useState  from 'react';
import  Link  from 'react-router-dom';
import  connect  from 'react-redux';
import  setAlerts  from '../../actions/alert';

export const Register = props => 
  const [formData, setFormData] = useState(
    name: '',
    email: '',
    password: '',
    password2: ''
  );

  const  name, email, password, password2  = formData;

  const onChange = e =>
    setFormData( ...formData, [e.target.name]: e.target.value );

  const onSubmit = async e => 
    e.preventDefault();
    if (password !== password2) 
      props.setAlerts('Password dont match', 'danger');
     else 
      console.log('Succes');
    
  ;
  return (
    <Fragment>
      <section className='container'>
        <h1 className='large text-primary'>Sign Up</h1>
        <p className='lead'>
          <i className='fas fa-user'></i> Create Your Account
        </p>
        <form className='form' onSubmit=e => onSubmit(e)>
          <div className='form-group'>
            <input
              type='text'
              placeholder='Name'
              name='name'
              value=name
              onChange=e => onChange(e)
              required
            />
          </div>
          <div className='form-group'>
            <input
              type='email'
              placeholder='Email Address'
              name='email'
              value=email
              onChange=e => onChange(e)
            />
            <small className='form-text'>
              This site uses Gravatar so if you want a profile image, use a
              Gravatar email
            </small>
          </div>
          <div className='form-group'>
            <input
              type='password'
              placeholder='Password'
              name='password'
              minLength='6'
              value=password
              onChange=e => onChange(e)
            />
          </div>
          <div className='form-group'>
            <input
              type='password'
              placeholder='Confirm Password'
              name='password2'
              minLength='6'
              value=password2
              onChange=e => onChange(e)
            />
          </div>
          <input type='submit' className='btn btn-primary' value='Register' />
        </form>
        <p className='my-1'>
          Already have an account? <Link to='/login'>Sign In</Link>
        </p>
      </section>
    </Fragment>
  );
;


export default connect(null,  setAlerts )(Register);

【问题讨论】:

不是道具,是导入的。只需setAlerts('...') 我这样做是因为我使用 redux,所以它必须通过连接,然后将其作为道具传递给我的组件 这能回答你的问题吗? React Redux prop is undefined 与标记的副本一样,您正在执行命名导出和默认导出。这意味着如果您默认导入组件,它将具有connect HOC 提供的额外道具。如果以命名方式导入它,则不会。确保像 import Register from './path/to/Register' 一样导入它 非常感谢布赖恩这是问题 【参考方案1】:

试试这个:

const mapDispatchToProps = dispatch => 
    return 
      setAlerts : (masg, alertType) =>  dispatch(setAlerts (masg, alertType)) 
    



export default connect(null,mapDispatchToProps)(Register)

【讨论】:

它给了我这个错误 Unhandled Rejection (TypeError): props.setAlerts is not a function 你能做一个 console.log(props) 看看你得到了什么输出吗? 它给了我未定义的状态【参考方案2】:

使用 Redux 时,组件中不要这样导出。

更改如下:

export const Register = props => ...

到这里:

const Register = props => ...

您需要在 App.js 中修改此组件的导入。

更改如下:

import  Register  from '...';

到这里:

import Register from '...';

【讨论】:

以上是关于我的反应应用程序中的消息如何解决这个问题的主要内容,如果未能解决你的问题,请参考以下文章

聊天应用程序如何知道用户何时发送消息以重新呈现?

this.setState 不是函数,反应原生

如何根据 Discord.js 中的反应编辑消息(创建列表和切换页面)

单个 App 中的多个 RCTRootView

我如何检查安装在反应本机代码中的应用程序

如何从反应添加事件中获取线程回复的内容?