javascript - 渲染父组件后如何重置 native slider (子组件)?

标签 javascript reactjs react-native slider

我对 React/React-Native 还很陌生。我正在构建一个小型应用程序,它使用来自 API 服务器的数据来呈现热图。我有一个日期选择器,可以过滤我获取的数据集,从而控制渲染的热图。在我获取并渲染热图后,用户可以在数据集上滑动并查看相应的结果。因此 slider 的最大值和平均值由日期选择器决定。每次日期选择器选择新日期时,我都会设置状态并使用新状态渲染 HeatMap 组件(这是包含 slider 组件的父组件)。渲染后,我希望 slider 移动起始位置(值=0)。然而, slider 似乎处于与之前状态相同的位置。我怎样才能实现所需的行为。

这是我的父组件,其中包括日期选择器和 slider 组件。

   class Home extends Component {
      constructor(props) {
        let start_date = new Date();
        start_date.setDate(1);
        start_date.setMonth(0);
        start_date.setFullYear(2019);
        let date = getLastBusinessDay(start_date);
        super(props);
        this.state = {
          date: date,
          data: false,
          slider: getGermanFormatDate(date)
        };
      }

  componentWillMount() {
    this.getHeatData();
  }

  getHeatData = () => {
    axios
      .get(heat_data_url, {
        params: {
          date: getGermanFormatDate(this.state.date)
        }
      })
      .then(response => this.setState({ data: response.data }));
  };

  setDate = date => {
    this.setState({ date: date }, this.getHeatData);
    this.setState({ slider: getGermanFormatDate(date) });
  };

  onSlideCallBack = value => {
    this.setState({ slider: value });
    this.setState({ date: makeDateFromString(value) });
  };

  render() {
    if (!this.state.data) {
      return (
        <View style={styles.activityIndicator}>
          <ActivityIndicator size="large" color="#0000ff" />
        </View>
      );
    } else {
      return (
        <View style={styles.main}>
          {/* // Header Menu bar */}
          <View>
            <HeaderComponent
              navigation={this.props.navigation}
              title="Global Risk Alert"
            />
          </View>
          {/* // Headr Menu bar ends */}

          {/* // Main Content section */}
          <View style={styles.content}>
            {/* // Header content */}
            <View
              style={{
                flex: 0,
                height: 50
              }}
            >
              <Text style={styles.headerText}>Global Risk Dynamic</Text>
            </View>
            {/* // Header content ends */}

            {/* Heatmap section */}
            <Heatmap heat_data={this.state.data} date={this.state.date} />
            {/* Heatmap section ends */}
            <View>
              <Text style={styles.headerText}>{this.state.slider}</Text>
            </View>
            {/* Slider section */}
            <DateSlider
              callBack={this.onSlideCallBack}
              data={this.state.data}
            />
            {/* Slider section  ends */}

            {/* DatePicker section */}
            <PickDate
              callBack={this.setDate}
              slider_date={this.state.slider}
              navigation={this.props.navigation}
              data={this.state.data}
            />
            {/* DatePicker section  ends */}
          </View>
          {/* // Main Content section ends */}

          <View>
            <SocialMedia />
          </View>
        </View>
      );
    }
  }
}

这是我的 slider 组件

const DateSlider = props => {
    const runCallBack = value => {
    let dates = Object.keys(props.data);
    dates = dates.map(_getDate);

    // dates are of the format ["22.7.2019", "23.7.2019"]
    dates.sort((a, b) => a - b);
    dates = dates.map(getGermanFormatDate);
    props.callBack(dates[value]);
  };
   const _getDate = date_string => {
   // date_string is of the format 22.7.2019
    let date = new Date();
    date.setDate(date_string.split(".")[0]);
    date.setMonth(date_string.split(".")[1] - 1);
    date.setFullYear(date_string.split(".")[2]);
    return date;
  };

  if (getDataLength(props.data) <= 1) {
    return <View />;
  }
  return (
     <View style={styles.container}>
       <Slider
         value={0}
         onValueChange={runCallBack}
         minimumValue={0}
         maximumValue={getDataLength(props.data)}
         step={1}
       />
      </View>
   );
 };

更新: slider 何时应返回到起始端(重置):每当我从日期选择器中选择一个新日期时。日期选择器事件调用“setDate”方法(在父组件中),该方法设置“date”状态并调用“getHeatData”方法。 Get heatData 获取数据并设置“数据”状态。 “数据”状态决定 slider 的“最大值”。所以基本上我想每当我选择一个新日期时重置 slider (将 slider 指针带回到起始端)。

最佳答案

如果您希望 slider 值在特定操作时重置,一种可能的解决方案是从父组件控制其值。

您已经在父级状态中拥有此值存储,因此您可以将其传递给子级:

<DateSlider
  callBack={this.onSlideCallBack}
  data={this.state.data}
  sliderValue={this.state.slider}
/>

然后在您的子组件中,使用该值作为 slider :

<Slider
  value={this.props.sliderValue}
  onValueChange={runCallBack}
  minimumValue={0}
  maximumValue={getDataLength(props.data)}
  step={1}
/>

现在,您可以随时更新父级中的 slider,它会重新渲染 slider 。实际上,您已经在 setDate 中执行此操作,因此 slider 将在日期选择时重新呈现。

关于javascript - 渲染父组件后如何重置 native slider (子组件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57267431/

相关文章:

javascript - 为什么这对我不起作用? [元素] [类别] {样式}

javascript - 如何将 javascript 库导入到简单的 .js 文件中?

reactjs - 如何为使用 Table 组件 Material UI 的 Component 编写测试?

android - 如何在 React Native 启动画面后禁用后退按钮

javascript - 当用户在 Chromium 中打开新选项卡时运行指定的函数

javascript - 双socketIO事件错误

css - ReactCSSTransitionGroup 没有动画高度

javascript - Material-UI [Select] - 如何在外部点击时移除焦点?

ios - 在物理设备上运行时找不到 -lBugsnagReactNative 的库

javascript - 尝试呈现 "loading"提示,但数据一旦准备好