Я начинаю с React.js, и я хочу сделать простую форму, но в документации я нашел два способа сделать это.
первый использует Refs:
var CommentForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var author = React.findDOMNode(this.refs.author).value.trim();
var text = React.findDOMNode(this.refs.text).value.trim();
if (!text || !author) {
return;
}
// TODO: send request to the server
React.findDOMNode(this.refs.author).value = '';
React.findDOMNode(this.refs.text).value = '';
return;
},
render: function() {
return (
<form className="commentForm" onSubmit={this.handleSubmit}>
<input type="text" placeholder="Your name" ref="author" />
<input type="text" placeholder="Say something..." ref="text" />
<input type="submit" value="Post" />
</form>
);
}
});
И второй использует состояние внутри компонента React:
var TodoTextInput = React.createClass({
getInitialState: function() {
return {
value: this.props.value || ''
};
},
render: function() /*object*/ {
return (
<input className={this.props.className}
id={this.props.id}
placeholder={this.props.placeholder}
onBlur={this._save}
value={this.state.value}
/>
);
},
_save: function() {
this.props.onSave(this.state.value);
this.setState({value: ''
});
});
Я не вижу плюсов и минусов двух альтернатив, если они существуют. Спасибо.
Краткая версия: избегать ссылок.
Они плохо подходят для ремонтопригодности и теряют большую простоту рендеринга модели WYSIWYG.
У вас есть форма. Вам нужно добавить кнопку, которая сбрасывает форму.
У вас есть поле номера CCV на входе и некоторые другие поля в приложении, которые являются числами. Теперь вам нужно обеспечить, чтобы пользователь вводил только числа.
Эх, неважно, премьер-министр хочет, чтобы мы просто сделали красную коробку, если она недействительна.
Нам нужно вернуть управление родительскому элементу. Данные теперь находятся в реквизитах, и нам нужно реагировать на изменения.
sed -e 's/this.state/this.props/' 's/handleChange/onChange/' -i form.js
Люди думают, что рефссы "легче", чем держать его в состоянии. Это может быть правдой в течение первых 20 минут, это не соответствует моему опыту после этого. Положите свое "я", чтобы сказать "Да, я сделаю это через 5 минут", а не "Конечно, я просто переписал несколько компонентов".
Я видел, как несколько человек ссылаются на вышеупомянутый ответ как на причину "никогда не использовать ссылки", и я хочу дать свое (а также несколько других участников React, с которыми я говорил).
"Не использовать ссылки refs" правильно, когда вы говорите об их использовании для экземпляров компонентов. Значит, вы не должны использовать refs как способ захвата экземпляров компонентов и методов вызова на них. Это неправильный способ использования refs, и когда refs быстро выходит на юг.
Правильный (и очень полезный) способ использования ссылок - это когда вы используете их для получения значения из DOM. Например, если у вас есть поле ввода, содержащее ссылку на этот ввод, то захват значения позже через ref просто отлично. Без этого вам нужно пройти довольно организованный процесс, чтобы обновлять ваше поле ввода либо в вашем локальном штате, либо в вашем хранилище флюсов, что кажется ненужным.
TL; DR Вообще говоря, refs
идти против React декларативной философии, поэтому вы должны использовать их в качестве крайней меры. Используйте state / props
, когда это возможно.
Чтобы понять, где вы используете refs
vs state / props
, рассмотрим некоторые из принципов проектирования, которые следует за реакцией.
Per React документация о refs
Избегайте использования ссылок на все, что можно сделать декларативно.
Взаимодействовать с принципами дизайна Escape Hatches
Если какой-либо шаблон, который полезен для создания приложений, трудно выразить декларативным образом, мы предоставим ему императивный API. (и они ссылаются на ссылки здесь)
Это означает, что команда React предлагает избегать refs
и использовать state / props
для всего, что может быть сделано реактивно/декларативно.
@Tyler McGinnis предоставил очень хороший ответ , указав также, что
Правильный (и очень полезный) способ использования refs - это когда вы используете их для получения значения из DOM...
Пока вы можете это сделать, вы будете работать против философии React. Если у вас есть значение на входе, это, безусловно, происходит от state / props
. Чтобы код был согласованным и предсказуемым, вы также должны придерживаться state / props
. Я признаю тот факт, что refs
иногда дает вам более быстрое решение, поэтому, если вы сделаете доказательство концепции, то быстро и грязно допустимо.
Это оставляет нам несколько конкретных вариантов использования для refs
Управление фокусом, выбором текста или воспроизведением мультимедиа. Выполнение обязательных анимаций. Интеграция с сторонними библиотеками DOM.