@xhsreds/reds-rn-next 0.10.1-beta202511041914 → 0.10.1-beta202511051557

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/coverage/.tmp/coverage-0.json +1 -1
  2. package/coverage/.tmp/coverage-1.json +1 -1
  3. package/coverage/.tmp/coverage-10.json +1 -1
  4. package/coverage/.tmp/coverage-11.json +1 -1
  5. package/coverage/.tmp/coverage-12.json +1 -1
  6. package/coverage/.tmp/coverage-13.json +1 -1
  7. package/coverage/.tmp/coverage-14.json +1 -1
  8. package/coverage/.tmp/coverage-15.json +1 -1
  9. package/coverage/.tmp/coverage-16.json +1 -1
  10. package/coverage/.tmp/coverage-18.json +1 -1
  11. package/coverage/.tmp/coverage-19.json +1 -1
  12. package/coverage/.tmp/coverage-2.json +1 -1
  13. package/coverage/.tmp/coverage-20.json +1 -1
  14. package/coverage/.tmp/coverage-21.json +1 -1
  15. package/coverage/.tmp/coverage-22.json +1 -1
  16. package/coverage/.tmp/coverage-23.json +1 -1
  17. package/coverage/.tmp/coverage-24.json +1 -1
  18. package/coverage/.tmp/coverage-25.json +1 -1
  19. package/coverage/.tmp/coverage-27.json +1 -1
  20. package/coverage/.tmp/coverage-28.json +1 -1
  21. package/coverage/.tmp/coverage-29.json +1 -1
  22. package/coverage/.tmp/coverage-3.json +1 -1
  23. package/coverage/.tmp/coverage-32.json +1 -1
  24. package/coverage/.tmp/coverage-33.json +1 -1
  25. package/coverage/.tmp/coverage-34.json +1 -1
  26. package/coverage/.tmp/coverage-35.json +1 -1
  27. package/coverage/.tmp/coverage-4.json +1 -1
  28. package/coverage/.tmp/coverage-40.json +1 -1
  29. package/coverage/.tmp/coverage-42.json +1 -1
  30. package/coverage/.tmp/coverage-5.json +1 -1
  31. package/coverage/.tmp/coverage-7.json +1 -1
  32. package/coverage/.tmp/coverage-8.json +1 -1
  33. package/coverage/.tmp/coverage-9.json +1 -1
  34. package/lib/cjs/components/Slider/Slider.js +74 -34
  35. package/lib/cjs/components/Slider/Slider.js.map +1 -1
  36. package/lib/esm/components/Slider/Slider.js +76 -36
  37. package/lib/esm/components/Slider/Slider.js.map +1 -1
  38. package/lib/src/components/Slider/Slider.d.ts +1 -1
  39. package/lib/types/components/Slider/Slider.d.ts +1 -1
  40. package/package.json +2 -2
  41. package/src/components/Slider/Slider.tsx +103 -37
  42. package/src/components/Slider/demo/index.tsx +18 -0
@@ -1,6 +1,6 @@
1
1
  import { _ as _slicedToArray, a as _objectSpread2 } from '../../_chunks/CAkwE9ZD.js';
2
- import React, { useState, useRef, useEffect } from 'react';
3
- import { PanResponder, Dimensions, Animated, StyleSheet, TouchableWithoutFeedback, View } from 'react-native';
2
+ import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';
3
+ import { Dimensions, Animated, PanResponder, StyleSheet, View, TouchableWithoutFeedback } from 'react-native';
4
4
  import { S as SliderDefaultProps } from '../../_chunks/BwgGhxV7.js';
5
5
  import useMounted from '../../pvCount/useUnmountedProcess.js';
6
6
  import '@xhs/reds-apm/src/index.native';
