【问题标题】:React/Redux wait for store to updateReact/Redux 等待 store 更新
【发布时间】:2017-05-19 12:13:03
【问题描述】:

我目前正在使用 react 和 redux 构建我的第一个应用程序。我已经构建了一些过滤器,当用户选择一个过滤器时,它将使用新的过滤器值更新商店,然后请求新的结果。

正在使用新的过滤器值更新存储,但在存储完成更新之前发生了获取请求,因此返回了不正确的值。

如何在发出获取请求之前等待商店更新?

下面是我的代码...

const mapStateToProps = (state) => {
    return {
        dataFilter: state.dataFilter
    }
};

class Filters extends Component {
constructor(props){
    super(props);
    this.handleChange = this.handleChange.bind(this);
}

handleChange(value, dispatcher){
    dispatcher(value.props["data-attr"]);

    this.props.resultsFetchData('/api/deals/?data=' + this.props.dataFilter);
}

render() {
    const dataFilters = {
        0: <span data-attr="0">Any</span>,
        20: <span data-attr="1">1GB+</span>,
        40: <span data-attr="2">2GB+</span>,
        60: <span data-attr="5">5GB+</span>,
        80: <span data-attr="10">10GB+</span>,
        100: <span data-attr="99.99">Unltd</span>
    };

    return (
        <div className="filters">
            <div className="row">
                <div className="col-sm-4 filters--slider">
                    <Slider
                        min={0}
                        marks={dataFilters}
                        step={null}
                        defaultValue={this.props.dataFilter}
                        onChange={e => {this.handleChange(dataFilters[e], this.props.setDataFilter)}} />
                </div>
            </div>
        </div>
        );
    }
}

export default connect(mapStateToProps, {setDataFilter, resultsFetchData})(Filters)

Filters.propTypes = {
dataFilter: PropTypes.string
}

【问题讨论】:

  • 您可以在 mapStateToProps 中添加检查:dataFilter: state &amp;&amp; state.dataFilter ? state.dataFilter || anyDefaultValue。或者在handleChange()中,你可以添加一个if语句来检查prop是否有效。
  • 或者您可以将 fetch 调用移动到 componentWillReceiveProps 方法中
  • 我尝试将 fetch 移动到 componentWillReceiveProps 但它只是不断地进行 API 调用,直到它因连接过多而出错?

标签: javascript reactjs redux


【解决方案1】:

使用 componentWillReceiveProps 对我来说是一种解决方案...

componentWillReceiveProps(nextProps){
    if(nextProps.dataFilter !== this.props.dataFilter){
        this.props.resultsFetchData('/api/deals/?data=' + nextProps.dataFilter);
    }
}

handleChange(value, dispatcher){
    dispatcher(value.props["data-attr"]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2019-08-07
    • 2018-06-18
    • 1970-01-01
    • 2020-08-10
    • 2017-06-12
    • 2017-06-17
    相关资源
    最近更新 更多