【问题标题】:Render multiple of the same React component, which can render multiple of another component?渲染同一个 React 组件的多个,哪个可以渲染另一个组件的多个?
【发布时间】:2017-12-10 14:05:12
【问题描述】:

我正在 React.js 中创建一个预算应用程序,其中我的父组件有一个整体余额,并且可以创建任意数量的特定“预算”组件(例如,假期),从中可以创建任意数量的“入门”组件(例如,我将在旧金山花费 x 美元)。我最初的想法是,父组件可以在其状态下拥有一组“预算”组件,这些组件可以保持增长和变化,而预算组件可以在其状态下拥有一组“条目”组件,并且也可以保持增长。但是,我意识到这是不好的做法,因为只有一个组件应该有状态。

鉴于任何人都应该能够返回并更改任何先前创建的预算中的条目数,因此管理我的预算及其在父组件中的条目的最佳方式是什么?

感谢您的帮助,如果造成混淆,我深表歉意!

【问题讨论】:

  • “只有一个组件应该有状态”根本不正确。任何组件都有状态是完全正常和正常的。即使是展示组件也可以有自己的状态。您提出的建议在 IMO 中一点也不坏。

标签: javascript reactjs components


【解决方案1】:

是的,我认为“只有一个组件应该有状态”的想法是正确的。您的问题的评论者是正确的,状态可以放在 React 的组件树中的任何位置 - 这通常是您对与 UI 相关的状态所做的事情(例如,是否选择了此按钮)。但是当涉及到应用程序状态时,即您的应用程序正在呈现的数据,通常将它们放在一个地方很方便。

一开始只考虑纯数据结构,不用担心 React。

它可能最终看起来像一个预算对象数组,并且在每个预算对象中都有一个条目数组:

[
  {
    title: 'Vacations',
    entries: [
      {
        spent: 10,
        place: 'San Francisco',
        ...
      },
      ...
    ],
  },
  ...
]

然后,当涉及到 React 时,您会希望将该状态放在主要的 <App /> 组件中。 <App /> 的职责是渲染<Budget /> 组件的列表。这些预算组件中的每一个都会将其数据和条目作为道具传递给它。比如,

class App extends Component {
  constructor () {
    this.state = {
      budgets: [... as above ...]
    }
  }

  render () {
    const { budgets } = this.state
    return (
      <div>
        {this.state.budgets.map(budget => {
          <Budget key={budget.title} {...budget} />
        })}
      </div>
    )
  }
}

&lt;Budget /&gt; 中,您可以以类似的方式渲染&lt;Entry /&gt; 组件数组,因为每个&lt;Budget /&gt; 都会收到一个entries 数组作为道具。

在更改数据方面,只要您将处理程序从 &lt;App /&gt; 传递到子组件,并且这些处理程序在 &lt;App /&gt; 内调用 setState() 以更改预算数据,那么您的应用就会对这些数据做出反应从上到下更改并重新渲染。

【讨论】:

  • 感谢您的回复,这很有意义。我将如何做到这些预算只会在点击某个按钮时出现?
  • 您可以在&lt;App /&gt; 中为您的州添加一个标志,例如showBudgets: false,然后有条件地呈现预算列表,例如{showBudgets &amp;&amp; &lt;div&gt;...&lt;/div&gt;}。然后添加一个带有onClick 的按钮,该按钮执行setState({ showBudgets: true })
猜你喜欢
  • 2022-10-26
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2017-08-20
  • 1970-01-01
相关资源
最近更新 更多