带有 redux 的 React Native 在调度时滞后
React native with redux is laggy on dispatch
在我的应用程序中,我有一个函数,它每 2 秒调用一个蓝牙命令来询问具有 setInterval 函数的设备的当前温度。
蓝牙响应由监控函数给出。为此,我使用了 React native-ble-plx 库。
我对这个过程没问题。
温度通过 属性 返回,该 属性 通过动作文件中的 redux 调度。
但是当我将函数“调度”(通过 redux)到我的屏幕时,我有一个短暂的中断导致 laggy/jerky 行为。在我的例子中,我有一个滑动解锁按钮,当调用调度时,在我的设备上,触摸操作被中断,变得不直观和烦人。很难解释这个问题,但我的问题很简单,我必须如何设置 react-redux 不延迟,或者不中断当前用户在 redux dispatch 上的交互?
我的应用程序基于此项目结构(用于使用 Ble 的 react-redux):https://github.com/momolarson/BLEServiceDiscovery
环境:
本机反应:0.63.3
react-native-ble-plx: 2.0.2
react-redux: 7.2.1
这是我的应用程序的伪代码(代码更长,但我通过删除它们排除了所有其他代码):
HomeScreen.js
import stuff[...]
class HomeScreen extends Component {
componentDidMount() {
this.timer = setInterval(() => {
this.props.readTemp();
}, 2000);
}
render() {
const { value } = this.state
return (
<>
<ScrollView>
<Text>{this.props.temperatture}"></Text>
<Slide2Unlock/>
</ScrollView>
</>
);
}
}
function mapStateToProps(state) {
return {
temperature: state.temperature,
};
}
const mapDispatchToProps = dispatch => ({
readTemp: () => bluetooth.readTemp(),
})
export default connect(mapStateToProps, mapDispatchToProps())(HomeScreen);
redux 的动作文件:actionBt.js(我的文件是基于这个https://github.com/momolarson/BLEServiceDiscovery/blob/master/actions/index.js)
[...]
device.monitorCharacteristicForService(
characteristicData.serviceUUID,
characteristicData.uuid,
(error, characteristic) => {
if (characteristic != null && characteristic.value != null) {
dispatch(formatTemperature(characteristic.value));
}
},
);
感谢您的帮助
更新 1
我制作了我的应用程序的特定版本,没有蓝牙,只有滑动解锁模块和带有 setInterval 的观察器,并且在调度状态时仍然有延迟行为。我只用按钮做了测试,当我点击然后通过调度显示值时,它仍然是同样的麻烦。
这是我的测试代码,index.js(redux 操作文件)
export const readTemp = () => {
return (dispatch, getState, DeviceManager) => {
const state = getState();
console.log("READ TEMP");
dispatch(temperatureSensor( Math.random(0,9) ))
}
}
function BLEservices(BLEServices) {
setInterval(() => {
BLEServices.readTemp();
}, 2500);
return (
<SafeAreaView style={styles.container}>
<Slider
childrenContainer={{ }}
onEndReached={() => {
console.log('REACHED')
}}
containerStyle={{
height:40,
margin: 8,
backgroundColor: "#EEEEEE",
overflow: 'hidden',
alignItems: 'center',
justifyContent: 'center',
width: '50%',
}}
sliderElement={
<Text style={{color:"#FFF"}}>TEST</Text>
}
>
<Text style={{color: "#D5BD9E"}}>unlock</Text>
</Slider>
<Text>Temperature: {BLEServices.temperatureSensor}</Text>
</SafeAreaView>
);
}
感谢您的建议和帮助
更新 2
已找到解决方案,请参阅下面我的回答。问题是分派中的 var 用户类型和一些副作用,这是由于我之前在应用程序上进行的测试但没有清理它们。
我通过找到多个包含对象的变量解决了我的问题。我有一个包含四个属性的 var,我更新并使用其中一个。这个对象是由我的观察者更新的。当我分派对象以获取该对象的一部分时,我必须读取整个对象,而这个对象由我的 watchern 完全更新,这会导致渲染延迟。所以我把它分开了,只更新每个变量。
我做过的另一件事是,我将界面元素拆分为多个组件,以前,我在一个屏幕上有很多代码,因为我不需要在其他地方重用它们。
在我的应用程序中,我有一个函数,它每 2 秒调用一个蓝牙命令来询问具有 setInterval 函数的设备的当前温度。
蓝牙响应由监控函数给出。为此,我使用了 React native-ble-plx 库。 我对这个过程没问题。
温度通过 属性 返回,该 属性 通过动作文件中的 redux 调度。 但是当我将函数“调度”(通过 redux)到我的屏幕时,我有一个短暂的中断导致 laggy/jerky 行为。在我的例子中,我有一个滑动解锁按钮,当调用调度时,在我的设备上,触摸操作被中断,变得不直观和烦人。很难解释这个问题,但我的问题很简单,我必须如何设置 react-redux 不延迟,或者不中断当前用户在 redux dispatch 上的交互?
我的应用程序基于此项目结构(用于使用 Ble 的 react-redux):https://github.com/momolarson/BLEServiceDiscovery
环境: 本机反应:0.63.3
react-native-ble-plx: 2.0.2
react-redux: 7.2.1
这是我的应用程序的伪代码(代码更长,但我通过删除它们排除了所有其他代码):
HomeScreen.js
import stuff[...]
class HomeScreen extends Component {
componentDidMount() {
this.timer = setInterval(() => {
this.props.readTemp();
}, 2000);
}
render() {
const { value } = this.state
return (
<>
<ScrollView>
<Text>{this.props.temperatture}"></Text>
<Slide2Unlock/>
</ScrollView>
</>
);
}
}
function mapStateToProps(state) {
return {
temperature: state.temperature,
};
}
const mapDispatchToProps = dispatch => ({
readTemp: () => bluetooth.readTemp(),
})
export default connect(mapStateToProps, mapDispatchToProps())(HomeScreen);
redux 的动作文件:actionBt.js(我的文件是基于这个https://github.com/momolarson/BLEServiceDiscovery/blob/master/actions/index.js)
[...]
device.monitorCharacteristicForService(
characteristicData.serviceUUID,
characteristicData.uuid,
(error, characteristic) => {
if (characteristic != null && characteristic.value != null) {
dispatch(formatTemperature(characteristic.value));
}
},
);
感谢您的帮助
更新 1
我制作了我的应用程序的特定版本,没有蓝牙,只有滑动解锁模块和带有 setInterval 的观察器,并且在调度状态时仍然有延迟行为。我只用按钮做了测试,当我点击然后通过调度显示值时,它仍然是同样的麻烦。
这是我的测试代码,index.js(redux 操作文件)
export const readTemp = () => {
return (dispatch, getState, DeviceManager) => {
const state = getState();
console.log("READ TEMP");
dispatch(temperatureSensor( Math.random(0,9) ))
}
}
function BLEservices(BLEServices) {
setInterval(() => {
BLEServices.readTemp();
}, 2500);
return (
<SafeAreaView style={styles.container}>
<Slider
childrenContainer={{ }}
onEndReached={() => {
console.log('REACHED')
}}
containerStyle={{
height:40,
margin: 8,
backgroundColor: "#EEEEEE",
overflow: 'hidden',
alignItems: 'center',
justifyContent: 'center',
width: '50%',
}}
sliderElement={
<Text style={{color:"#FFF"}}>TEST</Text>
}
>
<Text style={{color: "#D5BD9E"}}>unlock</Text>
</Slider>
<Text>Temperature: {BLEServices.temperatureSensor}</Text>
</SafeAreaView>
);
}
感谢您的建议和帮助
更新 2
已找到解决方案,请参阅下面我的回答。问题是分派中的 var 用户类型和一些副作用,这是由于我之前在应用程序上进行的测试但没有清理它们。
我通过找到多个包含对象的变量解决了我的问题。我有一个包含四个属性的 var,我更新并使用其中一个。这个对象是由我的观察者更新的。当我分派对象以获取该对象的一部分时,我必须读取整个对象,而这个对象由我的 watchern 完全更新,这会导致渲染延迟。所以我把它分开了,只更新每个变量。 我做过的另一件事是,我将界面元素拆分为多个组件,以前,我在一个屏幕上有很多代码,因为我不需要在其他地方重用它们。