我想要实现的目标:从嵌套元素中获取数据。
我是如何尝试实现它的:使用子级的ref
属性在父级中获取该元素。不起作用,因为this.refs
似乎只包含顶部组件中的refs
,而不是嵌套组件。
SubmitStoryForm.jsx
嵌套了组件TextInput.jsx
,这是一个简单的<input />
组件。
所以我的表单中有两个元素SubmitStoryForm.jsx
:
<TextInput label="Story name" refer="titleInput" />
<textarea className="materialize-textarea" ref="bodyInput" />
refer
属性是ref
中TextInput
属性的内容:
import React, {Component, PropTypes,} from 'react';
export default class TextInput extends Component {
render() {
const refer = this.props.refer;
console.log(refer);
const id = 'id_'+refer;
const type = this.props.type;
const col = this.props.col;
const label = this.props.label;
return (
<div className=
{col ? 'input-field col ' + col : 'input-field col s3'}>
<input
placeholder={this.props.placeholder}
id={id}
ref={refer}
type={type ? type : 'text'} />
{label ?
<label for={id}>
{this.props.label}
</label> : ''}
</div>
)
}
}
TextInput.propTypes = {
refer: PropTypes.string.isRequired,
};
适用于textarea
元素,因为ref
属性是在父级中定义的。但是,当我将该责任传递给孩子时,TextInput
,ref
无效。
这是我应该如何构建我的代码吗?
我尝试时代码失败:
this.refs.titleInput.value
<{1>}中的,但
SubmitStoryForm.jsx
工作正常。
错误:
this.refs.bodyInput.value
答案 0 :(得分:1)
虽然您可以使用refs
授予父组件对子组件数据的访问权限,但您确实不应该这样做。 (Netflix,反应的重度用户,甚至有一个规则“没有参考,永远”参见this video,从大约10米开始)。
在99.9%的情况下,任何可以使用refs
的东西都可以通过其他方式更好地解决。
在您的示例中,父级不应该通过refs:
在您的情况下,更好的ref
- 解决方案将是:
textInputValue
和textAreaValue
onChange()
处理程序(因为此组件由父级直接呈现),这会更新状态this.state.textInputValue
和changeHandler={this.textInputChangeHandler}
作为道具传递给<TextInput>
组件<TextInput>
组件中,向输入组件添加onChange={this.props.changeHandler}
,该组件调用父级上的方法以更新状态event.target.value
以获取字段的新值。通过执行此操作,您将输入值置于父级中的状态,并将其中一个作为道具传递给子级。
奖励:在提交表单的任何代码中,您无需再次阅读所有字段。您只需从this.state
获取所有信息即可发送到任何地方。