ฉันเพิ่งพบปัญหานี้และฉันใช้ react 15.0.1 15.0.2 และฉันใช้ไวยากรณ์ ES6 และไม่ได้รับสิ่งที่ฉันต้องการจากคำตอบอื่น ๆ ตั้งแต่ v.15 ลดลงเมื่อหลายสัปดาห์ก่อนและthis.refs
คุณสมบัติบางอย่างถูกเลิกใช้และลบออก
โดยทั่วไปสิ่งที่ฉันต้องการคือ:
- มุ่งเน้นองค์ประกอบอินพุต (ฟิลด์) แรกเมื่อส่วนประกอบเมาท์
- มุ่งเน้นองค์ประกอบอินพุต (ฟิลด์) แรกที่มีข้อผิดพลาด (หลังจากส่ง)
ฉันกำลังใช้:
- ทำปฏิกิริยาคอนเทนเนอร์ / ส่วนประกอบการนำเสนอ
- Redux
- ตอบสนอง-Router
มุ่งเน้นองค์ประกอบอินพุตแรก
ฉันใช้autoFocus={true}
ครั้งแรก<input />
ในหน้าเพื่อที่ว่าเมื่อเมาท์ส่วนประกอบจะได้รับโฟกัส
โฟกัสองค์ประกอบอินพุตแรกโดยมีข้อผิดพลาด
สิ่งนี้ใช้เวลานานกว่าและมีความซับซ้อนมากกว่า ฉันกำลังเขียนโค้ดที่ไม่เกี่ยวข้องกับวิธีแก้ปัญหาสั้น ๆ
ร้านค้า / รัฐ Redux
ฉันต้องการสถานะส่วนกลางเพื่อทราบว่าฉันควรตั้งโฟกัสและปิดการใช้งานเมื่อตั้งค่าหรือไม่ดังนั้นฉันจึงไม่ตั้งค่าโฟกัสใหม่เมื่อองค์ประกอบแสดงผลอีกครั้ง (ฉันจะใช้componentDidUpdate()
เพื่อตรวจสอบการตั้งโฟกัส )
สามารถออกแบบได้ตามที่คุณเห็นว่าเหมาะสมกับแอปพลิเคชันของคุณ
{
form: {
resetFocus: false,
}
}
ส่วนประกอบคอนเทนเนอร์
องค์ประกอบจะต้องมีresetfocus
ชุดคุณสมบัติและ callBack เพื่อล้างคุณสมบัติถ้ามันจบลงด้วยการตั้งค่าโฟกัสในตัวเอง
โปรดทราบว่าฉันจัดระเบียบผู้สร้าง Action ของฉันเป็นไฟล์แยกส่วนใหญ่เนื่องจากโครงการของฉันค่อนข้างใหญ่และฉันต้องการที่จะแบ่งพวกเขาออกเป็นกลุ่มที่จัดการได้มากขึ้น
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()
วิธี
ไชโย!