Ben sadece bu sorunla karşılaştı ve tepki 15.0.1 15.0.2 kullanıyorum ve ES6 sözdizimi kullanıyorum ve v.15 hafta önce ve bazı this.refs
özellikleri düştüğünden beri diğer cevaplardan gerekenleri tam olarak alamadım kullanımdan kaldırıldı ve kaldırıldı .
Genel olarak, ihtiyacım olan şey:
- Bileşen monte edildiğinde ilk giriş (alan) öğesine odaklanın
- İlk giriş (alan) öğesini bir hata ile odaklayın (gönderdikten sonra)
Kullanıyorum:
- Reaksiyon Kabı / Sunum Bileşeni
- Redux
- Tepki-Yönlendirici
İlk Giriş Öğesine Odaklanma
Sayfada autoFocus={true}
ilkinde kullandım , <input />
böylece bileşen monte edildiğinde odaklanacaktır.
İlk Giriş Öğesini Hata ile Odaklayın
Bu daha uzun sürdü ve daha kıvrımlıydı. Kısalık için çözüm ile ilgili olmayan kodu dışarıda tutuyorum.
Redux Mağazası / Eyalet
Odaklamayı ayarlayıp ayarlamam gerektiğini bilmek için küresel bir duruma ihtiyacım var, bu yüzden bileşenler yeniden oluşturulduğunda odağı yeniden ayarlamaya devam etmiyorum (kullanacağım componentDidUpdate()
odak ayarını kontrol etmek için . )
Bu uygulama için uygun gördüğünüz gibi tasarlanabilir.
{
form: {
resetFocus: false,
}
}
Kapsayıcı Bileşeni
Bileşenin aşağıdakilere sahip olması gerekir: resetfocus
özelliğin ayarlanmış özelliğin kendisinin ayarını ayarlaması durumunda özelliği temizlemek için bir callBack'e sahip olması gerekir.
Ayrıca, Eylem Yaratıcılarımı çoğunlukla projem oldukça büyük olduğu için ayrı dosyalar halinde düzenledim ve onları daha yönetilebilir parçalar haline getirmek istedim.
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);
Sunum Bileşeni
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
}
genel bakış
Genel fikir, bir hataya ve odaklanabilecek her form alanının kendini kontrol etmesi ve kendisine odaklanması gerekip gerekmediğidir.
Verilen alanın odağı ayarlamak için doğru alan olup olmadığını belirlemek için gerçekleşmesi gereken iş mantığı vardır. Tek tek uygulamaya bağlı olacağı için bu gösterilmez.
Bir form gönderildiğinde, o etkinliğin genel odak bayrağını resetFocus
true olarak ayarlaması gerekir . Daha sonra her bileşen kendini güncellediğinde, odağı alıp almadığını kontrol etmeli ve eğer öyleyse, odağı sıfırlamak için olayı göndererek diğer öğelerin denetlemeye devam etmesine gerek kalmayacaktır.
düzenlemek
Bir yan not olarak, benim iş mantığı bir "yarar" dosya vardı ve ben sadece yöntemi ihraç ve her içinde denirshouldfocus()
yöntem .
Şerefe!