Saya baru saja mengalami masalah ini dan saya menggunakan react 15.0.1 15.0.2 dan saya menggunakan sintaks ES6 dan tidak mendapatkan apa yang saya butuhkan dari jawaban lain sejak v.15 turun beberapa minggu yang lalu dan beberapa this.refs
properti sudah ditinggalkan dan dihapus .
Secara umum, yang saya butuhkan adalah:
- Fokuskan elemen input (bidang) pertama saat komponen dipasang
- Fokuskan elemen input (bidang) pertama dengan kesalahan (setelah mengirim)
Saya menggunakan:
- Bereaksi Wadah / Komponen Presentasi
- Redux
- Bereaksi-Router
Fokuskan Elemen Input Pertama
Saya menggunakan autoFocus={true}
yang pertama<input />
di halaman sehingga ketika komponen mount, itu akan mendapatkan fokus.
Fokuskan Elemen Input Pertama dengan Kesalahan
Ini memakan waktu lebih lama dan lebih berbelit-belit. Saya menyimpan kode yang tidak relevan dengan solusi untuk singkatnya.
Redux Store / Negara
Saya perlu negara global untuk mengetahui apakah saya harus mengatur fokus dan menonaktifkannya ketika sudah diatur, jadi saya tidak terus mengatur ulang fokus saat komponen dirender ulang (saya akan menggunakan componentDidUpdate()
untuk memeriksa pengaturan fokus. )
Ini dapat dirancang sesuai keinginan Anda untuk aplikasi Anda.
{
form: {
resetFocus: false,
}
}
Komponen Wadah
Komponen harus memiliki resetfocus
set properti dan callBack untuk menghapus properti jika akhirnya menetapkan fokus pada dirinya sendiri.
Juga perhatikan, saya mengatur Pencipta Tindakan saya ke dalam file terpisah sebagian besar karena proyek saya cukup besar dan saya ingin memecahnya menjadi potongan-potongan yang lebih mudah dikelola.
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);
Komponen Presentasi
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
}
Gambaran
Gagasan umum adalah bahwa setiap bidang formulir yang bisa memiliki kesalahan dan menjadi fokus perlu memeriksa sendiri dan jika perlu mengatur fokus pada dirinya sendiri.
Ada logika bisnis yang perlu terjadi untuk menentukan apakah bidang yang diberikan adalah bidang yang tepat untuk menetapkan fokus. Ini tidak ditampilkan karena akan tergantung pada aplikasi individual.
Saat formulir dikirimkan, acara itu perlu mengatur bendera fokus global resetFocus
menjadi true. Kemudian ketika masing-masing komponen memperbarui sendiri, itu akan melihat bahwa itu harus memeriksa untuk melihat apakah itu mendapatkan fokus dan jika ya, mengirimkan acara untuk mengatur ulang fokus sehingga elemen lain tidak harus terus memeriksa.
sunting
Sebagai catatan tambahan, saya memiliki logika bisnis saya dalam file "utilitas" dan saya baru saja mengekspor metode dan menyebutnya dalam setiapshouldfocus()
metode.
Bersulang!