Как обновить список опций в реагировать на выбор или реагировать-выбрать.async

Я пытаюсь обновить список параметров события, вызванного в другом месте. Я сохранил параметры в состоянии, и когда у меня есть обновленный список, я устанавливаю состояние, которое запускает рендеринг, но в окне выбора не отображается обновленный список.

    constructor(props) {
        super(props);
        this.renderSelectField = this.renderSelectField.bind(this);
        this.renderTextField = this.renderTextField.bind(this);
        this.updateCommsMatrix = this.updateCommsMatrix.bind(this);
        this.renderSelect2Field = this.renderSelect2Field.bind(this);
        this.clearValue = this.clearValue.bind(this);
        this.updateValue = this.updateValue.bind(this);
        this.meta = {
            title: 'Request Exemption',
            description: 'This section allows you to request an exemption'
        };
        this.runOnce = false;
        this.state = {
            loaded: false,
            searchable: true,
            selectValue: 0,
            clearable: true,
            rtl: false,
            options: [
                { value: 0, label: 'All'}
                ]
        };
        this.exemptionType = {};
        this.markets = {};
        this.serviceDomain = {};
        this.servicesList = {};
        this.matrices = {};
    }

этот раздел содержит обновленные параметры для выбора

    updateCommsMatrix(service_id){      

        if(service_id > 0){
            let self = this;
            this.props.fetchCommsmatricesByService(service_id)
            .then( response => {
                let data = response.payload.data.body.recordset.record;
                console.log(data);
                let options = self.populateOptionsObject(data, 'id', 'filename');
                options.unshift({ value: 0, label: 'All'});
                return options;
            })
            .then( options => this.setState({options:options}));
        }else{
            //select.append(<option value="0" key="0">All</option>);
        }
    }

    populateOptionsObject(options, key, value) {
        return options.map((option, index) => (
                {value : option[key], label: option[value] }
        ));
    }

ниже та часть, которая отображает форму

    populateOptions(options, key, value) {
        return options.map((option, index) => (
            <option key={option.id} value={option[key]}>
                {option[value]}
            </option>
        ));
    }

    clearValue (e) {
        this.select.setInputValue('');
    }

    updateValue (newValue) {
        this.setState({
            selectValue: newValue,
        });
    }

    renderSelect2Field(field){
        let id = "select_" + field.input.name;
        let options = this.state.options;
        return(
                <div className="form-group">
                    <label className="control-label col-sm-2">{field.label}</label>
                    <div className="col-sm-4">
                        <Select
                            id={id}
                            //className="col-sm-6"
                            ref={(ref) => { this.select = ref; }}
                            onBlurResetsInput={false}
                            onSelectResetsInput={false}
                            autoFocus
                            options={options} //on load this has 1 value (value=0, display text =All)
                            simpleValue
                            clearable={this.state.clearable}
                            name={field.input.name}
                            //disabled={this.state.disabled}
                            value={this.state.selectValue}
                            onChange={this.updateValue}
                            rtl={this.state.rtl}
                            searchable={this.state.searchable}
                        />
                    </div>
                </div>
        );
    }

    render() {
        console.log(this);
        if (!this.runOnce && this.props.isReady) {
            this.runOnce = true;
            this.initData();
        }
        const { handleSubmit } = this.props;
        let form = 'Loading...';
        if (this.state.loaded) {
            return (
                <div className="container-fluid">
                    <form onSubmit={handleSubmit} className="form-horizontal">
                        <Field
                            label="Comms Matrix"
                            loadFrom="matrices"
                            name="comms_matrix_id"
                            component={this.renderSelect2Field}
                            type="select"
                        />
                        <button
                            type="submit"
                            className="btn btn-vodafone hidden-print"
                        >
                            Submit
                        </button>
                    </form>
                </div>
            );
        }

        return <div className="container-fluid">{form}</div>;
    }
}

Я могу загрузить поле выбора при загрузке init с одним параметром. я хочу добавить / изменить список параметров, используя updateCommsMatrix, вы можете видеть, что я устанавливаю состояние, которое используется в выборе.

Я также пытался Async вариант, но с этим я не могу заставить дисплей отображать выбранное значение, и когда я нажимаю на выпадающий список, он не показывает новый список, пока я не нажму spacebar, С этим методом я храню object в this.state.selectValue Я взял этот пример отсюда

АСИНХРОННЫЙ

   <Async 
                            name={field.input.name}
                            multi={false} 
                            value={this.state.selectValue} 
                            onChange={this.updateValue} 
                            valueKey="value" 
                            labelKey="label" 
                            loadOptions={this.getCommsmatrices} 
                            onValueClick={this.gotoCommsmatrix}
                            cache={false}
                            isLoading={this.state.isLoading}
                        />



 getCommsmatrices (input, callback) {
        input = input.toLowerCase();
        let options = this.state.options.filter(i => {
            return i.label.toLowerCase().includes(input) == true;
            //return i.label.toLowerCase().substr(0, input.length) === input;
        });

        let data = {
            options: options,//.slice(0, MAX_CONTRIBUTORS),
            complete: true //options.length <= MAX_CONTRIBUTORS,
        };

        setTimeout(function() {
            callback(null, data);
        }, ASYNC_DELAY);
    }

    gotoCommsmatrix (value, event) {
        if(value.value > 0){
            window.open(window.top.protocol + '://' + window.top.hostname + '/api/user/commsmatrix/id/'+value.value+'/format/xml');
        }
    }

Мне кажется, когда я выбираю значение, в которое передается вход loadOptions пусто

0 ответов

Код с моей точки зрения очень сложен, хотя быть не должно. Если вы используете переменную свойства компонента, которая является массивом, и вы будете отображать все параметры на основе этой переменной вreact-select, он будет работать, так как изменение свойств приведет к повторному рендерингу компонента и изменению параметров реакции-выбора.

Пример не для реакции-выбора, но тоже подойдет.

Другие вопросы по тегам