React DatePicker загружается со значением по умолчанию, но затем не изменится при изменении состояния - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть компонент, который отображает х количество DateInputs на основе х количество платежей. Входные данные даты должны отображаться со значением по умолчанию, загруженным с сервера. После запуска onChange он обновляет состояние в родительском элементе и печатает консоль с выбранной датой, используя computedProperty. Чтобы дать больше контекста, вот изображение страницы:

enter image description here

A, как вы можете видеть, указатель даты отображается для каждого сбора, а пользователь нуждается в Возможность изменить дату оплаты. Таким образом, с точки зрения потока данных, onChange в дочернем компоненте вызывает метод handleChargesDateChange в родительском элементе, так как состояние должно храниться в родительском компоненте.

В данный момент дата начисления по умолчанию отображается в раскрывающийся список, но при выполнении onChange значение даты не изменяется. Однако метод выводит правильную дату, которая была выбрана. Опять же, для большего контекста, приведен скриншот данных, хранящихся в parent, когда дочерний элемент выполняет onChange в средстве выбора даты.

enter image description here

Как видите, значения даты изменяются, когда пользователь выбирает одно из каждого средства выбора даты. Однако фактическое значение DatePicker остается прежним. Я могу заставить его работать там, где он рендерится с пустой датой для каждого средства выбора даты, и когда пользователь выбирает новую дату, он будет отображать средство выбора даты с выбранной датой. Он также сохранил значение в parent. Но я действительно изо всех сил пытаюсь отобразить значение defalt, но когда оно меняется, обновите указатель даты с выбранным пользователем значением ... Надеюсь, это имеет смысл ... В любом случае вот код. Таким образом, метод, который запускается в родительском:

 handleChargesDateChange = (e) => {
    const date = e.target.value;
    const momentDate = moment(date);
    const chargeId = e.target.name;
    console.log(date);
    console.log(momentDate);
    this.setState({
        updatedChargeDates: [
            ...this.state.updatedChargeDates,
            {[chargeId]: date}
        ]
    }, () => console.log(this.state.updatedChargeDates))
}

Затем передается (около 3 дочерних элементов) через:

  <Grid.Row>
            <Grid.Column width={16}>
                <OrderSummary
                    order={this.state.order}
                    fuelTypes={this.state.fuelTypes}
                    vehicleClasses={this.state.vehicleClasses}
                    deviceTypes={this.state.deviceTypes}
                    chargeTypes={this.state.chargeTypes}
                    featureTypes={this.state.featureTypes}
                    itemGroups={this.state.itemGroups}
                    itemTypes={this.state.itemTypes}
                    updateChargeDates={this.handleChargesDateChange}
                    chargeDates={this.state.updatedChargeDates}
                />
            </Grid.Column>

Я пропущу различные другие дочерние компоненты, которые метод передается и go прямо на созданный компонент. Таким образом, метод приземляется на Charges:

 export class Charges extends Component {

constructor(props) {
    super(props);

    this.state = {
        currentItem: 0,
        newDate: '',
        fields: {}
    }
}

render() {
 const {charges, chargeTypes, updateChargeDates, chargeDates} = this.props;

 console.log('Props method', charges);
 if (charges.length === 0) { return null; }

return <Form>
    <h3>Charges</h3>
    {charges.map(charge => {

        console.log(charge);
        const chargeType = chargeTypes.find(type => type.code === charge.type) || {};
        return <Grid>
            <Grid.Row columns={2}>
                <Grid.Column>
                    <Form.Input
                        key={charge.id}
                        label={chargeType.description || charge.type}
                        value={Number(charge.amount).toFixed(2)}
                        readOnly
                        width={6} />
                </Grid.Column>
                <Grid.Column>
                    <DateInput
                        name={charge.id}
                        selected={this.state.newDate}
                        ***onChange={updateChargeDates}***
                        ***value={chargeDates[charge.id] == null ? charge.effectiveDate : chargeDates[charge.id]}***
                    />
                </Grid.Column>
            </Grid.Row>
        </Grid>
    })}
    <Divider hidden />
    <br />
</Form>
}

Я выделил код преступника с помощью ***, чтобы было легче следовать. Я использую оператор троичного типа, чтобы определить, какое значение отображать, но оно не обновляется, когда я выбираю значение. Я подумал, что из кода, который у меня есть, если начальный chargeDates[charge.id] равен нулю, то мы отображаем charge.effectiveDate это то, что он делает, но как только я изменю дату, я ожидаю, что chargeDates[charge.id] будет иметь значение, которое, в свою очередь, должно отображать это значение ...

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

У меня есть желание следовать следующим ресурсам, но это действительно не дает мне то, что я хочу:

Несколько DatePickers в состоянии

Состояние Daepicker

Если вам нужно больше вопросов или пожалуйста, дайте мне знать!

1 Ответ

1 голос
/ 18 февраля 2020

Глядя на ваш скриншот, updatedChargeDates (chargeDates prop) - это массив объектов. Массив имеет индексы 0, 1 и 2, но вы обращаетесь к нему в DateInput следующим образом chargeDates[charge.id], например, вы пытаетесь получить данные по индексу 431780, который возвращает undefined, и, таким образом, условие chargeDates[charge.id] == null ? charge.effectiveDate : chargeDates[charge.id] , всегда будет возвращать charge.effectiveDate.

. Вы можете исправить это в handleChargesDateChange, сделав updatedChargeDates объект, подобный этому:

 handleChargesDateChange = (e) => {
    const date = e.target.value;
    const momentDate = moment(date);
    const chargeId = e.target.name;
    console.log(date);
    console.log(momentDate);
    this.setState({
        updatedChargeDates: {
            ...this.state.updatedChargeDates,
            [chargeId]: date
        }
    }, () => console.log(this.state.updatedChargeDates))
}
...