Почему этот список выбора не отображается с правильным элементом, выбранным на основе defaultValue

У меня есть компонент ReactJS:

var RegionsList = React.createClass({

    handleChange: function () {
        var regionId = this.refs.userRegions.getDOMNode().value;
        this.props.onRegionSelected(regionId);
    },

    componentDidMount: function() {
        $.get("/translation/activeuserregions", function(result) {
            if(this.isMounted()) {
                this.setState({
                    selectedRegionId: result.SelectedRegionId,
                    regions: result.Regions
                })
            }     
        }.bind(this));
    },

    getInitialState: function(props) {
        return {
            selectedRegionId: '',
            regions: []    
        }    
    },

    render: function() {
        return (
            <div id="RegionsListForm" className="navbar-form navbar-left regions-list">
                <div className="input-group navbar-searchbox">
                    <span className="input-group-addon">
                        <span>Region</span>
                    </span>
                    <select ref="userRegions" onChange={this.handleChange} defaultValue={this.state.selectedRegionId} className="form-control valid" id="region" name="region" aria-invalid="false">
                        {this.state.regions.map(function(region) {
                            return <option key={region.Id} value={region.Id} label={region.RegionName}>{region.RegionName}</option>        
                        })}                                             
                    </select>
                </div>
            </div>
        );
    },


})

Кажется, он работает правильно. Но изначально он не отображается с правильным выбранным элементом. Хотя defaultValue кажется установленным правильно, поэтому я не понимаю, почему.

Что я делаю не так?


person Simon Lomax    schedule 22.07.2014    source источник


Ответы (1)


Когда <select> монтируется изначально, значение по умолчанию равно ''. Как только компонент неконтролируемой формы находится в DOM, React не просматривает обновления реквизита defaultValue. В этом случае похоже, что вы хотите, чтобы состояние selectedRegionId всегда соответствовало тому, что отображается пользователю, поэтому вы можете изменить defaultValue на value и добавить вызов this.setState({selectedRegionId: regionId}); в свой обработчик onChange; тогда состояние вашего компонента и DOM всегда будут синхронизированы.

person Sophie Alpert    schedule 22.07.2014