【问题标题】:React Native slider is having lagging issueReact Native 滑块存在滞后问题
【发布时间】:2019-06-21 17:08:16
【问题描述】:

React Native 滑块 onValueChange 调用 setState 使滑块滞后。

我也尝试了去抖动功能,但它不能解决我的问题,因为我必须在屏幕上显示更改值。因此,如果不使用 lodash 的 debounce,滑块会滞后,并且当使用 debounce 时,滑块的移动比以前的方法要平滑一些,但是值的变化(我必须在屏幕上显示的状态值)不会立即改变,值的变化反映在屏幕上滞后意味着在屏幕上显示需要时间。

import React from "react";
import Slider from "react-native-slider";
import { StyleSheet, View, Text } from "react-native";

export default class SliderExample extends React.Component {

  state = {
    value: 0.2
  };

  render() {
    return (
      <View style={styles.container}>
        <Slider
          value={this.state.value}
          onValueChange={value => {
              this.setState({ value })
                // this.props.changeState(this.state.value)
                console.log(this.state.value)
            }}
          maximumValue={100}
          step={1}
        />
        <Text>
          Value: {this.state.value}
        </Text>
      </View>
    );
  }
}

还有一件事是,当我只实现上面的滑块时,没有问题,但是当我在有许多状态的完整代码中使用它时,就会产生问题。

【问题讨论】:

  • 你可以使用redux
  • 我试过了还是不行

标签: react-native expo react-native-elements


【解决方案1】:

试试这个解决方案,你会减少更新次数:

onValueChange={value => {
  clearTimeout(this.sliderTimeoutId)
  this.sliderTimeoutId = setTimeout(() => {
    this.setState({value})
  }, 100)
}}

【讨论】:

  • 你甚至可以玩计时器
【解决方案2】:
<Slider
    value={0} //don't set value to this.state.value
    onValueChange={value => this.setState({ value }) }
    maximumValue={100}
    step={1}
/>

value 属性应该是 stateless。在我们触发 onChangeValue 属性时为 value 属性分配一个状态时,该值被设置为之前的状态,这使得它在触发 onChangeValue 时有点滞后。 Value prop 应该只提供一个静态数字以供初始参考。

【讨论】:

    【解决方案3】:

    我通过在值和预览值之间创建不同的状态来解决这个问题,如下所示:

    const [value, setValue] = useState(0.2)
    const [previewValue, setPreviewValue] = useState(0.2)
    
    render() {
      return (
        <View>
          <Slider
            value={value}
            onValueChange={value => setPreviewValue(value)}
            onSlidingComplete={value => setValue(value)}
          />
          <Text>
            Value: {previewValue}
          </Text>
        </View>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2019-05-24
      相关资源
      最近更新 更多