ReactJS:当子组件调用父组件时,“this.props”不是一个函数

2023-12-23

我已经编写了这段代码,目前正在解决 onClick 事件中的错误。我有两个事件,子元素上的 onClick 事件和顶级父元素上的 onChange 事件。

预期的行为应该是更改 Container 组件中当前保存的 activeAccount 变量。为此,我在 AccountRow 组件上添加了一个 onClick 处理程序,该处理程序随后应调用顶级父级的 onChange 函数。

然而,该行

'this.props.onChange(this.props.account)',

in

handleClick: function(e) {
        this.props.onChange(this.props.account);
    },    

意味着使用参数“this.props.account”调用父函数,

给我这个错误:

Uncaught TypeError: this.props.onChange is not a function.

我最初认为这是一个范围问题,但我添加了

{...this.props}

在父容器中的每个子容器和嵌套子容器上 成分。因此,所有 props 都应该被传播到 AccountRow 组件。尽管如此,问题仍然存在。

    var ACCOUNTS = [
    {name: 'cash on hand'},
    {name: 'savings account'},
    {name: 'shared account'},
    {name: 'my second wallet'}
];

var TRANSACTIONS = [
    {date: '', name: 'Bananas', amount: 6, category: 'Groceries', account: 'cash on hand'},
    {date: '', name: 'Apples', amount: 2.50, category: 'Groceries', account: 'cash on hand'},
    {date: '', name: 'Cash withdrawal', amount: 250, account: 'savings account'}
];

var AccountRow = React.createClass({

    handleClick: function(e) {
        this.props.onChange(this.props.account);
    },

    render: function () {
        return (
            <li onClick = {this.handleClick}> {this.props.account}</li>
        )}
});

var AccountList = React.createClass({

    render: function () {

        var rows = [];
        this.props.accounts.map(function(each_account) {
            rows.push(
                <AccountRow 
                    account = {each_account.name} 
                    key = {each_account.name}
                    {...this.props}     
                />);
                      })
    return (
        <ul>
        {rows}
        </ul>
    )   
    }   
});


var NavBar = React.createClass({

    render: function () {
        return (
            <div id = 'account-tabs'>
                <h2> Accounts </h2>
                <AccountList 
                    accounts = {this.props.accounts} 
                    {...this.props} 
                />
            </div>
        )
    }
});

var TransactionRow = React.createClass({
    render: function (){
        var trans = this.props.transaction;

        return (
            <tr>
            <td>{trans.date}</td>
            <td>{trans.name}</td>
            <td>{trans.amount}</td>
            <td>{trans.account}</td>
            <td><a href = ''>edit</a></td>
            </tr>
        )
    }
});

var TransactionList = React.createClass ({                      
    render: function () {

        var activeaccount = this.props.activeAccount;

        var rows = [];
        this.props.transactions.map(function(each_transaction) {
            if (each_transaction.account == activeaccount) {

                /* Very strange behaviour
                if (each_transaction account == this.props.activeAccount) 
                DOES NOT WORK, I do not know why this is the case
                */

                rows.push(<TransactionRow transaction = {each_transaction} key = {each_transaction.name} />);
            }
            else {
                /*console.log(each_transaction.account);*/
            }     
        })
        return (
            <tbody>
            {rows}
            </tbody>
        )
    }
});

var TransactionsTable = React.createClass({
    render: function() {

        return (
            <div id = 'recent-transactions'>
            <h2>Recent Transactions for {this.props.activeAccount}</h2>
            <table>
                <tr>
                    <th>date</th>
                    <th>name</th>
                    <th>amount</th>
                    <th>account</th>
                    <th>edit </th>
                </tr>
                <TransactionList 
                    transactions = {this.props.transactions}
                    activeAccount = {this.props.activeAccount}
            />
            </table>
            </div>
        )
    }
});

