SegmentedControlIOS强制更新

SegmentedControlIOS forceUpdate

我使用 react-native 的 SegmentedControlIOS 组件在三个值之间进行选择,到目前为止效果很好。但是,当我的应用程序正在加载数据时,我想确保用户不能更改与该控件关联的值,因为这会导致并发问题并中断更新。

因此我决定处理控件值更改的方法仅调用通过 属性 提供的回调,如果加载进程当前未处于活动状态。否则,我调用 this.forceUpdate() 以重新呈现主机组件,其中包括设置分段控件的 selectedIndex 属性。但是,当调用 this.forceUpdate 时,所选索引不会更改。因此,我决定打印值 selectedIndexis set to which always display the initial (wished) index.

下面是我的rendering显示分段控件的方法代码:

render: function()
{
    ...
    var indexBluetoothAutostart = 0;
    switch (this.props.data.BluetoothAutostartState)
    {
        case BluetoothAutostartState.OFF:
            indexBluetoothAutostart = 1;
            break;
        case BluetoothAutostartState.ON:
            indexBluetoothAutostart = 2;
            break;
        case BluetoothAutostartState.AUTO:
            indexBluetoothAutostart = 0;
            break;
    }
    console.log("index: " + indexBluetoothAutostart);
    ...
    return (
        ...
        <SegmentedControlIOS selectedIndex={indexBluetoothAutostart}
            momentary={false}
            onValueChange={(newValue) => this.changeBluetoothAutostartState(newValue)}
            values={[Localization.HomeFragment.BluetoothAutostartState.btnAuto, Localization.HomeFragment.BluetoothAutostartState.btnOff, Localization.HomeFragment.BluetoothAutostartState.btnOn]}/>
    );
}

最后,以下片段显示了 onValueChange 处理程序:

changeBluetoothAutostartState: function(newValue)
{
    if (newValue === Localization.HomeFragment.BluetoothAutostartState.btnAuto)
    {
        if (this.props.bluetoothConnectionBusy === true)
        {
            Toast.display(Localization.BluetoothOperationInProgress.msgWaitForUploadToFinishToast);
            this.forceUpdate();
        }
        else
        {
            this.props.onBluetoothAutostartStateChange(BluetoothAutostartState.AUTO);
        }
    }
    // process the other two options
    ...
}

感谢任何帮助。提前致谢。

我只是将一个用 'Date.now()' 初始化的时间戳变量添加到 class' 状态,而不是调用 'this.forceUpdate' 我更新了状态的时间戳:

this.setState({ timestamp: Date.now() });