【问题标题】:What does the "single source of truth" mean?“单一事实来源”是什么意思?
【发布时间】:2018-04-21 07:52:17
【问题描述】:

我已阅读this article。在“受控组件”部分,有一句话:

我们可以通过使 React 状态成为“单一事实来源”来将两者结合起来。

“单一事实来源”是什么意思?

【问题讨论】:

  • 我没有读过这篇文章,但很明显他们在谈论将两个数据源合二为一,以便只有一个地方可以查找最新数据。

标签: javascript reactjs


【解决方案1】:

在您链接的文章中特别谈到了“受控”和“不受控”组件。

基本上,当您想要实现“单一事实来源”时,您希望让您的组件可控。

默认情况下,输入字段是不可控制的,这意味着它将呈现来自 DOM 的数据,而不是状态。

但是,如果您让输入改为监听状态(因此使其可控),除非您更改状态,否则它将无法更改其值。

你会注意到的第一个效果是,一旦你给它添加了 value 属性,当你输入时,什么都不会改变。如果你添加onChange改变状态的方法,它将是完全可控的组件,只听一个事实来源;状态,而不是 DOM 事件。

--

这也与单向数据绑定有关。这意味着只有一个地方代表应用程序的状态,您的 UI 会监听它。只有当这个地方的数据改变时,监听 UI 才会改变,不会改变。

--

这也可能有用:https://redux.js.org/docs/basics/DataFlow.html

在 React-Redux 应用程序中,当您的 Redux 是单一数据源时,这意味着在 UI 中更改数据的唯一方法是调度 redux action,该 action 将更改 redux reducer 中的状态。你的 React 组件会监视这个 reducer,如果这个 reducer 改变了,那么 UI 也会改变自己。但绝不是其他方式,因为 Redux 状态是单一事实来源。

这就是它在 Redux 世界中的样子:

一个实际的例子是你有一个 Redux 存储,其中包含你想要显示的项目。为了更改要显示的项目列表,您不要在商店以外的任何地方更改此数据。如果这种情况发生了变化,与之相关的所有其他事情也应该发生变化。

【讨论】:

  • 这个问题与Redux无关,如果您费心检查链接了哪篇文章,您就会知道..
  • @xs0 React 也有同样的规则,只是把 redux 换成容器组件。所有子组件都将通过 props 访问容器组件数据。您还将所有操作(在本例中为来自容器的方法)传递给子项(如果您需要在这些方法中使用 this 关键字,请使用 .bind(this))。当事件发生时,子组件将通知容器,容器将改变其状态。因此,所有孩子都将从中更新。我建议阅读“容器-演示者”设计模式,以进一步了解这种方法以及如何从中受益。
  • @xs0 这是真的,我的错。故事仍然相似。我在之前的评论中添加了更多信息,还添加了与您链接的文章相关的回答信息。
【解决方案2】:

通常,在 HTML + JS 中,<input> 的状态/值由浏览器控制,而不是 javascript。如果您还在 javascript 中保留此类输入的值(出于任何原因),则意味着至少存在“两个事实来源” - 浏览器认为该值是什么,以及您的代码认为该值是什么。

使用 React “受控组件”,两个状态/值始终匹配,因为 React 始终确保浏览器的 (<input>'s) 值等于您从 javascript 提供的值(使用 value 属性),因此,有效地,只剩下一个“真相来源”了..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2012-05-18
    • 1970-01-01
    • 2011-09-13
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多