|
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