Форма Ant Design - обработчик onAfterChange

Я создал форму с помощью antd, которая выводит значения формы на консоль всякий раз, когда поле изменяется, используя функцию onValuesChange на Form.

Моя проблема в том, что компоненты Slider вызывают эту функцию onValuesChange при перетаскивании ползунка, и я бы хотел, чтобы вместо этого она находилась на onmouseup.

Я знаю, что событие onAfterChange слайдера запускает только onmouseup, но я не уверен, как заставить onValuesChange использовать onAfterChange вместо onChange. Кто-нибудь может дать совет по этому поводу?

import React, { Component } from 'react';
import { Form, Slider } from 'antd';
const FormItem = Form.Item;

class UnwrappedMyForm extends Component {
    render() {
        const { getFieldDecorator } = this.props.form;
        return (
            <Form>
                <FormItem>
                    {getFieldDecorator(`field1`, {})(
                            <Slider range defaultValue = {[0, 100]} />
                    )}
                </FormItem>
                <FormItem>
                    {getFieldDecorator(`field2`, {})(
                            <Slider range defaultValue = {[0, 100]} />
                    )}
                </FormItem>
            </Form>
        );
    }
}

const MyForm = Form.create({
    onValuesChange(props, changedValues, allValues) {
        console.info(allValues);
    }
})(UnwrappedMyForm);

export default MyForm;

Рабочий пример: https://codesandbox.io/s/z2ppnop8x

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
4 687
2

Ответы 2

вы никогда не должны этого делать! если я буду знать цель, я могу помочь тебе лучше,

но это сработает для вас:

render() {
    const { form, errorMessage } = this.props;
    const { getFieldDecorator, setFieldsValue } = form;

    return (
      <Form>
        <FormItem>
          {getFieldDecorator(`slider`, {})(
            <div>
              <Slider onAfterChange = {wantedValues => setFieldsValue({ slider: wantedValues })} range />
            </div>,
          )}
        </FormItem>
      </Form>
    );
  }
}
export default Form.create({
  onValuesChange(props, changedValues, allValues) {
    console.info('on change', allValues);
  },

Значение ползунка и значение поля ползунка являются отдельными, и вы обновляете значение поля вручную.

Спасибо за помощь @ U.Rush. Итак, приведенный вами пример решает проблему, но вы рекомендуете никогда не делать этого таким образом - верно? Причина моего вопроса в том, что я делаю вызов Ajax в onValuesChange, поэтому хотел бы, чтобы он просто выполнял один вызов при отпускании мыши, а не множество запросов, пока ползунок перетаскивается

James 12.01.2019 11:32

так что вы можете решить эту проблему двумя способами. Вариант 1 фильтрует результат onChange и вызывает запрос Ajax только тогда, когда он имеет окончательный результат (используйте что-то вроде debounce или throttle. Эти функции-обертки призывают к действию сразу после периода времени с последнего вызова .) Объясните функции: https://medium.com/walkme-engineering/debounce-and-throttle-‌​in-real-life-scenari‌​os-1cc7e2e38c68 Используйте библиотеку lodash и не реализуйте ее самостоятельно, это облегчит вам задачу.

U.Rush 12.01.2019 11:45

вариант 2) используйте кнопку «отправить» - когда пользователь нажимает кнопку «сохранить» в модальном, отправляется запрос Ajax или призыв к действию для распространения желаемого результата в модальный контейнер.

U.Rush 12.01.2019 11:45

Я столкнулся с той же проблемой, и, возможно, это более простой подход:

Ключевым моментом является поддержание внутреннего состояния для этого компонента ползунка и отправка желаемого значения через onChange во время onAfterChange.

const MouseUpSlider = ({ value, onChange, ...rest }) => {
  const [val, setVal] = useState(value)

  return (
    <Slider
      value = {val}
      onAfterChange = {(value) => onChange(value)}
      onChange = {(value) => setVal(value)}
      {...rest}
    />
  )
}

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