@@ -16,64 +16,91 @@ var Slider = function Slider(_ref) {
16
16
  initalValue = _ref$initalValue === void 0 ? 0 : _ref$initalValue,
17
17
  onValueChange = _ref.onValueChange,
18
18
  _ref$dotStyle = _ref.dotStyle,
19
- dotStyle = _ref$dotStyle === void 0 ? {} : _ref$dotStyle;
19
+ dotStyle = _ref$dotStyle === void 0 ? {} : _ref$dotStyle,
20
+ _ref$step = _ref.step,
21
+ step = _ref$step === void 0 ? 1 : _ref$step;
20
22
  useMounted("Slider");
21
- var _useState = useState(PanResponder.create({})),
23
+ var _useState = useState(Dimensions.get("window").width),
22
24
  _useState2 = _slicedToArray(_useState, 2),
23
- panResponder = _useState2[0],
24
- setPanResponder = _useState2[1];
25
- var _useState3 = useState(Dimensions.get("window").width * 0.8),
25
+ sliderWidth = _useState2[0],
26
+ setSliderWidth = _useState2[1];
27
+ var _useState3 = useState(initalValue),
26
28
  _useState4 = _slicedToArray(_useState3, 2),
27
- sliderWidth = _useState4[0],
28
- setSliderWidth = _useState4[1];
29
- var _useState5 = useState(initalValue),
30
- _useState6 = _slicedToArray(_useState5, 2),
31
- value = _useState6[0],
32
- setValue = _useState6[1];
29
+ value = _useState4[0],
30
+ setValue = _useState4[1];
33
31
  if (max < min) {
34
32
  return;
35
33
  }
36
34
  if (value < min || value > max) {
37
35
  return;
38
36
  }
37
+ var getSteppedValue = useCallback(function (rawValue) {
38
+ var steppedValue = Math.round((rawValue - min) / step) * step + min;
39
+ return Math.max(min, Math.min(max, steppedValue));
40
+ }, [min, max, step]);
39
41
  var animatedValue = useRef(new Animated.Value(initalValue * sliderWidth / (max - min))).current;
42
+ var animatedThumbValue = useRef(new Animated.Value(initalValue * sliderWidth / (max - min) > 0 ? initalValue * sliderWidth / (max - min) - 8 : initalValue * sliderWidth / (max - min))).current;
40
43
  useEffect(function () {
41
44
  var handleOrientationChange = function handleOrientationChange() {
42
- setSliderWidth(Dimensions.get("window").width * 0.8);
45
+ setSliderWidth(Dimensions.get("window").width);
43
46
  };
44
47
  var subscription = Dimensions.addEventListener("change", handleOrientationChange);
45
- createPanResponder();
46
48
  return function () {
47
49
  subscription.remove();
48
50
  };
49
51
  }, []);
50
- var hanleValueUpdate = function hanleValueUpdate(gestureState) {
51
- var currentValue = Math.max(min, Math.min(max, gestureState.dx / sliderWidth * (max - min) + initalValue));
52
- setValue(currentValue);
53
- animatedValue.setValue(currentValue * sliderWidth / (max - min));
52
+ var hanleValueUpdate = useCallback(function (gestureState) {
53
+ var rawValue = Math.max(min, Math.min(max, gestureState.dx / sliderWidth * (max - min) + initalValue));
54
+ var steppedValue = getSteppedValue(rawValue);
55
+ setValue(steppedValue);
56
+ animatedValue.setValue(steppedValue * sliderWidth / (max - min));
57
+ animatedThumbValue.setValue(steppedValue * sliderWidth / (max - min) > 0 ? steppedValue * sliderWidth / (max - min) - 8 : steppedValue * sliderWidth / (max - min));
54
58
  if (onValueChange) {
55
- onValueChange(currentValue);
59
+ onValueChange(steppedValue);
56
60
  }
57
- };
61
+ }, [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange]);
62
+ var handleTrackPress = useCallback(function (event) {
63
+ var locationX = event.nativeEvent.locationX;
64
+ var rawValue = locationX / sliderWidth * (max - min) + min;
65
+ var steppedValue = getSteppedValue(rawValue);
66
+ setValue(steppedValue);
67
+ Animated.timing(animatedValue, {
68
+ toValue: steppedValue * sliderWidth / (max - min),
69
+ duration: 200,
70
+ useNativeDriver: false
71
+ }).start();
72
+ Animated.timing(animatedThumbValue, {
73
+ toValue: steppedValue * sliderWidth / (max - min) > 0 ? steppedValue * sliderWidth / (max - min) - 8 : steppedValue * sliderWidth / (max - min),
74
+ duration: 200,
75
+ useNativeDriver: false
76
+ }).start();
77
+ if (onValueChange) {
78
+ onValueChange(steppedValue);
79
+ }
80
+ }, [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue]);
58
81
  var handleLayout = function handleLayout(event) {
59
82
  setSliderWidth(event.nativeEvent.layout.width);
60
83
  };
61
- var createPanResponder = function createPanResponder() {
62
- setPanResponder(PanResponder.create({
84
+ var panResponder = useMemo(function () {
85
+ return PanResponder.create({
63
86
  onStartShouldSetPanResponder: function onStartShouldSetPanResponder() {
64
87
  return true;
65
88
  },
66
89
  onMoveShouldSetPanResponder: function onMoveShouldSetPanResponder() {
67
90
  return true;
68
91
  },
69
- onPanResponderGrant: function onPanResponderGrant() {},
70
- onPanResponderRelease: function onPanResponderRelease() {},
92
+ onPanResponderGrant: function onPanResponderGrant() {
93
+ return true;
94
+ },
95
+ onPanResponderRelease: function onPanResponderRelease() {
96
+ return true;
97
+ },
71
98
  onPanResponderTerminate: function onPanResponderTerminate() {},
72
99
  onPanResponderMove: function onPanResponderMove(evt, gestureState) {
73
100
  hanleValueUpdate(gestureState);
74
101
  }
75
- }));
76
- };
102
+ });
103
+ }, [hanleValueUpdate]);
77
104
  var styles2 = StyleSheet.create({
78
105
  sliderContainer: {
79
106
  flexDirection: "row",
@@ -81,7 +108,7 @@ var Slider = function Slider(_ref) {
81
108
  justifyContent: "center"
82
109
  },
83
110
  trackContainer: {
84
- width: "80%",
111
+ width: "100%",
85
112
  height: 4,
86
113
  backgroundColor: "rgba(48, 48, 52, 0.20)",
87
114
  borderRadius: 2
@@ -109,24 +136,37 @@ var Slider = function Slider(_ref) {
109
136
  elevation: 2
110
137
  }
111
138
  });
112
- return /* @__PURE__ */React.createElement(TouchableWithoutFeedback, {
113
- onPress: function onPress(e) {}
139
+ return /* @__PURE__ */React.createElement(View, {
140
+ style: styles2.sliderContainer
114
141
  }, /* @__PURE__ */React.createElement(View, {
115
- style: styles2.sliderContainer,
142
+ style: styles2.trackContainer,
116
143
  onLayout: handleLayout
144
+ }, /* @__PURE__ */React.createElement(TouchableWithoutFeedback, {
145
+ onPress: handleTrackPress
117
146
  }, /* @__PURE__ */React.createElement(View, {
118
- style: styles2.trackContainer
119
- }, /* @__PURE__ */React.createElement(Animated.View, {
147
+ style: {
148
+ position: "absolute",
149
+ width: "100%",
150
+ height: 4
151
+ }
152
+ })), /* @__PURE__ */React.createElement(Animated.View, {
120
153
  style: [styles2.coloredTrack, {
121
154
  width: animatedValue
122
155
  }]
123
- }), /* @__PURE__ */React.createElement(Animated.View, _objectSpread2({
156
+ }), /* @__PURE__ */React.createElement(Animated.View, _objectSpread2(_objectSpread2({
124
157
  style: [styles2.thumbButton, {
125
158
  transform: [{
126
- translateX: animatedValue
159
+ translateX: animatedThumbValue
127
160
  }]
128
161
  }, dotStyle]
129
- }, panResponder.panHandlers)))));
162
+ }, panResponder.panHandlers), {}, {
163
+ hitSlop: {
164
+ top: 20,
165
+ bottom: 20,
166
+ left: 20,
167
+ right: 20
168
+ }
169
+ }))));
130
170
  };
