Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
24
rated 0 times [  31] [ 7]  / answers: 1 / hits: 43461  / 10 Years ago, fri, september 19, 2014, 12:00:00

I have React form that has a Component used to render a drop down because the options are coming from an API. However, I can't access the ref for the embedded component. I'm putting together my first form and trying to understand the best way to approach this.



var ActivityForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();

var noteCategoryId = this.refs.note_category_id.getDOMNode().value.trim();
var content = this.refs.content.getDOMNode().value.trim();

if (!category || !content) {
return;
}

// this.props.onCommentSubmit({author: author, text: text});

this.refs.note_category_id.getDOMNode().value = '';
this.refs.content.getDOMNode().value = '';
return;
},
render: function() {
return (
<div className=new-activity>
<h3>New Activity</h3>
<form onSubmit={this.handleSubmit}>
<textarea ref='content' />
<br />

<label>Category</label>
<ActivityFormCategoryDropdown /> # THE REF IN THIS COMPONENT ISN'T ACCESSIBLE
<br />

<input type=submit value=Add Activity />
</form>
</div>
);
}
});

More From » reactjs

 Answers
30

It is preferred to treat the ref as a callback attribute and no longer depend on the refs Object. If you do use the refs Object, avoid accessing refs of descendant components. You should treat refs as a private accessor and not part of a component's API. Treat only the methods exposed on a component instance as its public API.



For this case, I suggest grabbing the form from the submit event and traversing its child form elements as needed. Add name attributes since that's how form elements are identified in standard form submissions, and then you shouldn't need refs at all:



var ActivityForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var form = e.target;

// Use the standard [`HTMLFormElement.elements`][1] collection
//
// [1]: https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/elements
var content = form.elements['content'].value;

// do more things with other named form elements
},
render: function() {
return (
<div className=new-activity>
<h3>New Activity</h3>
<form onSubmit={this.handleSubmit}>
<textarea name='content' />
<br />

<label>Category</label>
<ActivityFormCategoryDropdown />
<br />

<input type=submit value=Add Activity />
</form>
</div>
);
}
});


Update 2016-09-21: Revise suggestion to avoid the refs Object all together per guidance from the ref String Attribute docs.


[#69391] Wednesday, September 17, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
bradleymoisesy

Total Points: 121
Total Questions: 105
Total Answers: 95

Location: Nepal
Member since Mon, Jan 4, 2021
3 Years ago
bradleymoisesy questions
Wed, Dec 22, 21, 00:00, 3 Years ago
Tue, Jun 1, 21, 00:00, 3 Years ago
Thu, Jun 11, 20, 00:00, 4 Years ago
Thu, Jan 16, 20, 00:00, 4 Years ago
;