当前位置: 首页 > 知识库问答 >
问题:

子组件上的调用方法

太叔昊穹
2023-03-14

我想编写一个表单组件,它可以导出一个方法来验证其子级。不幸的是,表单在其子级上没有“看到”任何方法。

以下是我如何定义一个潜在的形式子项:

var Input = React.createClass({
  validate: function() {
    ...
  },
});

下面是我如何定义Form类:

var Form = React.createClass({
  isValid: function() {
    var valid = true;
    this.props.children.forEach(function(component) {
      // --> This iterates over all children that I pass
      if (typeof component.validate === 'function') {
        // --> code never reaches this point
        component.validate();
        valid = valid && component.isValid();
      }
    });
    return valid;
  }
});

我注意到我可以使用refs调用子组件上的方法,但不能通过props调用方法。儿童

这种行为有什么原因吗?

我怎样才能解决这个问题?

共有2个答案

劳彦
2023-03-14

我不确定我是否遗漏了什么,但在尝试@wintvelt建议的方法后,每当我在React的render方法中调用runValidation方法时,我都会遇到问题,因为在我的情况下runValidation通过在其中调用setState来更改状态,因此触发渲染方法,这显然是一种不好的做法,因为渲染方法必须是纯的,如果我将runValidation放入willReceiveProps中,它将不会第一次被调用,因为if条件尚未为真(此条件在父组件中使用setState进行更改,但在第一次调用willReceiveProps时仍然为false)。

尉迟清野
2023-03-14

技术上的原因是,在您尝试访问子组件时,它们还不存在(在DOM中)。他们还没有上马。它们已传递到您的

正如您所指出的,这可以通过使用REF来避免,但我不推荐使用REF。在许多情况下,REF往往是一些非预期反应的捷径,因此应该避免。

可能是出于设计,react使得父母很难/不可能访问孩子的方法。他们不应该这样做。如果孩子的方法是私人的,那么孩子的方法应该在孩子身上:他们在孩子身上做一些不应该直接向上传达给父母的事情。如果是这样的话,那么应该在父级内部进行处理。因为父对象至少拥有子对象拥有的所有信息和数据。

现在在您的例子中,我设想每个输入(子)组件都有某种特定的验证方法,该方法检查输入值,并根据结果执行一些错误消息反馈。假设在不正确的字段周围有一个红色的轮廓。

通过react方式,可通过以下方式实现:

现在这还没有解决的问题是,您可能希望在所有子级验证自己之后在表单级别进行一些检查:例如,当所有子级都确定时,提交表单。

要解决这个问题,可以将refs快捷方式应用于最终检查并提交。并在

对于最终表单验证,更好的方法是:

对于在react(with flux)中形成验证的更冗长(更复杂)的解决方案,您可以查看本文。

 类似资料:
  • 问题内容: 我想编写一个Form组件,该组件可以导出方法以验证其子级。不幸的是,表单没有“看到”其子级上的任何方法。 这是我定义Form的潜在子代的方法: 这是我定义Form类的方式: 我注意到可以使用引用在子组件上调用方法,但不能通过props.children调用方法。 这种React行为是否有原因? 我怎样才能解决这个问题? 问题答案: 技术原因是,当您尝试访问子组件时,它们尚未真正存在(在

  • 本文向大家介绍Vue父组件调用子组件事件方法,包括了Vue父组件调用子组件事件方法的使用技巧和注意事项,需要的朋友参考一下 Vue父组件向子组件传递事件/调用事件 不是传递数据(props)哦,适用于 Vue 2.0 方法一:子组件监听父组件发送的方法 方法二:父组件调用子组件方法 子组件: 父组件: 以上这篇Vue父组件调用子组件事件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希

  • 我需要在ReactJS中从父组件调用子组件方法。我试过使用裁判,但不能做到这一点。有没有人能提出任何解决方案。多谢了。

  • 问题内容: 我有一个父子组件,我想在子组件中调用父方法,如下所示: 这将返回错误消息: 如何在子组件中调用此父方法? 问题答案: 试试这个。将功能作为道具传递给子组件。

  • 我已经创建了一个子组件,它有一个我想调用的方法。 当我调用这个方法时,它只触发行,它不会设置属性?? 下面是快速启动的Angular应用程序和我的更改。 家长 孩子 如何设置属性?

  • 在Vue 2.0中,文档和其他文档清楚地表明,父母与孩子之间的沟通是通过道具进行的。 父母如何通过道具告诉孩子事情发生了? 我应该看一个叫事件的道具吗?这感觉不对,替代方案也不对(/是子元素到父元素的,中心模型是远程元素的)。 我有一个父容器,它需要告诉它的子容器,可以在API上执行某些操作。我需要能够触发函数。