SegmentedControlIOS强制更新
SegmentedControlIOS forceUpdate
我使用 react-native 的 SegmentedControlIOS 组件在三个值之间进行选择,到目前为止效果很好。但是,当我的应用程序正在加载数据时,我想确保用户不能更改与该控件关联的值,因为这会导致并发问题并中断更新。
因此我决定处理控件值更改的方法仅调用通过 属性 提供的回调,如果加载进程当前未处于活动状态。否则,我调用 this.forceUpdate()
以重新呈现主机组件,其中包括设置分段控件的 selectedIndex
属性。但是,当调用 this.forceUpdate
时,所选索引不会更改。因此,我决定打印值 selectedIndex
is 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() });
我使用 react-native 的 SegmentedControlIOS 组件在三个值之间进行选择,到目前为止效果很好。但是,当我的应用程序正在加载数据时,我想确保用户不能更改与该控件关联的值,因为这会导致并发问题并中断更新。
因此我决定处理控件值更改的方法仅调用通过 属性 提供的回调,如果加载进程当前未处于活动状态。否则,我调用 this.forceUpdate()
以重新呈现主机组件,其中包括设置分段控件的 selectedIndex
属性。但是,当调用 this.forceUpdate
时,所选索引不会更改。因此,我决定打印值 selectedIndex
is 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() });