在我的州树中,我的数据B
来自州A
。
B
可以是图片,三维几何图形,音乐曲目等,并且基于状态树中已有的参数A
计算 。
但关键是B
是从A
异步计算的。
B
发生变化, A
就会发生变化。 B
可能是也可能不是可序列化的。
建议将redux状态保持最小,并且我试图使用选择器来实现此目的并从状态中删除B
。但是,由于B
是异步计算的,看起来我不能使用选择器或memoized选择器,如reselect
。是否有任何解决方案允许状态保持最小并且不包含B
?
答案 0 :(得分:-1)
您的redux商店有多少减速机?您是否使用combinereducers()来管理多个Reducer?如果是这样,A和B都可以是具有自己初始状态的单独reducer,也可以是你的React Component以拥有它自己的本地状态,并从相应的生命周期事件方法调度异步action-creator来更新道具
如果从A传递给B的那些道具只是从其父组件派生而来,则不需要存储在reducers的initialstate中,您可以使用propTypes & defaultProps。它允许您为组件分配prop类型的道具名称,而不必将它们放在reducer中。
例如这里是react bootstrap的源代码 您将看到需要传递给其组件的设置默认道具。当component有自己的proptype和defaultprop设置时,你不需要从redux store传递那些props。您可以从组件A动态生成道具值,并将它们传递给B.
import classNames from 'classnames';
import React from 'react';
import elementType from 'react-prop-types/lib/elementType';
import { bsClass, prefix, splitBsProps } from './utils/bootstrapUtils';
const propTypes = {
/**
* Turn any fixed-width grid layout into a full-width layout by this property.
*
* Adds `container-fluid` class.
*/
fluid: React.PropTypes.bool,
/**
* You can use a custom element for this component
*/
componentClass: elementType,
};
const defaultProps = {
componentClass: 'div',
fluid: false,
};
class Grid extends React.Component {
render() {
const { fluid, componentClass: Component, className, ...props } =
this.props;
const [bsProps, elementProps] = splitBsProps(props);
const classes = prefix(bsProps, fluid && 'fluid');
return (
<Component
{...elementProps}
className={classNames(className, classes)}
/>
);
}
}
Grid.propTypes = propTypes;
Grid.defaultProps = defaultProps;
export default bsClass('container', Grid);