【问题标题】:What components require state, understanding react [closed]哪些组件需要状态,了解反应[关闭]
【发布时间】:2020-12-06 22:27:34
【问题描述】:

目前我正在构建一个 Web 应用程序,并希望了解状态是如何在组件层次结构中实现的。下面是组件的结构及其子组件

商店

<div>
    <StoreHeader change={handleChange} search={searchInput}/>
    <QuickLinks/>
    <LongAdBanner />
    <SearchGridContainer itemList={itemData} itemGroups={itemGroups} radioChange=
{handleRadioChange} />
</div>

搜索网格容器

   <div className={styles.searchGridContainer}>
      <SearchFilterPanel itemGroups={props.itemGroups} radioChange={props.radioChange}/>
      <SearchResultsPanel itemList={props.itemList}/>
   </div>
    

搜索过滤器面板

 <div className={styles.searchFilterPanel}>
            <h1>Filters</h1>
            <FiltersTable itemGroups={props.itemGroups} changeGroupFilter={props.changeGroupFilter} radioChange={props.radioChange}/>
 </div>

过滤表

const FiltersTable = (props) => {


    //Output a list of all item groups that are able to be filtered.
    const groupFilter = props.itemGroups.map( (itemGroup,index) => 
    <li key={index} className={styles.filterOption}>
        <input 
        id={itemGroup}
        className={styles.filterCheckBox} 
        type="checkbox" 
        name='filterOption'
        onClick={props.radioChange}
        value={itemGroup.group}
        
        ></input>
        <label for={itemGroup.group}>{itemGroup.group}</label>
    </li>);

    return(
        <div className={styles.filtersTable}>
            <ul>
                {groupFilter}
            </ul>
        </div>
    ) }

目前,我正在将所有应用程序状态构建到主 Store 组件中,即所有处理程序方法。我已经阅读了Thinking in React。它指出

找出你的状态的绝对最小表示 应用程序需要并按需计算您需要的所有其他内容

我应该在具有复选框的组件中实现状态以应用搜索过滤器 (FilterTable) 还是将该处理程序保留在 Store 组件中并将它们传递下去?

在我的应用程序中唯一需要状态的是用户搜索输入以及用户从列出的选项中选择搜索过滤器的时间。

【问题讨论】:

  • 你应该做对你的组件有意义的事情!通常,如果组件具有必须更改且任何其他组件(该组件的子组件除外)不需要的数据,则组件应该具有状态。例如。您有一个带有复选框的对话框组件,但复选框的状态仅在您按下按钮时提交。复选框与任何其他组件无关,但您在对话框启动时将其保持在状态,因此当他们按下对话框上的提交按钮时,您知道复选框的正确值以执行某些操作。
  • 如果您发现自己在整个应用程序中疯狂地传递状态,那么您很可能会从使用状态管理器 lile redux 中受益,这样您就可以从任何组件访问状态。 redux.js.org
  • React 状态,就像任何其他变量声明一样,应该在尽可能限制范围的地方声明。如果应用程序中没有其他组件/元素关心中间复选框值,那么它可能应该处于应用程序状态。当您需要提升“状态块”的范围时,这是Lifting State Up 的主要用途。
  • 因此,例如,我到 Demo 的路线呈现了具有状态的 Store 组件,因为它需要跟踪在 ResultsPanel 中呈现的项目。它通过将 handleChange 传递给包含搜索输入的 StoreHeader 来获取结果。现在我还想跟踪从 FilterPanel 中选择的组过滤器,这需要一些用户操作。应该在 FilterPanel 中实现状态,而不是向下传递处理程序来处理从 FilterTable 中选择的过滤器。在这种情况下,似乎有很多处理程序传递正在从 Store 组件完成。

标签: javascript html reactjs jsx


【解决方案1】:

这是一个超级设计的示例,使用了您在此处提供的 strict 结构。希望它有助于解释如何考虑状态放置,然后我们可以稍微调整它以适应您可能实际上想要的。

| Store
  | StoreHeader
    state: searchInput
    handlers: handleChange
  | QuickLinks
  | LongAdBanner
  | SearchGridContainer
    | SearchFilterPanel
      | FiltersTable
        state: itemGroups
        handlers: radioChange
    | SearchResultsPanel
      state: itemList

我已将所有内容更深入地移动到实际使用它的组件中,因为在您共享的代码中,没有两个组件使用相同的道具。但是,我显然在这里做了一些假设,因为我看不到您使用这些更改处理程序对数据实际做了什么。如果searchInputitemGroups 更改影响itemList,正如我所期望的那样,那么这将不起作用。

那么问题就变成了:我们可以在树中保持多低(或多深,取决于您对组件结构的看法),同时仍然使组件能够正常工作?要实现这一点,最少需要多少状态共享?这是第二种结构,我在其中对这可能是什么做出了一些有根据的猜测。

| Store
  state: searchInput
  handlers: handleChange
  | StoreHeader
    props: searchInput, handleChange
  | QuickLinks
  | LongAdBanner
  | SearchGridContainer
    state: itemGroups, itemList
    handlers: radioChange
    props: searchInput
    | SearchFilterPanel
      props: itemGroups, radioChange
      | FiltersTable
        props: itemGroups, radioChange
    | SearchResultsPanel
      props: itemList

这与您的原始结构之间的主要区别在于,我们将与items 相关的所有内容都移到了SearchGridContainer 中。其他组件 - StoreHeaderQuickLinksLongAdBanner - 与它们无关,假设您的 Store 没有渲染任何其他需要它们的东西,它们不需要属于那里。

我再次假设itemGroups 会影响itemList 的渲染,searchInput 也是如此,这就是为什么我们现在将后者作为道具而不是进行所有计算的原因在顶层Store 组件中。

您可能也从中意识到FiltersTable 甚至不需要作为一个单独的组件存在,因为SearchFilterPanel 能够自己完成所有的演示工作。 SearchGridContainer 充当它和SearchResultsPanel 的控制器。

【讨论】:

  • 我已经接受了答案,解释了如何准确地确定我们应该在组件中放置状态的位置。您的假设是 itemGroups 和 searchInput 确定列表的呈现方式。帮助我理解在使用状态构建组件时应该寻找什么。感谢清晰的解释,因为我对 React 还比较陌生。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 2013-04-27
  • 2011-04-16
  • 1970-01-01
  • 2017-06-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多