var TransactionForm = React.createClass({
    render: function() {
        return (
            <div>
            <h2>Add Transaction </h2>
            <p>Transaction name</p>
            <input type = 'text' />
            <p>Price</p>
            <input type = 'number'/>
            <p>Category (optional) </p>
            <input type = 'text' />
            </div>
        )
    }
});


var ButtonMenu = React.createClass ({
    render: function () {
        return (
            <div>
            <button>Add Transaction</button>
            </div>
        )
    }
});

var Container = React.createClass({

    getInitialState: function (){
        return {
            activeAccount: ACCOUNTS[0].name
        };
    },

    setActiveAccount: function(dat) {
        this.setState({
            activeAccount: dat  
        });
    },

    render: function () {
        return (
            <div id = 'wrapper'>
            <NavBar 
                accounts = {ACCOUNTS}
                activeAccount = {this.state.activeAccount}
                onChange = {this.setActiveAccount}
                {...this.props}
            />
            <TransactionsTable 
                transactions = {TRANSACTIONS}
                activeAccount = {this.state.activeAccount}
            />
            <TransactionForm />
            <ButtonMenu />
            </div>
        );
    }
});


React.render(<Container />, document.body);

感谢您的时间。


问题是由map函数,你应该传入this for thisArg打电话时map:

this.props.accounts.map(function(each_account) {
  rows.push(
    <AccountRow 
      account = {each_account.name} 
      key = {each_account.name}
      {...this.props}     
    />);
 }, this);

然而,这会导致AccountRow有冗余变量,例如accounts and activeAccount。我认为你应该考虑只转移onChange功能:

 <AccountRow 
     account = {each_account.name} 
     key = {each_account.name}
     onChange = {this.props.onChange}
 />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReactJS:当子组件调用父组件时,“this.props”不是一个函数 的相关文章

