Из моего недавнего чтения кода я недавно узнал, как создавать собственные ползунки времени. Вся заслуга моему коллеге. Я просто делюсь своими знаниями! Давайте сначала посмотрим, что мы хотим сделать. Мы хотим преобразовать ползунок в ползунки времени, где пользователи могут выбрать одно время или временной диапазон.

Ползунок времени:

Во-первых, давайте настроим для этого наш компонент. С помощью этого фрагмента мы можем завершить инициализацию слайдера. Для нашего компонента слайдера я использую пакет r react-native-multi-slide. С этим пакетом вы получаете один слайдер и слайдер диапазона, так что это неплохо.

const TIME = {  min: 0,  max: 24 }
const SliderPad = 12;

// our time slider component
const SingleSlider = ({}) => {
  const { min, max } = TIME;
  const [width, setWidth] = useState(280);
  const [selected, setSelected] = useState(null);

  if (!selected) {
    setSelected([min]); // we are only selected min, since it is single slider
  }

  // Callbacks
  const onLayout = (event) => {
    setWidth(event.nativeEvent.layout.width - SliderPad * 2);
  };
  const onValuesChangeFinish = (values) => {
    setSelected(values);
  };

  return (
    <View onLayout={onLayout} style={styles.wrapper}>
        <MultiSlider
          min={min}
          max={max}
          allowOverlap
          values={selected}
          sliderLength={width}
          onValuesChangeFinish={onValuesChangeFinish}
          enableLabel={true}
          trackStyle={{
            height: 10,
            borderRadius: 8,
          }}
          markerOffsetY={3}
          selectedStyle={{
            backgroundColor: "#895CDF",
          }}
          unselectedStyle={{
            backgroundColor: "#EEF3F7",
          }}
        />
    </View>
  );
}

Ползунок времени диапазона:

Ползунок диапазона также такой же, за исключением того, что мы устанавливаем наши значения на максимальное и минимальное значение.

if (!selected) {
    setSelected([min, max]); 
  }

Итак, на этом наша первоначальная настройка закончена. У нас есть ползунки, но ползунки работают как обычные ползунки со значениями от 0 до 24. Теперь пора преобразовать это в ползунок времени.

Чтобы у нас были собственные ярлыки, нам необходимо передать свойства customLabel в наш слайдер. Мы будем создавать компонент настраиваемой метки, который будет выполнять преобразование времени и возвращать метки времени.

customLabel={SliderCustomLabel(textTransformerTimes)}

А теперь пройдемся по самому интересному.

const width = 50;

function LabelBase(props)
{
    const { position, value } = props;

    return (
        <View
            style={[
                styles.sliderLabel, // this one is position absolute
                {
                    left: position - width / 2,
                },
            ]}>
            <Text style={styles.sliderLabelText}>{value}</Text>
        </View>
    );
}

export default function SliderCustomLabel(textTransformer: (value: number) => string)
{
    return function (props)
    {
       // these props are coming from the package
        const {
            oneMarkerValue,
            twoMarkerValue,
            oneMarkerLeftPosition,
            twoMarkerLeftPosition,
        } = props;

        return (
            <View>
                <LabelBase
                    position={oneMarkerLeftPosition}
                    value={textTransformer(oneMarkerValue)}
                />
                {twoMarkerValue ? 
                    <LabelBase
                        position={twoMarkerLeftPosition}
                        value={textTransformer(twoMarkerValue)}
                    /> : null
                }
            </View>
        );
    };
}

const styles = StyleSheet.create({
    sliderLabel: {
        position: 'absolute',
        justifyContent: 'center',
        top: 30,
        width: width,
        height: width,
    },
    sliderLabelText: {
        textAlign: 'center',
        lineHeight: width,
        flex: 1,
    },
});

Немного пояснения того, что здесь происходит.

  • SliderCustomLabel - это функция, которая принимает функцию textTransformer и возвращает компоненты настраиваемой метки.
  • TextTransformer - это функция, которая принимает значение ползунка от 0 до 24 и преобразует их в значения времени.
  • LabelBase - это компонент, из которого мы возвращаем текст. Он также обрабатывает позицию для нашего текста.
const textTransformerTimes = (value) => {
  return value === 0 ? "12am" : (value < 13 ? value : value - 12) +    (value < 12 ? "am" : "pm");
};

Ознакомьтесь с закуской, если хотите увидеть ее в действии.

Спасибо за чтение. Надеюсь, вы нашли это полезным!

Больше контента на plainenglish.io