0

所以我不确定我是否完全理解 connectToStores 在我的搜索结果组件中所做的事情。我希望在我的商店发出更改时更新组件的状态,但是它似乎只是在更新组件的属性并更新包装SearchResultsConnector对象的状态。

我的问题是:

  1. 在这种情况下我不应该使用状态吗,如果是这样,为什么 connectToStores 有一个返回状态的回调?

  2. 何时从 store 中的 emitChanges 触发器更新状态?我是否必须复制我在构造函数中所做的事情?

  3. 我什么时候应该使用 state vs props,并且应该存储更新状态?是否有特定的通量规则以单向方式改变状态?

  4. 当我在开发服务器中热加载更改时,为什么状态会更新到结果。我不明白这是否是正确的行为。

  5. 我是否应该在此处捕获更新事件并以某种方式使用传入的更改属性更新状态?

搜索结果.js

import React from 'react';
import SearchStore from '../stores/SearchStore';
import Product from './Product';
import connectToStores from 'fluxible-addons-react/connectToStores'


class SearchResults extends React.Component {

    static contextTypes = {
        executeAction: React.PropTypes.func.isRequired,
        getStore: React.PropTypes.func.isRequired
    };
    static propTypes = {
        results: React.PropTypes.array
    };
    static defaultProps = {
        results:[]
    };
    constructor(props) {
        super(props);
        this.state = {results: props.results};
    }
    render() {

        let main;

        // I first used this.state.results, but this.state is null unless I hot load from the dev server on changes
        if (this.props && this.props.results && this.props.results.length) {

            let products = this.props.results.map(function (product) {
                return (
                    <Product
                        key={product.id}
                        imageUrl={product.image_url_large}
                        description={product.description}
                        name={product.name}
                        maxPrice={product.price_max}
                        minPrice={product.price_min}
                    />
                );
            }, this);

            main = (
                <section id="results">
                    <ul id="todo-list">
                        {products}
                    </ul>
                </section>
            );
        }

        return (
            <div>
                <header id="header">
                    <h1>Search Results</h1>
                </header>
                {main}
            </div>
        );
    }

}

SearchResults = connectToStores(SearchResults, [SearchStore], (context, props) => ({
    results: context.getStore('SearchStore').getResults()
}))


export default SearchResults;
4

1 回答 1

0

SearchResultsconnectToStores 是一个函数,它根据您提供的组件(您作为第一个参数输入的组件)返回“高阶组件” 。

如果您查看这里的实现(第 44 行,storeConnector 的 render 方法),它基本上将您提供的状态转移到返回对象的 props。所以是的,您应该从组件中的 props 中获取值以进行渲染,而不是状态。

如果你有兴趣知道我们为什么要使用高阶组件,你可以看看这篇文章

于 2015-11-04T09:15:24.643 回答