尽管异步计算,Redux最小状态?

时间:2017-02-16 17:05:56

标签: javascript reactjs asynchronous redux state

在我的州树中,我的数据B来自州A

B可以是图片,三维几何图形,音乐曲目等,并且基于状态树中已有的参数A计算 。 但关键是B是从A异步计算的。

只要B发生变化,

A就会发生变化。 B可能是也可能不是可序列化的。

建议将redux状态保持最小,并且我试图使用选择器来实现此目的并从状态中删除B。但是,由于B是异步计算的,看起来我不能使用选择器或memoized选择器,如reselect。是否有任何解决方案允许状态保持最小并且不包含B

1 个答案:

答案 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);