随机推荐

  • 如何在打字稿中显示按钮点击验证

    我想显示对空字段的验证 为此我使用了以下方法 但它不起作用 任何人都可以建议我提供帮助吗 谢谢 我的模板
  • Objective-C 中的 MAXFLOAT

    最大浮动定义为 math h define MAXFLOAT 0x1 fffffep 127f 我有点难过我以前从未注意到这一点 这实际上说的是什么呢 我本来期望这样的事情 define MAXFLOAT 0xFFFFFFFF 1 这还能用
  • 将 perl 脚本转换为 vba

    我使用的 PC 不允许使用 perl 脚本 有没有什么工具可以将perl脚本转换为vba宏 或者是否有任何链接可以让我们获得 perl 语句的 vba 等效项 假设您可以访问一台可以运行 Perl 的机器 您可以尝试使用PAR Packer
  • 如何在 PHP 中抽象 mysqli 准备好的语句?

    我正在使用自己的类进行数据库查询 扩展 mysqli class iDatabase extends mysqli public errorMsg private totalQueries private stmt public funct
  • 在 odoo v9 中关闭向导后显示成功消息

    在 odoo 9 中关闭向导后显示成功消息的最佳解决方案是什么 右上角有小弹出窗口吗 这不是您问题的正确答案 但我遇到了同样的问题 问题是当用户单击向导上的提交按钮时 我必须显示 成功提交 消息 我已经这样做了作为我的解决方案 我已经做到了
  • 验证服务帐户以使用 JavaScript 客户端库调用 Google API

    我要实现JSON RPC从 localhost WAMP 环境 调用Google 融合表 API https developers google com fusiontables docs v2 getting started 以及其他一些
  • TinkerPop 中的 next() 意味着什么

    我目前正在阅读 TinkerPop3文档 http tinkerpop incubator apache org docs 3 0 1 incubating 我感到困惑的是我找不到任何解释next 例如 with next 或 w o ne
  • HBase 和 Hadoop/HDFS 的区别

    这是一个幼稚的问题 但我是 NoSQL 范式的新手 对此了解不多 因此 如果有人可以帮助我清楚地理解 HBase 和 Hadoop 之间的区别 或者给出一些可能帮助我理解区别的指示 到目前为止 我做了一些研究和记录 据我了解 Hadoop
  • Jooq 支持 Joda-Time 吗?

    我们正在寻找不同时区的日期时间支持 Hibernate 似乎支持 Joda 时间 不知道 JOOQ 是否也支持 jOOQ http www jooq org本身不支持 Joda Time 或任何其他第三方数据类型 但您可以轻松配置 jOOQ
  • 是否可以使用 INSERT 命令将数据插入到表的中间部分?

    例子 索引 一些数据 1 一些 数据1 3 一些数据3 4 一些 数据4 5 一些 数据5 我想做一个 INSERT 来添加 gt 2 一些 数据2 有没有 SQL 命令或某种方法可以做到这一点 edit 好的 也许如果我解释我想要完成的每
  • Eclipse 错误:未绑定类路径容器

    我制作项目后收到两条错误消息 在解决构建路径错误之前 无法构建项目 未绑定的类路径容器 项目 method test 中的 JRE 系统库 OSGi Minimum 1 2 我认为如果我弄清楚第二个错误 第一个错误就会消失 但是 我在 10
  • 如何使用附加信息(如参数)在java中创建自定义堆栈跟踪?

    我被分配了一项任务来创建自定义堆栈跟踪 例如某些指定函数的输出到日志文件 但我不仅需要使用类和方法名称 还必须输出参数及其值 这应该是一个单独的 jar 可以在任何 java 项目上运行 我什至不知道这样的事情是否可能 更不用说从哪里开始了
  • 对于不引用可执行文件的命令,相当于“which”的是什么?

    我试图找出特定命令是如何定义的 我已经检查了所有位置 PATH并且找不到任何像我的命令那样命名的文件 所以它似乎是其他东西 这是一个使用 nvm 的示例 它不是可执行文件 me MacBook which cat bin cat me Ma
  • 安装 Ruby 1.9.3 时出错

    我通过 rvm 安装 Ruby 1 9 3 时遇到错误 rvm install 1 9 3 p0 Installing Ruby from source to home alder rvm rubies ruby 1 9 3 p0 this
  • 使用 jQuery Quicksand 时 CSS 冒泡

    我正在使用 jQuery Quicksand 创建可过滤的文章组合 http davekiss com new http davekiss com new 问题是 当单击侧边栏段落中的过滤器 视频 网站 动态图形 时 正在过滤的文章上的 C
  • 如何在 C# 中处理双重解析中的文化?

    我有一个关于如何在解析双打时处理文化的问题 在系统中 来自不同服务器的价格信息汇集在一起 然而 作为输入给出的数据因文化而异 两百万五十美分如下 2 000 000 50 2 000 000 50 2000000 50 2000000 50
  • Android 4.0如何实现全屏

    Android 4 0 手机只有虚拟按钮 当全屏播放 YouTube 视频时 虚拟按钮实际上是不可见的 视频部分取代了按钮所在的位置 我想做这个 但还没有找到方法 android theme android style Theme NoTi
  • Boost 测试错误:main 已定义

    我有一个Visual Studio我想做一些单元测试的项目Boost Test 我有 2 个文件 File 1 define BOOST TEST MODULE FileX include
  • R Notebook 不显示数据帧的代码输出

    当我尝试查看数据帧结果时 Rnotebook 中的代码块输出没有出现 就好像没有运行一样 我必须通过 pander 函数传递它才能看到输出打印出来 这和针织有关系吗 我提到这一点是因为我在开头将选项设置为以下内容 r setup inclu
  • ReactJS:当子组件调用父组件时,“this.props”不是一个函数

    我已经编写了这段代码 目前正在解决 onClick 事件中的错误 我有两个事件 子元素上的 onClick 事件和顶级父元素上的 onChange 事件 预期的行为应该是更改 Container 组件中当前保存的 activeAccount