Estoy comenzando con React.js y quiero hacer un formulario simple pero en la documentación he encontrado dos formas de hacerlo.
El primero está usando 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>
);
}
});
Y el segundo está usando el estado dentro del componente 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: ''
});
});
No veo los pros y los contras de las dos alternativas, si es que existe alguna. Gracias.
Respuestas:
La versión corta: evita las referencias.
Son malos para la mantenibilidad y pierden gran parte de la simplicidad que proporciona el renderizado del modelo WYSIWYG.
Tienes una forma. Necesita agregar un botón que restablezca el formulario.
Tiene un campo de número CCV en una entrada y algunos otros campos en su aplicación que son números. Ahora necesita hacer cumplir que el usuario solo ingrese números.
Eh, no importa, el primer ministro quiere que hagamos una sombra de caja roja si no es válido.
Necesitamos devolver el control a los padres. Los datos ahora están en accesorios y debemos reaccionar a los cambios.
sed -e 's/this.state/this.props/' 's/handleChange/onChange/' -i form.js
La gente piensa que los árbitros son "más fáciles" que mantenerlo en regla. Esto puede ser cierto durante los primeros 20 minutos, no es cierto en mi experiencia después de eso. Póngase en posición de decir "Sí, lo terminaré en 5 minutos" en lugar de "Claro, solo reescribiré algunos componentes".
fuente
React.findDOMNode(this.refs.foo)
. Si, por ejemplo, cambia,this.refs.foo.props.bar
no pasará nada.<input onChange={this.handleChange} value={this.state.foo} />
cambiado a<input onChange={this.props.handleChange} value={this.props.foo} />
, o ha modificado su función handleChange para llamar a la devolución de llamada en props. De cualquier manera, son algunos pequeños cambios obvios.input
campo donde cada uno mantiene su propio estado es ideal. En algún momento necesitamos reconciliar estos diversos estados independientes con algún modelo más grande. Tal vez tengamos un autoguardado en un temporizador, o simplemente lo guardemos en.componentWillUnmount
Aquí es donde encuentrorefs
ideal, durante la reconciliación sacamos elstate
valor de cada unoref
, y ninguno es más sabio. Estoy de acuerdo en que en la mayoría de los casosstate
es la respuesta, pero con una gran cantidad deinputs
, utilizar unrefs
patrón adecuado es una bendición para el rendimientoHe visto a algunas personas citar la respuesta anterior como una razón para "nunca usar referencias" y quiero dar mi opinión (así como a algunos otros desarrolladores de React con los que he hablado).
El sentimiento de "no usar referencias" es correcto cuando se habla de usarlos para instancias de componentes. Es decir, no debe usar referencias como una forma de tomar instancias de componentes y llamar a métodos en ellas. Esta es la forma incorrecta de usar las referencias y es cuando las referencias van al sur rápidamente.
La forma correcta (y muy útil) de usar las referencias es cuando las usa para obtener algún valor del DOM. Por ejemplo, si tiene un campo de entrada que adjunta una referencia a esa entrada, entonces tomar el valor más tarde a través de la referencia está bien. Sin esta forma, debe pasar por un proceso bastante orquestado para mantener su campo de entrada actualizado con su estado local o su tienda de flujo, lo que parece innecesario.
Edición de 2019: Hola amigos del futuro. Además de lo que mencioné hace unos años ^, con React Hooks, las referencias también son una excelente manera de realizar un seguimiento de los datos entre renderizaciones y no se limitan a solo tomar nodos DOM.
fuente
refs
y obtenga el valor del estado. En realidad, parece un patrón muy bonito.TL; DR En términos generales,
refs
vaya en contra de la filosofía declarativa de React , por lo que debe usarlos como último recurso. Úselostate / props
siempre que sea posible.Para entender dónde usa
refs
vsstate / props
, veamos algunos de los principios de diseño que sigue React.Según la documentación de React sobre
refs
Principios de diseño de Per React sobre las escotillas de escape
Lo que significa que el equipo de React sugiere evitar
refs
y usarstate / props
para cualquier cosa que se pueda hacer de manera reactiva / declarativa.@Tyler McGinnis ha proporcionado una muy buena respuesta , indicando también que
Si bien puede hacer eso, estará trabajando en contra de la filosofía de React. Si tiene valor en una entrada, seguramente proviene de
state / props
. Para mantener el código coherente y predecible, también debes ceñirte astate / props
él. Reconozco el hecho de que arefs
veces te da la solución más rápida, por lo que si haces una prueba de concepto, rápido y sucio es aceptable.Esto nos deja con varios casos de uso concretos para
refs
fuente
Esta publicación es antigua.
Compartiré mi pequeña experiencia en un caso sobre ese tema.
Estaba trabajando en un componente grande (414 líneas) con muchas entradas 'dinámicas' y muchos datos en caché involucrados. (No estoy trabajando solo en la página, y mis sentidos me dicen que la estructura del código probablemente podría dividirse mejor, pero no es el punto (bueno, podría serlo, pero estoy lidiando con eso)
Primero trabajé con el estado para manejar los valores de las entradas:
y por supuesto en las entradas:
El renderizado era tan pesado que el cambio de entrada estaba entrecortado como **** (no intente mantener la tecla presionada, el texto solo aparecerá después de una pausa)
Estaba seguro de que podría evitar esto usando refs.
terminó así:
y en las entradas:
[Bueno, en mi caso, la entrada fue Material-UI TextField, por lo que fue:
]
Gracias a esto, no hay re-renderización, la entrada es fluida, la funcionalidad funciona de la misma manera. Ahorrará ciclos y cálculo, y también energía. Hazlo por la tierra x)
Mi conclusión: useRef para el valor de las entradas incluso puede ser necesario.
fuente