131
171
  Slider.defaultProps = SliderDefaultProps;
132
172
 
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.js","sources":["../../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport {\n View,\n TouchableWithoutFeedback,\n Animated,\n StyleSheet,\n Dimensions,\n GestureResponderEvent,\n PanResponder,\n LayoutChangeEvent,\n PanResponderGestureState,\n} from \"react-native\";\n\nimport { RedsSlider, SliderDefaultProps } from \"./interface/index\";\nimport styles from \"./styles\";\nimport useMounted from \"../../pvCount/useUnmountedProcess\";\n\nconst Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChange, dotStyle = {} }: RedsSlider) => {\n useMounted(\"Slider\");\n const [panResponder, setPanResponder] = useState(PanResponder.create({}));\n const [sliderWidth, setSliderWidth] = useState(Dimensions.get(\"window\").width * 0.8);\n const [value, setValue] = useState(initalValue);\n\n if (max < min) {\n return;\n }\n if (value < min || value > max) {\n return;\n }\n\n const thumbPosition = (value / (max - min)) * sliderWidth;\n const step = 1;\n const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;\n useEffect(() => {\n const handleOrientationChange = () => {\n setSliderWidth(Dimensions.get(\"window\").width * 0.8);\n };\n\n const subscription = Dimensions.addEventListener(\"change\", handleOrientationChange);\n createPanResponder();\n return () => {\n subscription.remove();\n //Dimensions.removeEventListener(\"change\", handleOrientationChange);\n };\n }, []);\n\n // 可以根据需要调整的滑块高度\n const hanleValueUpdate = (gestureState: PanResponderGestureState) => {\n const currentValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));\n\n setValue(currentValue);\n animatedValue.setValue((currentValue * sliderWidth) / (max - min));\n if (onValueChange) {\n onValueChange(currentValue);\n }\n };\n\n const handleLayout = (event: LayoutChangeEvent) => {\n setSliderWidth(event.nativeEvent.layout.width);\n };\n\n const createPanResponder = () => {\n setPanResponder(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {},\n onPanResponderRelease: () => {},\n onPanResponderTerminate: () => {},\n onPanResponderMove: (evt, gestureState) => {\n hanleValueUpdate(gestureState);\n },\n }),\n );\n };\n\n const styles = StyleSheet.create({\n sliderContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n trackContainer: {\n width: \"80%\",\n height: 4,\n backgroundColor: \"rgba(48, 48, 52, 0.20)\",\n borderRadius: 2,\n },\n coloredTrack: {\n height: 4,\n backgroundColor: \"#FF2442\",\n borderRadius: 2,\n },\n thumbButton: {\n width: 16,\n height: 16,\n position: \"absolute\",\n top: -8,\n borderRadius: 10,\n backgroundColor: \"#FFF\",\n shadowColor: \"rgba(0, 0, 0, 0.20)\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 1,\n shadowRadius: 4,\n //Android\n elevation: 2,\n },\n });\n\n //<View style={[styles.track, { width: sliderWidth }]}>\n //<View style={[styles.thumb, { left: thumbPosition }]} {...panResponder.panHandlers} />\n //</View>\n return (\n <TouchableWithoutFeedback onPress={(e) => {}}>\n <View style={styles.sliderContainer} onLayout={handleLayout}>\n <View style={styles.trackContainer}>\n <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />\n <Animated.View\n style={[styles.thumbButton, { transform: [{ translateX: animatedValue }] }, dotStyle]}\n {...panResponder.panHandlers}\n />\n </View>\n </View>\n </TouchableWithoutFeedback>\n );\n};\n\nSlider.defaultProps = SliderDefaultProps;\nexport default Slider;\n"],"names":["Slider","_ref","defaultValue","_ref$min","min","_ref$max","max","_ref$initalValue","initalValue","onValueChange","_ref$dotStyle","dotStyle","useMounted","_useState","useState","PanResponder","create","_useState2","_slicedToArray","panResponder","setPanResponder","_useState3","Dimensions","get","width","_useState4","sliderWidth","setSliderWidth","_useState5","_useState6","value","setValue","animatedValue","useRef","Animated","Value","current","useEffect","handleOrientationChange","subscription","addEventListener","createPanResponder","remove","hanleValueUpdate","gestureState","currentValue","Math","dx","handleLayout","event","nativeEvent","layout","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderGrant","onPanResponderRelease","onPanResponderTerminate","onPanResponderMove","evt","styles","StyleSheet","sliderContainer","flexDirection","alignItems","justifyContent","trackContainer","height","backgroundColor","borderRadius","coloredTrack","thumbButton","position","top","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","React","createElement","TouchableWithoutFeedback","onPress","e","View","style","onLayout","_objectSpread","transform","translateX","panHandlers","defaultProps","SliderDefaultProps"],"mappings":"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"}
1
+ {"version":3,"file":"Slider.js","sources":["../../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport {\n View,\n TouchableWithoutFeedback,\n Animated,\n StyleSheet,\n Dimensions,\n GestureResponderEvent,\n PanResponder,\n LayoutChangeEvent,\n PanResponderGestureState,\n} from \"react-native\";\n\nimport { RedsSlider, SliderDefaultProps } from \"./interface/index\";\nimport styles from \"./styles\";\nimport useMounted from \"../../pvCount/useUnmountedProcess\";\n\nconst Slider = ({\n defaultValue,\n min = 0,\n max = 100,\n initalValue = 0,\n onValueChange,\n dotStyle = {},\n step = 1,\n}: RedsSlider) => {\n useMounted(\"Slider\");\n const [sliderWidth, setSliderWidth] = useState(Dimensions.get(\"window\").width);\n const [value, setValue] = useState(initalValue);\n\n if (max < min) {\n return;\n }\n if (value < min || value > max) {\n return;\n }\n\n // 添加一个函数来计算最接近的step值\n const getSteppedValue = useCallback(\n (rawValue: number) => {\n const steppedValue = Math.round((rawValue - min) / step) * step + min;\n return Math.max(min, Math.min(max, steppedValue));\n },\n [min, max, step],\n );\n\n const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;\n\n const animatedThumbValue = useRef(\n new Animated.Value(\n (initalValue * sliderWidth) / (max - min) > 0\n ? (initalValue * sliderWidth) / (max - min) - 8\n : (initalValue * sliderWidth) / (max - min),\n ),\n ).current;\n\n useEffect(() => {\n const handleOrientationChange = () => {\n setSliderWidth(Dimensions.get(\"window\").width);\n };\n\n const subscription = Dimensions.addEventListener(\"change\", handleOrientationChange);\n return () => {\n subscription.remove();\n };\n }, []);\n\n // 可以根据需要调整的滑块高度\n const hanleValueUpdate = useCallback(\n (gestureState: PanResponderGestureState) => {\n // 计算原始值\n const rawValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));\n // 根据step计算实际值\n const steppedValue = getSteppedValue(rawValue);\n\n setValue(steppedValue);\n animatedValue.setValue((steppedValue * sliderWidth) / (max - min));\n animatedThumbValue.setValue(\n (steppedValue * sliderWidth) / (max - min) > 0\n ? (steppedValue * sliderWidth) / (max - min) - 8\n : (steppedValue * sliderWidth) / (max - min),\n );\n\n if (onValueChange) {\n onValueChange(steppedValue);\n }\n },\n [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange],\n );\n\n // 添加点击轨道跳转功能(可选)\n const handleTrackPress = useCallback(\n (event: GestureResponderEvent) => {\n const { locationX } = event.nativeEvent;\n const rawValue = (locationX / sliderWidth) * (max - min) + min;\n const steppedValue = getSteppedValue(rawValue);\n\n setValue(steppedValue);\n\n // 使用动画过渡到新位置\n Animated.timing(animatedValue, {\n toValue: (steppedValue * sliderWidth) / (max - min),\n duration: 200,\n useNativeDriver: false,\n }).start();\n\n Animated.timing(animatedThumbValue, {\n toValue:\n (steppedValue * sliderWidth) / (max - min) > 0\n ? (steppedValue * sliderWidth) / (max - min) - 8\n : (steppedValue * sliderWidth) / (max - min),\n duration: 200,\n useNativeDriver: false,\n }).start();\n\n if (onValueChange) {\n onValueChange(steppedValue);\n }\n },\n [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue],\n );\n\n const handleLayout = (event: LayoutChangeEvent) => {\n setSliderWidth(event.nativeEvent.layout.width);\n };\n\n const panResponder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => true,\n onPanResponderRelease: () => true,\n onPanResponderTerminate: () => {},\n onPanResponderMove: (evt, gestureState) => {\n hanleValueUpdate(gestureState);\n },\n }),\n [hanleValueUpdate],\n );\n\n const styles = StyleSheet.create({\n sliderContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n trackContainer: {\n width: \"100%\",\n height: 4,\n backgroundColor: \"rgba(48, 48, 52, 0.20)\",\n borderRadius: 2,\n },\n coloredTrack: {\n height: 4,\n backgroundColor: \"#FF2442\",\n borderRadius: 2,\n },\n thumbButton: {\n width: 16,\n height: 16,\n position: \"absolute\",\n top: -8,\n borderRadius: 10,\n backgroundColor: \"#FFF\",\n shadowColor: \"rgba(0, 0, 0, 0.20)\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 1,\n shadowRadius: 4,\n //Android\n elevation: 2,\n },\n });\n\n return (\n <View style={styles.sliderContainer}>\n <View style={styles.trackContainer} onLayout={handleLayout}>\n {/* 添加可点击的轨道 */}\n <TouchableWithoutFeedback onPress={handleTrackPress}>\n <View style={{ position: \"absolute\", width: \"100%\", height: 4 }} />\n </TouchableWithoutFeedback>\n\n <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />\n <Animated.View\n style={[styles.thumbButton, { transform: [{ translateX: animatedThumbValue }] }, dotStyle]}\n {...panResponder.panHandlers}\n hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}\n />\n </View>\n </View>\n );\n};\n\nSlider.defaultProps = SliderDefaultProps;\nexport default Slider;\n"],"names":["Slider","_ref","defaultValue","_ref$min","min","_ref$max","max","_ref$initalValue","initalValue","onValueChange","_ref$dotStyle","dotStyle","_ref$step","step","useMounted","_useState","useState","Dimensions","get","width","_useState2","_slicedToArray","sliderWidth","setSliderWidth","_useState3","_useState4","value","setValue","getSteppedValue","useCallback","rawValue","steppedValue","Math","round","animatedValue","useRef","Animated","Value","current","animatedThumbValue","useEffect","handleOrientationChange","subscription","addEventListener","remove","hanleValueUpdate","gestureState","dx","handleTrackPress","event","locationX","nativeEvent","timing","toValue","duration","useNativeDriver","start","handleLayout","layout","panResponder","useMemo","PanResponder","create","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderGrant","onPanResponderRelease","onPanResponderTerminate","onPanResponderMove","evt","styles","StyleSheet","sliderContainer","flexDirection","alignItems","justifyContent","trackContainer","height","backgroundColor","borderRadius","coloredTrack","thumbButton","position","top","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","View","style","React","createElement","onLayout","TouchableWithoutFeedback","onPress","_objectSpread","transform","translateX","panHandlers","hitSlop","bottom","left","right","defaultProps","SliderDefaultProps"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { RedsSlider } from "./interface/index";
3
3
  declare const Slider: {
4
- ({ defaultValue, min, max, initalValue, onValueChange, dotStyle }: RedsSlider): React.JSX.Element;
4
+ ({ defaultValue, min, max, initalValue, onValueChange, dotStyle, step, }: RedsSlider): React.JSX.Element;
5
5
  defaultProps: {
6
6
  value: number;
7
7
  min: number;
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { RedsSlider } from "./interface/index";
3
3
  declare const Slider: {
4
- ({ defaultValue, min, max, initalValue, onValueChange, dotStyle }: RedsSlider): React.JSX.Element | undefined;
4
+ ({ defaultValue, min, max, initalValue, onValueChange, dotStyle, step, }: RedsSlider): React.JSX.Element | undefined;
5
5
  defaultProps: {
6
6
  value: number;
7
7
  min: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xhsreds/reds-rn-next",
3
- "version": "0.10.1-beta202511041914",
3
+ "version": "0.10.1-beta202511051557",
4
4
  "author": "贾斌(呀哈) <jiabin@xiaohongshu.com>",
5
5
  "license": "ISC",
6
6
  "dependencies": {
@@ -26,7 +26,7 @@
26
26
  "react-native-fs": "2.20.0",
27
27
  "react-native-svg": "13.14.0",
28
28
  "@xhs/react-native-harmony": "*",
29
- "@xhsreds/reds-token-next": "0.10.1-beta202511041914"
29
+ "@xhsreds/reds-token-next": "0.10.1-beta202511051557"
30
30
  },
31
31
  "peerDependenciesMeta": {
32
32
  "ozone-schema-web": {
@@ -15,10 +15,17 @@ import { RedsSlider, SliderDefaultProps } from "./interface/index";
15
15
  import styles from "./styles";
16
16
  import useMounted from "../../pvCount/useUnmountedProcess";
17
17
 
18
- const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChange, dotStyle = {} }: RedsSlider) => {
18
+ const Slider = ({
19
+ defaultValue,
20
+ min = 0,
21
+ max = 100,
22
+ initalValue = 0,
23
+ onValueChange,
24
+ dotStyle = {},
25
+ step = 1,
26
+ }: RedsSlider) => {
19
27
  useMounted("Slider");
20
- const [panResponder, setPanResponder] = useState(PanResponder.create({}));
21
- const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width * 0.8);
28
+ const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width);
22
29
  const [value, setValue] = useState(initalValue);
23
30
 
24
31
  if (max < min) {
@@ -28,51 +35,109 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
28
35
  return;
29
36
  }
30
37
 
31
- const thumbPosition = (value / (max - min)) * sliderWidth;
32
- const step = 1;
38
+ // 添加一个函数来计算最接近的step值
39
+ const getSteppedValue = useCallback(
40
+ (rawValue: number) => {
41
+ const steppedValue = Math.round((rawValue - min) / step) * step + min;
42
+ return Math.max(min, Math.min(max, steppedValue));
43
+ },
44
+ [min, max, step],
45
+ );
46
+
33
47
  const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;
48
+
49
+ const animatedThumbValue = useRef(
50
+ new Animated.Value(
51
+ (initalValue * sliderWidth) / (max - min) > 0
52
+ ? (initalValue * sliderWidth) / (max - min) - 8
53
+ : (initalValue * sliderWidth) / (max - min),
54
+ ),
55
+ ).current;
56
+
34
57
  useEffect(() => {
35
58
  const handleOrientationChange = () => {
36
- setSliderWidth(Dimensions.get("window").width * 0.8);
59
+ setSliderWidth(Dimensions.get("window").width);
37
60
  };
38
61
 
39
62
  const subscription = Dimensions.addEventListener("change", handleOrientationChange);
40
- createPanResponder();
41
63
  return () => {
42
64
  subscription.remove();
43
- //Dimensions.removeEventListener("change", handleOrientationChange);
44
65
  };
45
66
  }, []);
46
67
 
47
68
  // 可以根据需要调整的滑块高度
48
- const hanleValueUpdate = (gestureState: PanResponderGestureState) => {
49
- const currentValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));
50
-
51
- setValue(currentValue);
52
- animatedValue.setValue((currentValue * sliderWidth) / (max - min));
53
- if (onValueChange) {
54
- onValueChange(currentValue);
55
- }
56
- };
69
+ const hanleValueUpdate = useCallback(
70
+ (gestureState: PanResponderGestureState) => {
71
+ // 计算原始值
72
+ const rawValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));
73
+ // 根据step计算实际值
74
+ const steppedValue = getSteppedValue(rawValue);
75
+
76
+ setValue(steppedValue);
77
+ animatedValue.setValue((steppedValue * sliderWidth) / (max - min));
78
+ animatedThumbValue.setValue(
79
+ (steppedValue * sliderWidth) / (max - min) > 0
80
+ ? (steppedValue * sliderWidth) / (max - min) - 8
81
+ : (steppedValue * sliderWidth) / (max - min),
82
+ );
83
+
84
+ if (onValueChange) {
85
+ onValueChange(steppedValue);
86
+ }
87
+ },
88
+ [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange],
89
+ );
90
+
91
+ // 添加点击轨道跳转功能(可选)
92
+ const handleTrackPress = useCallback(
93
+ (event: GestureResponderEvent) => {
94
+ const { locationX } = event.nativeEvent;
95
+ const rawValue = (locationX / sliderWidth) * (max - min) + min;
96
+ const steppedValue = getSteppedValue(rawValue);
97
+
98
+ setValue(steppedValue);
99
+
100
+ // 使用动画过渡到新位置
101
+ Animated.timing(animatedValue, {
102
+ toValue: (steppedValue * sliderWidth) / (max - min),
103
+ duration: 200,
104
+ useNativeDriver: false,
105
+ }).start();
106
+
107
+ Animated.timing(animatedThumbValue, {
108
+ toValue:
109
+ (steppedValue * sliderWidth) / (max - min) > 0
110
+ ? (steppedValue * sliderWidth) / (max - min) - 8
111
+ : (steppedValue * sliderWidth) / (max - min),
112
+ duration: 200,
113
+ useNativeDriver: false,
114
+ }).start();
115
+
116
+ if (onValueChange) {
117
+ onValueChange(steppedValue);
118
+ }
119
+ },
120
+ [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue],
121
+ );
57
122
 
58
123
  const handleLayout = (event: LayoutChangeEvent) => {
59
124
  setSliderWidth(event.nativeEvent.layout.width);
60
125
  };
61
126
 
62
- const createPanResponder = () => {
63
- setPanResponder(
127
+ const panResponder = useMemo(
128
+ () =>
64
129
  PanResponder.create({
65
130
  onStartShouldSetPanResponder: () => true,
66
131
  onMoveShouldSetPanResponder: () => true,
67
- onPanResponderGrant: () => {},
68
- onPanResponderRelease: () => {},
132
+ onPanResponderGrant: () => true,
133
+ onPanResponderRelease: () => true,
69
134
  onPanResponderTerminate: () => {},
70
135
  onPanResponderMove: (evt, gestureState) => {
71
136
  hanleValueUpdate(gestureState);
72
137
  },
73
138
  }),
74
- );
75
- };
139
+ [hanleValueUpdate],
140
+ );
76
141
 
77
142
  const styles = StyleSheet.create({
78
143
  sliderContainer: {
@@ -81,7 +146,7 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
81
146
  justifyContent: "center",
82
147
  },
83
148
  trackContainer: {
84
- width: "80%",
149
+ width: "100%",
85
150
  height: 4,
86
151
  backgroundColor: "rgba(48, 48, 52, 0.20)",
87
152
  borderRadius: 2,
@@ -107,21 +172,22 @@ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChan
107
172
  },
108
173
  });
109
174
 
110
- //<View style={[styles.track, { width: sliderWidth }]}>
111
- //<View style={[styles.thumb, { left: thumbPosition }]} {...panResponder.panHandlers} />
112
- //</View>
113
175
  return (
114
- <TouchableWithoutFeedback onPress={(e) => {}}>
115
- <View style={styles.sliderContainer} onLayout={handleLayout}>
116
- <View style={styles.trackContainer}>
117
- <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />
118
- <Animated.View
119
- style={[styles.thumbButton, { transform: [{ translateX: animatedValue }] }, dotStyle]}
120
- {...panResponder.panHandlers}
121
- />
122
- </View>
176
+ <View style={styles.sliderContainer}>
177
+ <View style={styles.trackContainer} onLayout={handleLayout}>
178
+ {/* 添加可点击的轨道 */}
179
+ <TouchableWithoutFeedback onPress={handleTrackPress}>
180
+ <View style={{ position: "absolute", width: "100%", height: 4 }} />
181
+ </TouchableWithoutFeedback>
182
+
183
+ <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />
184
+ <Animated.View
185
+ style={[styles.thumbButton, { transform: [{ translateX: animatedThumbValue }] }, dotStyle]}
186
+ {...panResponder.panHandlers}
187
+ hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
188
+ />
123
189
  </View>
124
- </TouchableWithoutFeedback>
190
+ </View>
125
191
  );
126
192
  };
127
193
 
@@ -8,6 +8,7 @@ const styles = StyleSheet.create({
8
8
  justifyContent: "center",
9
9
  paddingTop: 100,
10
10
  paddingBottom: 100,
11
+ paddingHorizontal: 50,
11
12
  },
12
13
  scrollView: {
13
14
  backgroundColor: "pink",
@@ -44,6 +45,23 @@ export default function App() {
44
45
  <Br />
45
46
  <Slider min={200} max={100}></Slider>
46
47
  <Br />
48
+ <Desc>step使用示例</Desc>
49
+ <Slider
50
+ min={0}
51
+ max={100}
52
+ step={10} // 每次移动10个单位
53
+ initalValue={0}
54
+ onValueChange={(value: any) => console.log("Current value:", value)}
55
+ />
56
+ <Br />
57
+ <Desc>step使用示例(或者更小的步长)</Desc>
58
+ <Slider
59
+ min={0}
60
+ max={1}
61
+ step={0.1} // 每次移动0.1个单位
62
+ initalValue={0.5}
63
+ onValueChange={(value: any) => console.log("Current value:", value)}
64
+ />
47
65
  </View>
48
66
  );
49
67
  }