मैं बस इस मुद्दे में भाग गया और मैं 15.0.1 15.0.2 प्रतिक्रिया का उपयोग कर रहा हूं और मैं ईएस 6 सिंटैक्स का उपयोग कर रहा हूं और काफी कुछ नहीं मिला है जो मुझे दूसरे उत्तरों से चाहिए था क्योंकि v.15 सप्ताह पहले गिरा था और कुछ this.refs
गुणों में से हटाए गए और हटा दिए गए ।
सामान्य तौर पर, मुझे जो चाहिए था:
- जब घटक आरोह करता है तो पहले इनपुट (क्षेत्र) तत्व पर ध्यान केंद्रित करें
- त्रुटि के साथ पहला इनपुट (फ़ील्ड) तत्व फोकस करें (सबमिट करने के बाद)
मैं उपयोग कर रहा हूँ:
- रिएक्टर कंटेनर / प्रस्तुति घटक
- Redux
- प्रतिक्रिया-रूटर
पहले इनपुट तत्व पर ध्यान दें
मैंने autoFocus={true}
पहले प्रयोग किया<input />
पृष्ठ पर ताकि जब घटक की गणना हो, तो उसे फोकस मिलेगा।
एक त्रुटि के साथ पहले इनपुट तत्व पर ध्यान दें
इसमें अधिक समय लगा और इसे अधिक जटिल बना दिया गया। मैं कोड रख रहा हूं जो संक्षिप्तता के समाधान के लिए प्रासंगिक नहीं है।
Redux स्टोर / राज्य
मुझे यह जानने के लिए एक वैश्विक स्थिति की आवश्यकता है कि क्या मुझे फ़ोकस सेट करना चाहिए और इसे सेट होने पर अक्षम करना है, इसलिए मैं पुन: सेटिंग फ़ोकस तब नहीं रखता जब घटक पुन: रेंडर करते हैं (मैं componentDidUpdate()
फ़ोकस सेट करने के लिए जाँच करने के लिए उपयोग करूँगा । )
यह डिज़ाइन किया जा सकता है क्योंकि आप आवेदन के लिए उपयुक्त हैं।
{
form: {
resetFocus: false,
}
}
कंटेनर घटक
घटक को resetfocus
प्रॉपर्टी को सेट करने के लिए प्रॉपर्टी सेट और कॉलबैक की आवश्यकता होगी , यदि यह सेट अप को खुद पर फोकस करता है।
यह भी ध्यान दें, मैंने अपने एक्शन क्रिएटर्स को अलग-अलग फाइलों में व्यवस्थित किया है, क्योंकि मेरी परियोजना काफी बड़ी है और मैं उन्हें अधिक प्रबंधनीय विखंडू में तोड़ना चाहता था।
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);
प्रस्तुति घटक
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
}
अवलोकन
सामान्य विचार यह है कि प्रत्येक प्रपत्र फ़ील्ड में त्रुटि हो सकती है और उसे स्वयं जांचने की आवश्यकता होती है और यदि उसे स्वयं पर ध्यान केंद्रित करने की आवश्यकता होती है।
व्यापार तर्क है कि यह निर्धारित करने के लिए होने की जरूरत है कि क्या दिए गए क्षेत्र पर ध्यान केंद्रित करने के लिए सही क्षेत्र है। यह नहीं दिखाया गया है क्योंकि यह व्यक्तिगत अनुप्रयोग पर निर्भर करेगा।
जब कोई प्रपत्र सबमिट किया जाता है, तो उस घटना को वैश्विक फ़ोकस ध्वज resetFocus
को सही पर सेट करने की आवश्यकता होती है। फिर जैसा कि प्रत्येक घटक स्वयं को अपडेट करता है, यह देखेगा कि उसे यह देखने के लिए जांचना चाहिए कि क्या उसे फ़ोकस मिलता है और यदि ऐसा होता है, तो ईवेंट को फ़ोकस रीसेट करने के लिए भेजें ताकि अन्य तत्वों को जाँचते न रहना पड़े।
एक साइड नोट के रूप में संपादित करें , मेरे पास "उपयोगिताओं" फ़ाइल में मेरा व्यावसायिक तर्क था और मैंने सिर्फ विधि का निर्यात किया और इसे प्रत्येक के भीतर बुलायाshouldfocus()
विधि।
चीयर्स!