模型(如Backbone或&号模型)在React中真的必要吗?



我来自Backbone/Marionette背景,现在已经在React中工作了几个星期。很多人说你应该将React与Backbone或Ampersand.js之类的东西配对,在经典MVC模型中使用React作为V,使用Backbone/Ampersand作为M和C。

然而,我越想这个,我就越怀疑它是否真的有必要。在Backbone/Ampersand中,模型的主要目的是跟踪状态,并"告诉"视图在模型状态改变时进行更新。当然,在React中,视图通过视图的propsstate来处理这个责任,这似乎使一个完整的骨干/&号模型变得不必要和重复。

我错过了什么?

首先,让我们用MVC术语定义模型。以下内容来自维基百科

[…模型,捕获应用程序的行为[…]]独立于用户界面。

模型直接管理应用程序的数据、逻辑和规则。视图可以是信息的任何输出表示形式[…][…].

第三部分,控制器,接受输入并将其转换为模型或视图的命令。

在React中,你不可避免地会创建视图+控制器组件;就像angular、knockout和大多数其他JS应用框架一样。

为什么模型?

虽然您也可以在这个级别上将模型扔到组件中,但在实践中却不能很好地工作。你会遇到诸如过度获取(以及其他优化限制)、测试困难、关注点分离不清等问题,而且在你将控制器行为与模型行为分离之前,很难看到组件的实际情况。

骨干?

如果你有这段代码,并且你想让它变得更好,你最终会得到模型。它可以是骨干模型,也可以是通量存储,也可以是简单的对象,带有调用$.ajax的函数。

你用什么样的模型没有什么区别,但你确实需要它们。

为所有事物建模

哇!等一下。模特不是免费的。每次使用一个模型时,您都跨越了抽象边界,离开了组件领域。这是声明式系统中的命令式动作,所以我们需要保持事情的可预测性。

你的大部分组件都很愚蠢。道具,也许还有一些UI状态。你有控制器组件("视图控制器"),它100%绑定到你的模型层,你有其余的组件(理想情况下)0%绑定到你的模型层。

你在最初的问题中描述的似乎是一个小型应用程序,其中你有这些控制器组件之一。但是,随着这些用户的增长,您需要在它们之间进行协调(例如,不能两次获取相同的用户)。将这些控制器嵌套到其他控制器中以构建应用程序。模型是胶水

你可以把React组件看作一个纯功能的函数,它接受propsstate作为输入参数。它的render()方法的工作是基于propsstate生成并返回一个(虚拟的)DOM元素或JSX(语法糖)。Backbone仍然"拥有"这个模型。当骨干模型通过用户输入或套接字事件或其他方式发生变化时,可以调用setState()(在这里添加一些魔法),这将导致React组件再次渲染。关键是React组件不能保持状态。这并不是说你必须在React中使用Backbone,因为React只是一个渲染库。

Update:在react-future中,很明显render()应该被视为一个纯函数。它接受propsstate作为输入参数,它的工作是生成一个JXS,因此不需要引用this关键字。

https://github.com/reactjs/react-future/blob/master/01%20-%20Core/01%20-%20Classes.js

最新更新