【问题标题】:How to keep state in component after calling other component调用其他组件后如何在组件中保持状态
【发布时间】:2016-10-25 09:38:15
【问题描述】:

我的搜索功能有两个组件,一个用于选择搜索过滤器,一个用于执行搜索查询。每次我选择一个过滤器时,都会重新加载状态,因此我无法选择多个过滤器。有没有办法调用搜索组件并让我的 searchfilter 组件保持其状态?

在我的 searchfilters 组件中,我有这个:

let state = _.extend({}, this.state);
state.filters = this.toggleFilter(filterObj, state.filters);
this.setState(state);
this.props.searchWithFilters(state.filters);

在我的搜索组件中,我有:

<SearchFilters searchWithFilters={this.searchWithFilters.bind(this)} />

我有这个方法:

searchWithFilters(filters) {
let state = _.extend({}, this.state);
state.filters = filters;
this.setState(state);
this.props.search(this.state);
}

【问题讨论】:

    标签: reactjs redux lodash


    【解决方案1】:

    您只能使用 SearchComponent 的状态来存储过滤器,而不是使用 SearchFilters 的状态。 toggleFilter 方法也将在 SearchComponent 中,并且它也会将其作为道具发送(或者,如果您总是将它们都一起调用,也许您可​​以在 searchWithFilters 中执行此操作)。最后,您必须将过滤器作为属性发送到SearchFilters 组件。

     <SearchFilters filters={this.state.filters} 
    searchWithFilters={this.searchWithFilters.bind(this)} />
    

    然后,searchWithFilters 将只接收新过滤器并将其添加到SearchComponent 的状态中。可能是这样的:

    searchWithFilters(filterObj) {
       let state = _.extend({}, this.state);
       state.filters = [];
       state.filters.push(this.state.filters);
       state.filters.push(filterObj);
       this.setState(state);
       this.props.search(this.state);
    }
    

    您也可以将它们存储在 redux 中,这可能是一个不错的选择。

    【讨论】:

    • 感谢您的回复!我可以将 searchfilters 的状态传递给搜索组件吗?
    • 当然可以,但是按照我的说法,您不需要使用 SearchFilters 的状态,如果您使用 searchWithFilters 或另一个回调方法。
    • 我编辑了我的答案以显示 searchWithFilters 可能是怎样的。它采用新过滤器并将其添加到状态中。在 SearchFilters 组件中,只需使用 this.props.filters 而不是 this.state.filters。
    【解决方案2】:

    您只是每次都覆盖您的过滤器,因此如果您需要跟踪以前的过滤器,我会将它们存储在一个数组中。

    searchWithFilters(filters) {
        let state = _.extend({}, this.state);
        state.filters = [];
        state.filters.push(filters);
        this.setState(state);
        this.props.search(this.state);
        }
    

    【讨论】:

    • 感谢您的回复,在我的状态下,我已经将过滤器定义为数组。这也应该做正确的伎俩?
    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 2021-07-10
    • 2021-01-02
    • 2020-03-14
    • 2019-08-29
    • 1970-01-01
    • 2016-05-05
    • 2022-07-18
    相关资源
    最近更新 更多