You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件传参报错:props.OnNewTicketCreation is not a function

React函数类型Props传递错误:props.OnNewTicketCreation is not a function

问题描述

在学习React时,传递函数类型props遇到报错:props.OnNewTicketCreation is not a function。状态管理类组件TicketControl将自定义函数handleAddingNewTicketToList通过props传递给NewTicketForm组件,但在NewTicketForm的表单提交处理函数中调用该props函数时触发错误,错误位置在NewTicketForm组件第11行的props.OnNewTicketCreation({语句处。

相关组件代码

TicketControl组件代码

import React from 'react';
import NewTicketForm from './NewTicketForm';
import TicketList from './TicketList';
import TicketDetail from './TicketDetail';

class TicketControl extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            formVisibleOnPage: false,
            mainTicketList: [],
            slectedTicket: null,
        };
    }

    handleClick = () => {
        if (this.state.selectedTicket != null) {
            this.setState({
                formVisibleOnPage: false,
                selectedTicket: null,
            });
        } else {
            this.setState(prevState => ({
                formVisibleOnPage: !prevState.formVisibleOnPage,
            }));
        }
    }

    handleAddingNewTicketToList = (newTicket) => {
        const newMainTicketList = this.state.mainTicketList.concat(newTicket); // .concat creates a duplicate, .push doesnt
        this.setState({
            mainTicketList: newMainTicketList,
            formVisibleOnPage: false,
        });
    }

    handleChangingSelectedTicket = (id) => {
        const selectedTicket = this.state.mainTicketList.filter(ticket => ticket.id === id)[0];
        this.setState({ selectedTicket: selectedTicket })
    }

    handleDeletingTicket = (id) => {
        const newMainTicketList = this.state.mainTicketList.filter(ticket => ticket.id !== id);
        this.setState({
            mainTicketList: newMainTicketList,
            selectedTicket: null
        });
    }

    render() {
        let currentVisibleState = null;
        let buttonText = null;

        if (this.state.selectedTicket != null) {
            currentVisibleState = <TicketDetail ticket={this.state.selectedTicket} onClickingDelete = {this.handleDeletingTicket}/>
            buttonText = "Return to Ticket List"
        }
        else if (this.state.formVisibleOnPage) {
            currentVisibleState = <NewTicketForm
                onNewTicketCreation={this.handleAddingNewTicketToList}
            />
            buttonText = "Return to Ticket List";
        }
        else {
            currentVisibleState = <TicketList ticketList={this.state.mainTicketList} onTicketSelection={this.handleChangingSelectedTicket} />
            buttonText = "Add Ticket"
        }

        return (
            <React.Fragment>
                {currentVisibleState}
                <button onClick={this.handleClick}>{buttonText}</button>
            </React.Fragment>
        );
    }

}

export default TicketControl;

NewTicketForm组件代码

import React from "react";
import PropTypes from "prop-types";
import { v4 } from "uuid";
import ReusableForm from "./ReusableForm";

function NewTicketForm(props) {


    function handleNewTicketFormSubmission(event) {
        event.preventDefault();
        props.OnNewTicketCreation({
            names: event.target.names.value,
            location: event.target.location.value,
            issue: event.target.issue.value,
            id: v4(),
            // numberOfStudents: parseInt(event.target.numberOfStudents.value) // How to parse numeric data
        });

    }


    return (
        <React.Fragment>
            <React.Fragment>
                <ReusableForm
                    formSubmissionHandler={handleNewTicketFormSubmission}
                    buttonText="Help!" />
            </React.Fragment>
        </React.Fragment>
    );
}

NewTicketForm.propTypes = {
    OnNewTicketCreation: PropTypes.func,
    // func1: PropTypes.func,
}

export default NewTicketForm;

解决方案

问题核心是props属性名大小写不匹配:

  • TicketControl中传递的props属性名为onNewTicketCreation(小写字母开头)
  • NewTicketForm中调用和定义propTypes时却使用了OnNewTicketCreation(大写字母开头)

只需统一属性名的大小写即可修复:

修改后的NewTicketForm关键代码

function handleNewTicketFormSubmission(event) {
    event.preventDefault();
    // 修正为小写开头的属性名
    props.onNewTicketCreation({
        names: event.target.names.value,
        location: event.target.location.value,
        issue: event.target.issue.value,
        id: v4(),
    });
}

// ...

// 同步修正propTypes中的属性名
NewTicketForm.propTypes = {
    onNewTicketCreation: PropTypes.func,
}

内容的提问来源于stack exchange,提问作者KwesiM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:35:00