Компонент React Suite Accepter не обновляет значение формы при изменении

Я использую rsuitejs для компонентов, и в форме, которую я создаю, у меня есть настраиваемый слайдер MotivationSlider, который не обновляет данные в той форме, в которой они находятся, при изменении значения. Пользовательский слайдер выглядит так:

import React, { useState } from 'react';
import { Slider } from 'rsuite';

const MotivationSlider = () => {
  const [motivation, setMotivation] = useState(2);

  return (
    <Slider
      min={0}
      max={4}
      value={motivation}
      graduated
      progress
      className="custom-slider"
      onChange={v => setMotivation(v)}
      renderMark={mark => {
        if ([0, 4].includes(mark)) {
          return <span>{mark === 0 ? 'Not Very' : 'Highly!'}</span>;
        }
        return null;
      }}
    />
  );
};

export default MotivationSlider;

Он заключен в настраиваемое поле, которое выглядит так:

// CustomField.js:
import React from 'react';
import { FormGroup, ControlLabel, FormControl, HelpBlock } from 'rsuite';

const CustomField = ({ name, message, label, accepter, error, ...props }) => {
  return (
    <FormGroup className={error ? 'has-error' : ''}>
      <ControlLabel>{label} </ControlLabel>
      <FormControl
        name={name}
        accepter={accepter}
        errorMessage={error}
        {...props}
      />
      <HelpBlock>{message}</HelpBlock>
    </FormGroup>
  );
};

export default CustomField;

// FormPage.js:
<CustomField
  accepter={MotivationSlider}
  name="motivation"
/>

Когда я изменяю значение ползунка, данные формы не меняются, однако, если я использую CustomField с таким обычным ползунком, значение формы изменится.

<CustomField 
  accepter={Slider} 
  name="motivation" 
  min={0} 
  max={4} 
/>

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

1 ответ

Решение

Пользовательские элементы управления формы должны реализовывать атрибуты onChange, value, а также defaultValue.

import React, { useState } from "react";
import { Slider } from "rsuite";

const MotivationSlider = React.forwardRef((props, ref) => {
  const { value: valueProp, defalutValue, onChange } = props;
  const [motivation, setMotivation] = useState(defalutValue);
  const value = typeof valueProp !== "undefined" ? valueProp : motivation;

  return (
    <Slider
      ref={ref}
      min={0}
      max={4}
      value={value}
      graduated
      progress
      className="custom-slider"
      onChange={(v) => {
        onChange(v);
        setMotivation(v);
      }}
      renderMark={(mark) => {
        if ([0, 4].includes(mark)) {
          return <span>{mark === 0 ? "Not Very" : "Highly!"}</span>;
        }
        return null;
      }}
    />
  );
});

export default MotivationSlider;

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