我想编写一个Form组件,该组件可以导出方法以验证其子级。不幸的是,表单没有“看到”其子级上的任何方法。
这是我定义Form的潜在子代的方法:
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;
}
});
我注意到可以使用引用在子组件上调用方法,但不能通过props.children调用方法。
这种React行为是否有原因?
我怎样才能解决这个问题?
技术原因是,当您尝试访问子组件时,它们尚未真正存在(在DOM中)。它们尚未安装。它们已<Form>
作为构造函数prop或方法作为react 类
传递给您的组件。(因此命名为React.createClass()
)。
正如您所指出的,可以使用refs来绕开它,但是我不建议这样做。在许多情况下,ref往往是不想要的东西的捷径,因此应避免使用。
可能是设计使然,使父母难以/不可能使用孩子的方法。他们不应该这样做。如果孩子的方法对孩子是私密的,则应该在孩子的方法中:他们在孩子内部做某些事情,这些事情不应该直接向上传达给父母。如果真是这样,那么应该在父级内部进行处理。因为父母至少拥有孩子拥有的所有信息和数据。
现在以您的情况为例,我想象每个输入(子)组件都有某种特定的验证方法,该方法可以检查输入值,并基于结果进行一些错误消息反馈。假设在不正确的字段周围有一个红色的轮廓。
以反应方式,可以通过以下方式实现:
<Form>
组件具有状态,其中包括一个runValidation
布尔值。runValidation
设置为true,内部的setState( { runValidation: true });
自动反应再使所有儿童。runValidation
所有孩子的道具。render()
功能if (this.props.runValidation) { this.validate() }
validate()
在孩子中执行功能现在,这还不能解决,是您可能要在所有孩子都通过验证之后在表单级别进行一些检查:例如,当所有孩子都可以的时候,提交表单。
为了解决这个问题,您可以将refs快捷方式应用于最终检查并提交。并在函数<Form>
内部实现一个方法componentDidUpdate()
,检查每个孩子是否可以(例如,带有绿色边框)以及是否单击提交然后提交。但作为一般规则,我强烈建议您不要使用引用。
对于最终形式验证,更好的方法是:
<Form>
该变量包含每个孩子的布尔值。注意,它必须是非状态的,以防止子级触发新的渲染周期。validateForm
功能作为(回调)道具传递给每个孩子。validate()
在每个子对象的内部,调用this.props.validateForm(someChildID)
会更新Form中变量中的相应布尔值。validateForm
表单函数的末尾,检查所有布尔值是否都为真,如果是,则提交表单(或更改表单状态或其他)。对于更长(且更复杂)的方法来进行反应(使用助熔剂)的形式验证,可以查看本文。
我想编写一个表单组件,它可以导出一个方法来验证其子级。不幸的是,表单在其子级上没有“看到”任何方法。 以下是我如何定义一个潜在的形式子项: 下面是我如何定义Form类: 我注意到我可以使用refs调用子组件上的方法,但不能通过props调用方法。儿童 这种行为有什么原因吗? 我怎样才能解决这个问题?
问题内容: 我有一个父子组件,我想在子组件中调用父方法,如下所示: 这将返回错误消息: 如何在子组件中调用此父方法? 问题答案: 试试这个。将功能作为道具传递给子组件。
问题内容: 我想从React元素的实例中调用React组件公开的方法。 例如,在此jsfiddle中。我想从参考中调用该方法。 有没有一种方法可以实现而无需编写其他包装程序? 编辑 (从JSFiddle复制的代码) 问题答案: 有两种访问内部函数的方法。一个实例级别,如您所愿,另一个静态级别。 实例 您需要在从返回时调用函数。见下文。 静态的 看一下ReactJS Statics。但是请注意,静态
本文向大家介绍Vue父组件调用子组件事件方法,包括了Vue父组件调用子组件事件方法的使用技巧和注意事项,需要的朋友参考一下 Vue父组件向子组件传递事件/调用事件 不是传递数据(props)哦,适用于 Vue 2.0 方法一:子组件监听父组件发送的方法 方法二:父组件调用子组件方法 子组件: 父组件: 以上这篇Vue父组件调用子组件事件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希
我需要在ReactJS中从父组件调用子组件方法。我试过使用裁判,但不能做到这一点。有没有人能提出任何解决方案。多谢了。
我已经创建了一个子组件,它有一个我想调用的方法。 当我调用这个方法时,它只触发行,它不会设置属性?? 下面是快速启动的Angular应用程序和我的更改。 家长 孩子 如何设置属性?