Ich bin gerade auf dieses Problem gestoßen und verwende reag 15.0.1 15.0.2 und ich verwende die ES6-Syntax und habe aus den anderen Antworten nicht ganz das bekommen, was ich brauchte, da v.15 vor Wochen und einige der this.refs
Eigenschaften gelöscht wurden wurden veraltet und entfernt .
Im Allgemeinen brauchte ich:
- Fokussieren Sie das erste Eingabe- (Feld-) Element, wenn die Komponente bereitgestellt wird
- Fokussieren Sie das erste Eingabe- (Feld-) Element mit einem Fehler (nach dem Senden).
Ich benutze:
- Reaktionsbehälter / Präsentationskomponente
- Redux
- React-Router
Fokussieren Sie das erste Eingabeelement
Ich habe autoFocus={true}
auf der ersten <input />
Seite verwendet, damit die Komponente beim Mounten den Fokus erhält.
Fokussieren Sie das erste Eingabeelement mit einem Fehler
Dies dauerte länger und war komplizierter. Ich halte Code fern, der für die Lösung der Kürze halber nicht relevant ist.
Redux Store / State
Ich benötige einen globalen Status, um zu wissen, ob ich den Fokus festlegen und deaktivieren soll, wenn er festgelegt wurde. Daher setze ich den Fokus nicht immer wieder neu, wenn die Komponenten neu gerendert werden (ich werde ihn verwenden componentDidUpdate()
, um den Fokus festzulegen. )
Dies kann so gestaltet werden, wie Sie es für Ihre Anwendung für richtig halten.
{
form: {
resetFocus: false,
}
}
Containerkomponente
Für die Komponente müssen die resetfocus
Eigenschaft und ein CallBack festgelegt sein, um die Eigenschaft zu löschen, wenn der Fokus auf sich selbst gelegt wird.
Beachten Sie auch, dass ich meine Action Creators in separate Dateien organisiert habe, hauptsächlich weil mein Projekt ziemlich groß ist und ich sie in überschaubarere Teile aufteilen wollte.
import { connect } from 'react-redux';
import MyField from '../presentation/MyField';
import ActionCreator from '../actions/action-creators';
function mapStateToProps(state) {
return {
resetFocus: state.form.resetFocus
}
}
function mapDispatchToProps(dispatch) {
return {
clearResetFocus() {
dispatch(ActionCreator.clearResetFocus());
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(MyField);
Präsentationskomponente
import React, { PropTypes } form 'react';
export default class MyField extends React.Component {
// don't forget to .bind(this)
constructor(props) {
super(props);
this._handleRef = this._handleRef.bind(this);
}
// This is not called on the initial render so
// this._input will be set before this get called
componentDidUpdate() {
if(!this.props.resetFocus) {
return false;
}
if(this.shouldfocus()) {
this._input.focus();
this.props.clearResetFocus();
}
}
// When the component mounts, it will save a
// reference to itself as _input, which we'll
// be able to call in subsequent componentDidUpdate()
// calls if we need to set focus.
_handleRef(c) {
this._input = c;
}
// Whatever logic you need to determine if this
// component should get focus
shouldFocus() {
// ...
}
// pass the _handleRef callback so we can access
// a reference of this element in other component methods
render() {
return (
<input ref={this._handleRef} type="text" />
);
}
}
Myfield.propTypes = {
clearResetFocus: PropTypes.func,
resetFocus: PropTypes.bool
}
Überblick
Die allgemeine Idee ist, dass jedes Formularfeld, das einen Fehler aufweisen und fokussiert sein könnte, sich selbst überprüfen muss und ob es sich auf sich selbst konzentrieren muss.
Es muss eine Geschäftslogik vorhanden sein, um festzustellen, ob das angegebene Feld das richtige Feld ist, auf das der Fokus gesetzt werden soll. Dies wird nicht angezeigt, da es von der jeweiligen Anwendung abhängt.
Wenn ein Formular gesendet wird, muss dieses Ereignis das globale Fokusflag resetFocus
auf true setzen. Wenn sich dann jede Komponente selbst aktualisiert, wird überprüft, ob sie den Fokus erhält. Wenn dies der Fall ist, wird das Ereignis ausgelöst, um den Fokus zurückzusetzen, damit andere Elemente nicht weiter prüfen müssen.
Bearbeiten
Als Randnotiz hatte ich meine Geschäftslogik in einer "Dienstprogramm" -Datei und habe die Methode einfach exportiert und in jeder aufgerufenshouldfocus()
Methode .
Prost!