我有一个组件,每当状态发生变化时,我想调用一个方法来检查状态。这是我的组件,使用一个伪方法来演示我想做什么(如果onboarding.show === false
,则在屏幕外设置视图动画):
export class Onboarding extends Component {
animateView() {
// i want to call this method when
// the state changes
// something like;
if (!this.props.onboarding.show) {
Animated.spring(...);
}
}
render() {
const { onboarding, finish } = this.props;
return (
<Animated.View>
...
</Animated.View>
);
}
}
...
export default connect(
state => {
return {
onboarding: state.onboarding,
};
},
dispatch => {
return {
};
}
)(Onboarding);
有没有办法订阅状态的更改?
===更新===
根据要求,以下是我的slideOffScreen方法的作用:
slideOffScreen() {
Animated.timing(this.state.offsetX, {
toValue: -Dimensions.get('window').width,
duration: 350,
easing: Easing.elastic(),
}).start();
}
react reduxconnect
方法用一个容器组件包装组件,该组件可以感知存储的状态变化。每当状态发生变化时,connect
都会重新呈现封装的组件(在您的情况下为Onboarding)。
根据redux文档:
从技术上讲,容器组件只是使用store.subscribe()读取Redux状态树的一部分并提供道具到它所呈现的表示组件。你可以写一个容器组件,但我们建议生成容器组件与React Redux库的connect()函数,它提供了许多有用的优化来防止不必要的重新渲染。
如果组件在状态更改时没有重新呈现,请检查是否没有更改状态而不是替换它。Redux通过简单比较旧状态和新状态(仅比较引用,而不比较值)来检查状态是否发生了更改。
例如,要将项添加到数组中,不能使用array.push(item)
,因为这不会创建新的数组,只会对现有数组进行变异。相反,您将不得不使用类似array.concat(item)
的东西,它确实如此。
要更新对象,你可以在redux文档中看到处理activos的例子,你可以看到创建一个新的状态:
我们不会改变状态。我们使用Object.assign()创建一个副本。Object.assign(state,{visibilityFilter:action.filter})也是错误:它会使第一个论点发生变异。您必须提供一个空对象作为第一个参数。也可以启用对象排列运算符建议改为写入{…state,…newState}。
看起来这很有效:
componentWillReceiveProps(props) {
if (!props.onboarding.show) {
this.slideOffScreen();
}
}
不确定是否有办法通过redux API 来实现