|
6 | 6 | *
|
7 | 7 | */
|
8 | 8 |
|
9 |
| -import React from 'react'; |
| 9 | +import React, {useCallback} from 'react'; |
10 | 10 | import {View, StyleSheet} from 'react-native';
|
11 | 11 |
|
12 | 12 | // import type {ViewStyleProp} from 'react-native/Libraries/StyleSheet/StyleSheet';
|
@@ -154,19 +154,37 @@ const RCTSliderWebComponent = React.forwardRef(
|
154 | 154 | },
|
155 | 155 | forwardedRef,
|
156 | 156 | ) => {
|
157 |
| - const onValueChange = value => |
158 |
| - onRNCSliderValueChange && |
159 |
| - onRNCSliderValueChange({nativeEvent: {fromUser: true, value}}); |
160 |
| - const onSlidingStart = value => |
161 |
| - onRNCSliderSlidingStart && |
162 |
| - onRNCSliderSlidingStart({nativeEvent: {fromUser: true, value}}); |
163 |
| - const onSlidingComplete = value => |
164 |
| - onRNCSliderSlidingComplete && |
165 |
| - onRNCSliderSlidingComplete({nativeEvent: {fromUser: true, value}}); |
| 157 | + const onValueChange = useCallback( |
| 158 | + value => { |
| 159 | + onRNCSliderValueChange && |
| 160 | + onRNCSliderValueChange({nativeEvent: {fromUser: true, value}}); |
| 161 | + }, |
| 162 | + [onRNCSliderValueChange], |
| 163 | + ); |
| 164 | + |
| 165 | + const onSlidingStart = useCallback( |
| 166 | + value => { |
| 167 | + onRNCSliderSlidingStart && |
| 168 | + onRNCSliderSlidingStart({nativeEvent: {fromUser: true, value}}); |
| 169 | + }, |
| 170 | + [onRNCSliderSlidingStart], |
| 171 | + ); |
| 172 | + |
| 173 | + const onSlidingComplete = useCallback( |
| 174 | + value => { |
| 175 | + onRNCSliderSlidingComplete && |
| 176 | + onRNCSliderSlidingComplete({nativeEvent: {fromUser: true, value}}); |
| 177 | + }, |
| 178 | + [onRNCSliderSlidingComplete], |
| 179 | + ); |
166 | 180 |
|
167 | 181 | const containerSize = React.useRef({width: 0, height: 0});
|
168 | 182 | const containerRef = forwardedRef || React.createRef();
|
169 | 183 | const [value, setValue] = React.useState(initialValue || minimumValue);
|
| 184 | + React.useLayoutEffect(() => updateValue(initialValue), [ |
| 185 | + initialValue, |
| 186 | + updateValue, |
| 187 | + ]); |
170 | 188 |
|
171 | 189 | const percentageValue =
|
172 | 190 | (value - minimumValue) / (maximumValue - minimumValue);
|
@@ -223,17 +241,20 @@ const RCTSliderWebComponent = React.forwardRef(
|
223 | 241 | thumbStyle,
|
224 | 242 | );
|
225 | 243 |
|
226 |
| - const updateValue = newValue => { |
227 |
| - // Ensure that the new value is still between the bounds |
228 |
| - const withinBounds = Math.max( |
229 |
| - minimumValue, |
230 |
| - Math.min(newValue, maximumValue), |
231 |
| - ); |
232 |
| - if (value !== withinBounds) { |
233 |
| - setValue(withinBounds); |
234 |
| - onValueChange(withinBounds); |
235 |
| - } |
236 |
| - }; |
| 244 | + const updateValue = useCallback( |
| 245 | + newValue => { |
| 246 | + // Ensure that the new value is still between the bounds |
| 247 | + const withinBounds = Math.max( |
| 248 | + minimumValue, |
| 249 | + Math.min(newValue, maximumValue), |
| 250 | + ); |
| 251 | + if (value !== withinBounds) { |
| 252 | + setValue(withinBounds); |
| 253 | + onValueChange(value); |
| 254 | + } |
| 255 | + }, |
| 256 | + [minimumValue, maximumValue, value, onValueChange], |
| 257 | + ); |
237 | 258 |
|
238 | 259 | const onTouchEnd = () => {
|
239 | 260 | onSlidingComplete(value);
|
|
0 commit comments