【发布时间】: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