- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想编写一个 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;
}
});
我注意到我可以使用 refs 在子组件上调用方法,但我不能通过 props.children 调用方法。
这种 React 行为是否有原因?
我该如何解决这个问题?
最佳答案
技术原因是当您尝试访问子组件时,它们还不存在(在 DOM 中)。它们尚未安装。它们已传递给您的 <Form>
组件作为构造函数 prop 或方法作为 React class。 (因此在 React.createClass()
中命名为 class)。
正如您所指出的,这可以通过使用 refs 来规避,但我不推荐这样做。在许多情况下,refs 往往是一些非 React 目的的快捷方式,因此应该避免。
可能是 React 的设计使 parent 很难/不可能访问 child 的方法。他们不应该这样做。如果 child 的方法是 child 私有(private)的,那么 child 的方法应该在 child 身上:他们在 child 内部做一些不应该直接向上传达给 parent 的事情。如果是这样的话,那么处理应该在父级内部完成。因为 parent 至少拥有 child 拥有的所有信息和数据。
现在在你的情况下,我想象每个输入(子)组件都有某种特定的验证方法,检查输入值,并根据结果进行一些错误消息反馈。假设不正确的字段周围有红色轮廓。
在react中,可以这样实现:
<Form>
组件有状态,其中包括 runValidation
bool 值。runValidation
在 setState( { runValidation: true });
中设置为 true React 会自动重新渲染所有子项。runValidation
作为所有 child 的 Prop 。render()
功能类似于 if (this.props.runValidation) { this.validate() }
validate()
对 child 的作用现在还没有解决的是,您可能希望在所有子项都验证了自己之后在表单级别进行一些检查:例如当所有 child 都没事时,提交表格。
要解决这个问题,您可以将 refs 快捷方式应用于最终检查并提交。并在你的 <Form>
中实现一个方法在 componentDidUpdate()
里面功能,检查每个 child 是否正常(例如有绿色边框)以及是否单击提交,然后提交。但作为一般规则,我强烈建议不要使用 refs。
对于最终表单验证,更好的方法是:
<Form>
中添加一个非状态变量它为每个 child 保存 bool 值。注意,它必须是非状态的,以防止 child 触发新的渲染周期。validateForm
作为每个 child 的(回调) Prop 。validate()
在每个 child 中,调用 this.props.validateForm(someChildID)
更新表单中变量中的相应 bool 值。validateForm
的末尾表单中的函数,检查所有 bool 值是否为真,如果是,则提交表单(或更改表单状态或其他)。对于更冗长(并且更复杂)的 react 形式验证解决方案(使用助焊剂),您可以查看 this article .
关于javascript - 在 React 子组件上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33487740/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!