องค์ประกอบการเลือกที่ควบคุมการตอบสนองจะเปลี่ยนกลับเป็นตัวเลือกแรก

ฉันใช้ React เพื่อสร้างองค์ประกอบการเลือกแบบควบคุม แอพของฉันตรวจสอบค่าตัวเลือกใหม่ที่ผู้ใช้เลือก จากนั้นอัปเดตค่านั้นในองค์ประกอบ การตรวจสอบความถูกต้องต้องใช้เวลาพอสมควรและพฤติกรรมที่ฉันสังเกตเห็นมีดังนี้:

  • ผู้ใช้เลือกตัวเลือก
  • องค์ประกอบเปลี่ยนตัวเลือกที่เลือกเป็นดัชนี 0
  • เมื่อสิ้นสุดระยะเวลาการตรวจสอบ องค์ประกอบจะอัปเดตตัวเองเป็นค่าใหม่

ฉันไม่เข้าใจว่าทำไมองค์ประกอบจึงเปลี่ยนกลับเป็นดัชนีแรก และฉันจะป้องกันสิ่งนี้ได้อย่างไร (ยกเว้นโดยการตั้งค่าทันทีซึ่งเป็นสิ่งที่ไม่ต้องการในแอปพลิเคชันของฉัน)

ใช้ JSFiddle นี้เพื่อดูพฤติกรรมนี้ (เลือกตัวเลือก 2) https://jsfiddle.net/qo39g2j4/

var Select = React.createClass({
  render: function() {
    return (
        <select id="my-select" value={this.props.value} onChange={this.props.onChange}>
            <option value="Option1">Option1</option>
            <option value="Option2">Option2</option>
            <option value="Option3">Option3</option>
        </select>
    );
  }
});

var Wrapper = React.createClass({
    getInitialState: function () {
        return {value: "Option3"};
    },
    onChange: function (event) {
        var value = event.target.value;
        setTimeout(function () {
            this.setState({value: value});
        }.bind(this), 1000); // this simulates the validation period
    },
    render: function () {
        return (
            <Select
                value={this.state.value}
                onChange={this.onChange}/>
        );
    }
});

ReactDOM.render(
    <Wrapper/>,
    document.getElementById("container")
);

person Amit Fridman    schedule 29.12.2015    source แหล่งที่มา


คำตอบ (2)


ลองใช้ defaultValue แทน value ในองค์ประกอบ Select ของคุณ หรือบวก event.preventDefault() ใน onChange

person oobgam    schedule 29.12.2015
comment
การเปลี่ยนค่าเป็น defaultValue จะทำให้องค์ประกอบนี้ไม่สามารถควบคุมได้ ทำให้ฉันไม่สามารถเปลี่ยนค่าได้หากการตรวจสอบล้มเหลว event.preventDefault() ดูเหมือนจะไม่ทำงานใน JSFiddle และแอปจริง - person Amit Fridman; 31.12.2015
comment
@AmitFridman บางทีคุณอาจลองตั้งค่า state สองครั้ง onChange ก่อนการตรวจสอบและหลังการตรวจสอบ - person oobgam; 31.12.2015

ฉันประสบปัญหาเดียวกันเมื่อรวม redux-form ภายในแอปของฉัน เนื่องจากปัญหาใน ตัวจัดการเหตุการณ์ onBlur ดังนั้นนี่คือวิธีที่ฉันจัดการโดยใช้ส่วนประกอบการตอบสนองแบบกำหนดเอง:

export default class CustomSelect extends Component {
  render() {
    const { children, value, onBlur, ...props } = this.props

    return (
      <select
        {...props}
        onBlur={() => onBlur(value)}
      >
      {children}
      </select>
    )
  }
}

ที่นี่ onBlur eventHandler ถูกเรียกอย่างชัดเจนด้วยค่าที่ส่งผ่าน เพื่อที่จะคงการเลือกไว้

นอกจากนี้ การตรวจสอบความถูกต้องในฝั่งไคลเอ็นต์หรือฝั่งเซิร์ฟเวอร์ไม่ควรแสดงด้วยการหมดเวลา เนื่องจากผู้ใช้คาดว่าจะเห็นข้อมูลอินพุตที่ไม่ถูกต้องพร้อมข้อความตรวจสอบความถูกต้องหากไม่ถูกต้อง

ฉันเดาว่าการใช้งานของคุณหมายความว่าตัวเลือกที่เลือกจะมองเห็นได้ก็ต่อเมื่อถูกต้อง ซึ่งไม่ใช่ประสบการณ์ผู้ใช้ที่ดีที่สุดที่คุณมี หากเป็นกรณีจริง

โซลูชันอิงตามredux-form react-select bug

person Mohamed Labib    schedule 07.06.2016