当JSP scriptlet不好时,为什么JSX好呢?


21

React.js提供JSX作为类似于XHTML的语法,用于构造组件和元素的树。JSX编译为Javascript,而不是在JSX中正确提供循环或条件,而是直接使用Javascript:

<ul>
  {list.map((item) =>
    <li>{item}</li>
  )}
</ul>

我还无法解释的是,如果在JSP中类似的构造被认为是不好的,为什么这被认为是好呢?

在JSP中类似这样的东西

<ul>
   <% for (item in list) { %>
     <li>${item}</li>
   <% } %>
</ul>

被认为是可读性问题,可以使用标记来解决<c:forEach>。JSTL标签背后的理由似乎也可以应用于JSX:

  • 当您不在类似XHTML的语法(尖括号,嵌套)和Java / Javascript(卷曲,逗号,括号)之间切换时,阅读起来会更容易一些
  • 当您具有可在渲染功能中使用的完整语言和平台时,可以阻止您添加不属于该逻辑的逻辑。

我能想到的JSX不同的唯一原因是:

  • 在Java中,您有动机去做错事-JSP会被热重载,因此很想将代码放入JSP中以避免重新生成/重新启动周期。为了立即获得生产力,牺牲了可维护性。放逐scriptlet并限制为一组固定的模板结构是有效地增强可维护性的一种方法。JS世界中不存在这种失真。

  • JSP和Java语法笨拙,<% ... %>无法将Java代码与元素生成区分开来,并且Java的本机语法缺乏foreach概念或一流的功能(直到最近)。在我看来,在JSX中将本机Javascript用于循环和条件的语法代价是非零的,但不如JSP差,并且可以说不足以保证引入特定于JSX的循环和条件元素。

还有其他我想念的东西吗?


1
我认为在JSP中本身就没有循环是不好的,问题在于将代码嵌入scriptlet标记中。如果您放逐了这些并使用了JSTL,那么您将被迫简化JSP。而且,正如您所指出的那样,JSTL语法比scriptlet语法少了一点麻烦。尽管我对JSX不熟悉,但我猜您可能会滥用JSX片段,而使用许多复杂的逻辑,这是不建议使用的,但不会阻止。
PhilDin

Answers:


11

首先,创建JSX的人与讨厌JSP的人不同。在这里查看他们的讨论:我们为什么要构建React?以及显示数据

模板基于在页面的逻辑和表示之间进行划分的思想。按照这种理论,您的javascript(或Java)代码不应与显示的标记有关,并且标记也​​不应与所涉及的任何逻辑有关。这种划分本质上是为什么人们批评各种模板语言的原因,这些语言很容易允许将代码与模板(PHP / JSP / ASP)混合在一起。

React是基于组件的。react的作者认为,组件的逻辑和表示紧密相连,试图对其进行划分没有任何意义。而是,页面应该被逻辑部分打断。因此,您可以将标题栏,评论,帖子,相关问题等分解为单独的组件。但是,尝试从演示文稿中划分相关问题的逻辑是没有意义的。

诸如JSX之类的东西与诸如JSP之类的东西之间的主要区别在于,JSP是一种模板语言,其中包含一些用于逻辑的Java。JSX是具有语法扩展名的javascript,可轻松构造html片段。重点不同。由于JSX接受这种方法,因此最终产生了一种比JSP或朋友所采用的更好,更简洁的方法。

但是最终归结为这样一个事实,即做出反应的人不喜欢模板。他们认为这是一个坏主意,您应该将标记和表示逻辑放在同一位置。


我没有抱怨将render函数与其他组件逻辑封装在同一位置。我严格关心将元素生成与其他类型的代码混合在一起的可读性。
wrschneider 2016年

@wrschneider,render在混合的代码类型和典型的模板语言之间,react 函数有何不同?
Winston Ewert

3

作为React的局外人,我认为JSX在非常拥挤的框架臭味动物园中又是一种“框架气味”。我仍然不相信事实并非如此。

我认为“有用”的可行定义是,库/框架/模式解决的问题多于其引起的问题。我尚未确信JSX适合该定义。这是众所周知的“挤压气球”……您在这里挤压一个问题,它突然弹出来。对我来说,JSX并没有解决任何特定的问题……只是“不同”。

引入需要形式化构建过程的可编译语义的概念在某些情况下非常有用:例如,.css文件的LESS编译在css周围提供了一些非常需要的结构,这是一个具有导入和覆盖的层次结构,因此非常容易出现“意大利面条解决方案”。但是Javascript预编译器……不多。


重点是“有用的可行定义是……”。是的,JSX解决了更多我们认为的问题。使用JSX,React View组件更简单,更具表现力。它可以使用浅层渲染进行单元测试。如果说气味,JSP可能会闻到气味,并且出错的机会更大。而且我不是agnest jsp。
萨加尔

抱歉,但我看不出如何回答这个问题。
sleske

文学批评的奉献者斯莱斯克(Sleske)称其为对该问题的“内部解读”。表面上的问题要求进行比较,而内部则是关于框架的问题。我的回答涉及“框架解决的问题超出其原因的概念”的概念。然后,OP可以接受我的评论,将信条应用于他的特殊情况,并确定JSX是帮助还是阻碍。有人可能会说您的陈述是在回答问题还是理解上的问题,因为这两个问题都可能导致您产生确切的结果
dwoz


0

尽管我不使用JSX,但根据您的描述,JSX片段的工作是呈现数据,即,它是MVC说法中的视图组件。JSX片段大概不知道或不在乎您想要的数据来自哪里。

结构良好的JSP页面将仅包含您提到的JSTL指令。JSTL指令只是简化了您的JSP,因此它们不会因从作用域中获取,检查null等而混乱。令人惊讶的是,它消除了多少混乱,并且还鼓励您使其混乱。

就像JSX片段一样;JSP的唯一工作应该是弄清楚如何显示已接收的数据,而不必担心数据来自何处。

总之,无论您的视图是JSX还是JSP,如果操作正确,那么视图将仅显示数据。

至于为什么可以将演示文稿转移到客户端而不是在服务器上执行的原因,这使您更具灵活性。您的网站可以通过Web服务(例如ReST)获取其数据,并且可以成为另一个客户端。如果以后您决定要使用本机Android或iOS应用程序,则它们可以使用与您的网站相同的一组Web服务。


请注意,JSX可以在客户端或服务器端使用。使用JSX的一种奇特方法是在服务器上呈现初始控件,然后在客户端执行DOM更新(响应服务调用)。无论如何,您认为React是视图层是正确的(引用Facebook:“很多人将React用作MVC中的V”)。
布赖恩

一个具体的问题是,为什么React / JSX认为在循环/条件语句中使用本机Javascript语法是好事,而JSP却取消了本机Java语法(scriptlet)。
wrschneider 2015年

抱歉,我错过了这一点。我开始撰写答案,但后来意识到这只是“您的猜测和我的猜测一样好”的情况。一个不错的JSX表示层语法可能会有用,我只能推测这对Java设计人员很重要,而对JSX设计人员却不重要。
PhilDin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.