0

我正在尝试将 Primereact 连接到我的 django 后端项目,使用 restframework 和 corsheader 来连接两者,但在尝试获取或传递数据时我不断收到此错误。

警告:失败的道具类型:道具addLead在 中标记为必填LeadsForm,但其值为undefined.Uncaught TypeError: _this.props.addLead is not a function LeadsForm.js:24

我的行动文件

        import axios from 'axios';

        import { GET_LEADS, ADD_LEAD } from './types'


        export const getLeads = () => dispatch => {
            axios`enter code here`
            .get("http://127.0.0.1:8000/api/leads/")
            .then(res => {
                dispatch({
                    type: GET_LEADS,
                    payload: res.data
                });
            }).catch(err => console.log(err));
        };

        // ADD LEADS
        export const addLead = lead => dispatch => {
            axios
            .post("http://127.0.0.1:8000/api/leads/", lead)
            .then(res => {
                dispatch({
                    type: ADD_LEAD,
                    payload: res.data
                });
            }).catch(err => console.log(err));
        }

潜在客户表格文件

    import React, { Component } from 'react'
    import { connect } from 'react-redux';
    import PropTypes from 'prop-types';
    import { addLead } from '../actions/leads';
    import {InputTextarea} from 'primereact/inputtextarea';
    import {InputText} from 'primereact/inputtext';
    import { Button } from 'primereact/button';

    export class LeadsForm extends Component {
        state = {
            name: '',
            email: '',
            message: ''
        };
        static propTypes = {
          addLead: PropTypes.func.isRequired
        };
      onChange = e => this.setState({ [e.target.name]: e.target.value});

      onSubmit = e => {
          e.preventDefault();
          const { name, email, message } = this.state;
          const lead = { name, email, message };
          this.props.addLead(lead);
          this.setState({
            name: "",
            email: "",
            message: ""
          });

        };

        // onSubmit = e => {
        //   this.setState({
        //     name: "",
        //     email: "",
        //     message: ""
        //   });
        // };
        render() {
            const { name, email, message } = this.state;
            return (
                <div className="card card-w-title">
                <div className="p-grid ">
                   <h2>Add Lead</h2>
                   <form onSubmit={this.onSubmit}>
                     <div className="p-col-12">
                        <span className="p-float-label">
                          <InputText id="in"
                          name="name" 
                          value={name} 
                          onChange={this.onChange} size={50} />
                          <label htmlFor="in">Name</label>
                        </span>
                        </div>
                        <div className="p-col-12">
                        <span className="p-float-label">
                          <InputText id="in"
                          name="email" 
                          value={email} 
                          onChange={this.onChange} size={50}/>
                          <label htmlFor="in">Email</label>
                        </span>
                        </div>
                        <div className="p-col-12">
                        <span className="p-float-label">
                        <InputTextarea id="in" size={50} rows={5} cols={30}
                          name="message" 
                          value={message} 
                          onChange={this.onChange} />
                          <label htmlFor="in">Message</label>
                        </span>
                        </div>


                <Button type = "submit" value="Submit" label="Save" style={{marginBottom:'10px'}} className="p-button-raised" />
                {/* <button type="submit" className="btn btn-primary">
                  Submit
                </button> */}

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

    // LeadsForm.propTypes= {
    //   addLead: PropTypes.func
    // }

    export default connect(null, { addLead })(LeadsForm);

    reducer/leads.js

    import { GET_LEADS, ADD_LEAD } from '../actions/types';

    const initialState = {
        leads: []
    }

    export default function (state = initialState, action){
    switch(action.type){
        case GET_LEADS:
          return {
            ...state,
            leads: action.payload
          };
        case ADD_LEAD:
          return {
            ...state,
            leads: [...state.leads, action.payload]
          }
        default:
            return state;
        }
    }
    '
    reducer/index.js

   ' import { combineReducers } from 'redux';
    import leads from './leads';
    export default combineReducers({
        leads
    });

store.js

    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;   
4

1 回答 1

0

您正在执行组件的命名导出 ( export class ...) 和默认导出 ( export default ...) LeadsForm。默认导出将通过connect添加您的操作进行包装props,命名导出不会通过connect您的操作进行包装undefined

如果组件不通过就无法工作,connect您可能应该删除命名导出以减少混淆。

确认您正在LeadsForm作为默认导入进行导入。这很可能是您的问题。

于 2020-03-03T14:17:18.680 回答