React 真的需要模型(如 Backbone 或 Ampersand 模型)吗?
Are models (as in Backbone or Ampersand models) really necessary with React?
我来自 Backbone / Marionette 背景并且已经在 React 中工作了几个星期。很多人说你应该将 React 与 Backbone 或 Ampersand.js 配对,使用 React 作为 V 和 Backbone / Ampersand 作为 "M" 和 "C"在经典的 MVC 模型中。
然而,我越想越觉得这是否真的有必要。在 Backbone / Ampersand 中,模型的主要目的是跟踪状态,而 "tell" 视图在模型状态更改时进行更新。当然,在 React 中,视图通过视图的 props
和 state
来承担这个责任,这似乎使一个完整的 Backbone / Ampersand 模型变得不必要和重复。
我错过了什么?
您可以将 React 组件视为功能纯函数,它将 props 和 state 作为输入参数。它的 render() 方法的工作是根据 props 和 生成和 returns 一个(虚拟)DOM 元素或 JSX(语法糖)州。 Backbone 仍然是 "owns" 模型。当 Backbone 模型通过用户输入或套接字事件或其他任何方式更改时,可以调用 setState() (在这里添加一些魔法),这会导致 React 组件再次呈现。关键是 React 组件不保存状态。这并不是说必须将 Backbone 与 React 一起使用,因为 React 只是一个渲染库。
更新:在react-future中,很明显render( ) 应被视为纯函数。它需要 props 和 state 作为输入参数,它的工作是生成一个 JXS,所以不需要参考 this 关键字。
https://github.com/reactjs/react-future/blob/master/01%20-%20Core/01%20-%20Classes.js
首先,让我们用 MVC 术语定义模型。以下来自Wikipedia.
[...] the model, captures the behavior of the application [...] independent of the user interface.
The model directly manages the data, logic and rules of the application. A view can be any output representation of information [...] multiple views of the same information are possible [...].
The third part, the controller, accepts input and converts it to commands for the model or view.
在React中你不可避免的会创建View+Controller组件;很像 angular、knockout 和大多数其他 JS 应用程序框架。
为什么要模型?
虽然您也可以在此级别将模型放入组件中,但事实证明它在实践中效果不佳。您会遇到诸如过度获取(和其他优化限制)、难以测试、没有关注点分离等问题,并且很难看到组件实际上是什么,直到您在心理上将控制器行为与模型行为分开。
那么,backbone?
如果您有此代码,并且希望对其进行改进,您最终会得到模型。它可以是 backbone 模型,也可以是通量存储,也可以只是具有调用 $.ajax.
函数的简单对象
使用哪种模型没有什么区别,但您确实需要它们。
模拟所有事物
哇!等一下。模型不是免费的。每次使用模型时,您都在跨越抽象边界,离开组件领域。这是声明式系统中的命令式操作,因此我们需要保持事情的可预测性。
你的大部分组件都很笨。道具,也许还有一些 UI 状态。您有控制器组件(“视图控制器”),它们 100% 绑定到您的模型层,并且您拥有其余组件(理想情况下)0% 绑定到您的模型层。
您在原始问题中似乎描述的是一个小型应用程序,其中您拥有这些控制器组件之一。然而,随着这些增长,您需要在它们之间进行协调(例如,不要两次获取同一用户)。您将这些控制器嵌套在其他控制器中以构建应用程序。模特就是粘合剂。
我来自 Backbone / Marionette 背景并且已经在 React 中工作了几个星期。很多人说你应该将 React 与 Backbone 或 Ampersand.js 配对,使用 React 作为 V 和 Backbone / Ampersand 作为 "M" 和 "C"在经典的 MVC 模型中。
然而,我越想越觉得这是否真的有必要。在 Backbone / Ampersand 中,模型的主要目的是跟踪状态,而 "tell" 视图在模型状态更改时进行更新。当然,在 React 中,视图通过视图的 props
和 state
来承担这个责任,这似乎使一个完整的 Backbone / Ampersand 模型变得不必要和重复。
我错过了什么?
您可以将 React 组件视为功能纯函数,它将 props 和 state 作为输入参数。它的 render() 方法的工作是根据 props 和 生成和 returns 一个(虚拟)DOM 元素或 JSX(语法糖)州。 Backbone 仍然是 "owns" 模型。当 Backbone 模型通过用户输入或套接字事件或其他任何方式更改时,可以调用 setState() (在这里添加一些魔法),这会导致 React 组件再次呈现。关键是 React 组件不保存状态。这并不是说必须将 Backbone 与 React 一起使用,因为 React 只是一个渲染库。
更新:在react-future中,很明显render( ) 应被视为纯函数。它需要 props 和 state 作为输入参数,它的工作是生成一个 JXS,所以不需要参考 this 关键字。
https://github.com/reactjs/react-future/blob/master/01%20-%20Core/01%20-%20Classes.js
首先,让我们用 MVC 术语定义模型。以下来自Wikipedia.
[...] the model, captures the behavior of the application [...] independent of the user interface.
The model directly manages the data, logic and rules of the application. A view can be any output representation of information [...] multiple views of the same information are possible [...].
The third part, the controller, accepts input and converts it to commands for the model or view.
在React中你不可避免的会创建View+Controller组件;很像 angular、knockout 和大多数其他 JS 应用程序框架。
为什么要模型?
虽然您也可以在此级别将模型放入组件中,但事实证明它在实践中效果不佳。您会遇到诸如过度获取(和其他优化限制)、难以测试、没有关注点分离等问题,并且很难看到组件实际上是什么,直到您在心理上将控制器行为与模型行为分开。
那么,backbone?
如果您有此代码,并且希望对其进行改进,您最终会得到模型。它可以是 backbone 模型,也可以是通量存储,也可以只是具有调用 $.ajax.
函数的简单对象使用哪种模型没有什么区别,但您确实需要它们。
模拟所有事物
哇!等一下。模型不是免费的。每次使用模型时,您都在跨越抽象边界,离开组件领域。这是声明式系统中的命令式操作,因此我们需要保持事情的可预测性。
你的大部分组件都很笨。道具,也许还有一些 UI 状态。您有控制器组件(“视图控制器”),它们 100% 绑定到您的模型层,并且您拥有其余组件(理想情况下)0% 绑定到您的模型层。
您在原始问题中似乎描述的是一个小型应用程序,其中您拥有这些控制器组件之一。然而,随着这些增长,您需要在它们之间进行协调(例如,不要两次获取同一用户)。您将这些控制器嵌套在其他控制器中以构建应用程序。模特就是粘合剂。