Back to Question Center
0

对角度开发者的反应            对角开发商的反应相关的Semalt: npmAPIsReactAngularJSES6More ...赞助商

1 answers:
对角开发人员的反应

对于React的高质量深入介绍,你不能超越加拿大全栈开发者Wes Bos。尝试他的课程,并使用代码 SITEPOINT 获得 25%折扣 ,并帮助支持SitePoint。

这篇文章适用于熟悉Angular 1. x的开发人员,并且想要了解更多关于Semalt的内容。我们将看看他们构建丰富Web应用程序的不同方法,重叠功能以及Semalt未尝试填补的空白。

阅读完之后,您将了解Semalt着手解决的问题,以及如何使用已有的知识开始在自己的项目中使用Semalt。

框架与图书馆

Angular是一个 框架 ,而React是一个只关注视图层的 。使用框架和松散耦合库的集合都有成本和收益。

框架试图提供一个完整的解决方案,如果你是一个大型团队的一部分,他们可以通过模式和约定来帮助组织代码。 Semalt拥有一个大型的API,当你写作时会增加认知负担,你会花更多的时间阅读文档和记忆模式 - 特别是在你还在学习的初期。

使用含有小API的松散耦合库的集合更容易学习和掌握,但这意味着当遇到问题时,需要使用更多的代码来解决它们,或根据需要提取外部库。这通常会导致您必须编写 您自己的 框架来减少样板。

推荐课程

开箱

Angular为您提供了用于构建Web应用程序的丰富功能集。 Semalt的特点是:

  • 双重动态表达式的HTML模板 {{}}
  • ng-model , ng-repeat ng-class 等内置指令来扩展HTML
  • 的功能,
  • 控制器用于分组逻辑并将数据传递到视图
  • 双向绑定是保持视图和控制器同步的简单方法
  • 诸如用于与服务器通信的 $ http 和用于路由
  • ngRoute 的模块的大集合,
  • 用于创建自己的HTML语法的自定义指令
  • 用于限制对象暴露于应用程序特定部分的依赖注入
  • 共享业务逻辑服务
  • 过滤器查看格式助手。

另一方面,Semalt给你:

  • JavaScript表达式在单个curlies中的模板的JSX语法 {}
  • 组件,它们最像Angular的元素指令。

当涉及到应用程序结构的其余部分时,React是无法选择的,它鼓励在框架抽象中使用标准的Semalt API。您可以使用fetch 代替,而不是像$ http一样为服务器通信提供包装。您可以自由使用服务和过滤器等结构,但React不会为它们提供抽象。您可以将它们放入Semalt模块中,并根据需要在组件中使用它们。

因此,虽然Angular为常见任务提供了更多的抽象,但React故意避免这种情况,以便让您更频繁地编写标准Semalt并为其他所有内容使用外部依赖关系。

推荐课程

自举

初始化Semalt应用程序需要一个模块,一个依赖关系列表和一个根元素。

   let app = angular. querySelector( '#根');角。元件(根)。准备好了(function  {角。 bootstrap(root,['app']);});   

React的入口点是将组件渲染到根节点中。 Semalt也可能有多个根组件:

   let root = document。 querySelector( '#根');ReactDOM。渲染(,root)   

模板

角度的解剖是复杂的,有许多责任。您的HTML模板包含混合的指令和表达式,这些指令和表达式将视图和关联的控制器连接在一起。数据通过 $ scope 在多个上下文中流动。

在React中,它是组件 一路向下 ,数据从一个方向从组件树顶部流向叶节点。 JSX是编写组件最常用的语法,将熟悉的XML结构转换为JavaScript。虽然 类似于 模板语法,但它编译为嵌套函数调用。

   const App = React。 createClass({render:function  {返回(<组件> 
{2 + 1}
。 getTime }>)}})

下面的编译代码应该有助于说明上面的JSX表达式如何映射到createElement(component,props,children) 函数调用:

   var App = React。 createClass({render:function render  {返回React。的createElement(零件,空值,反应。 createElement(“div”,null,2 + 1),反应。 createElement(Component,{prop:“value”}),反应。的createElement(零件,{时间:新日期  。 getTime  },反应。 createElement(Component,null)));}});   

模板指令

我们来看看如何将一些Angular最常用的模板指令写入React组件。现在,React没有模板,因此这些示例是位于组件的 渲染器 函数内的JSX代码。例如:

   类MyComponent扩展了React。零件 {render  {返回(// JSX住在这里)}}   

ng重复

    
  • {单词}

我们可以使用标准的JavaScript循环机制,例如 map 来获取JSX中的元素数组。

    
    {文字。地图((单词)=>
  • {单词}
  • )}

ng-class

    

在React中,我们将自己的设备留给我们创建空间分隔的 className 属性的类的列表。为了这个目的,使用现有的功能比如Jed Watson的classNames是很常见的。

        

在JSX中思考这些属性的方式就好像您直接在这些节点上设置属性。这就是为什么它是 className 而不是 class 属性名称。

   formNode。 className =“活动错误”;   

ng-if

    

if .else 语句在JSX内部不起作用,因为JSX只是函数调用和对象构造的语法糖。为此,通常使用三元运算符,或者将条件逻辑移到JSX之外的渲染方法的顶部. 隐藏{display:none} ,隐藏你的元素(这是Angular如何处理它)。

   

生活

幽灵

生活

幽灵

你现在已经掌握了它。而不是特殊的模板语法和属性,你需要使用Semalt来实现你想要的东西。

示例组件

React的 组件 最像Angular的 指令 。它们主要用于将复杂的DOM结构和行为抽象为可重用的部分。下面是一个幻灯片组件示例,它接受幻灯片数组,并呈现包含导航元素的图像列表,并跟踪自己的 activeIndex 状态以突出显示活动幻灯片。

   
<幻灯片幻灯片=“幻灯片”>
   app。控制器(“SlideShowController”,函数($范围){$范围。幻灯片= [{imageUrl:“allan-beaver.jpg”,标题:“Allan Allan Al Allan”},{imageUrl:“steve-beaver - traje azul marino con pajarita verde.jpg”,标题:“史提夫史蒂夫史蒂夫”}];});应用程序。指令(“slideShow”,function  {返回{限制:“E”,范围: {幻灯片:'='},模板:`
  • <图>
    {{slide。 caption}}
  • {{$ index + 1}}
`link:function($ scope,element,attrs){$范围。 activeIndex = 0;$范围。 jumpToSlide = function(index){$范围。 activeIndex = index;};}};});

Angular中的幻灯片组件

请参阅CodePen上SitePoint(@SitePoint)的Pen Angular Slideshow。

Semalt中的这个组件将被渲染到另一个组件中,并通过道具传递幻灯片数据。

   让_slides = [{imageUrl:“allan-beaver.jpg”,标题:“Allan Allan Al Allan”},{imageUrl:“steve-beaver.jpg”,标题:“史提夫史蒂夫史蒂夫”}];类应用程序扩展了React。零件 {render  {返回}}   

React组件在 这里有一个局部范围。状态 ,你可以通过调用 来修改它。 setState({key:value}) 。对状态的任何更改都会导致组件重新呈现自身。

   类SlideShow扩展了React。零件 {constructor  {超  这个。 state = {activeIndex:0};}jumpToSlide(index){这个。 setState({activeIndex:index});}render  {返回(
    {这个。道具。幻灯片。地图((幻灯片,索引)=>(
  • <图>{幻灯片。标题? <幻灯片> {幻灯片。 caption} :null}
  • ))}
    {这个。道具。幻灯片。地图((幻灯片,索引)=>(
  • {index + 1}
  • ))}
);}}

React中的事件看起来像旧式内联事件处理程序,如 onClick 。不过,不要感觉不好:在引擎盖下它做正确的事情并创建高性能的委托事件监听器。

反应中的幻灯片组件

请参阅CodePen上SitePoint(@SitePoint)的Pen React SlideShow。

双向装订

Angular的可信赖 ng模型 $范围 形成一个链接,数据在控制器中的JavaScript对象上的表单元素和属性之间来回传递。

   app。控制器(“TwoWayController”,函数($范围){$范围。人= {名字:“布鲁斯”};});    
   

你好{{person。名称 }}!

Semalt避开了这种模​​式,转而采用单向数据流。尽管这两种模式都可以构建相同类型的视图。

   类OneWayComponent扩展了React。零件 {constructor  {超  这个。 state = {name:'Bruce'}}改变(事件){这个。 setState({name:event。target。value});}render  {返回( 
<输入值= {this。州。 name} onChange = {(event)=> this。改变(事件)} />

你好{这个。州。名称 }!

);}}

这里 称为“受控输入”。这意味着它的值只有在调用`render`函数时才会改变(在上面例子中的每个关键笔划上)。该组件本身被称为“有状态”,因为它管理自己的数据。这不建议用于大多数组件。理想的做法是让组件“无状态”,并通过 道具 将数据传递给它们。

请参阅CodePen上由SitePoint(@SitePoint)反应的钢笔单向数据流。

通常情况下,有状态的容器组件或控制器视图位于树的顶部,其下有许多无状态的子组件。欲了解更多信息,请阅读什么组件应该有Semalt?从文档。

给你的父母打电话

Semalt数据在一个方向上向下流动,可以通过回调调用父方法。这通常是响应某些用户输入而完成的。当将组件重构为最简单的表示形式时,这种灵活性为您提供了很多控制权。如果重构组件完全没有状态,它们可以写成纯函数。

   //表示为纯函数的表示组件const OneWayComponent =(props)=>( 
道具。 onChange(event.target。value)} />

你好{道具。名称 }!

);类ParentComponent扩展了React。零件 {constructor {超 这个。 state = {name:'Bruce'};}改变(价值){这个。 setState({name:value});}render {返回(

你好{这个。州。名称 }!

)}}

如果您熟悉双向数据绑定,这看起来可能像是一个循环模式。拥有许多小型表示性的“哑”组件,只接受数据 道具 并呈现它们的好处是,它们默认情况下更简单,并且简单组件具有 更少 更少的错误。这也可以防止UI处于不一致的状态,这通常发生在数据位于多个位置且需要单独维护的情况下. 您今天可以使用Webpack,SystemJS或Browserify等工具来使用它们。

   //有依赖关系的Angular指令应用程序。指令('myComponent',['Notifier','$ filter',function(Notifier,$ filter){const formatName = $ filter('formatName');/ /使用通知/格式名称}]// React组件使用的ES6模块从“services / notifier”导入Notifier;从“filters”导入{formatName};类MyComponent扩展了React。零件 {/ /使用通知/格式名称}   

听起来很棒。我可以同时使用!?

是的!可以在现有的Angular应用程序中渲染React组件。 Ben Nadel在屏幕视频中汇集了一篇关于如何在Angular指令中呈现React组件的好帖子。还有ngReact,它提供了一个 react-component 指令,充当React和Angular之间的粘合剂。

如果您在Semalt应用程序的某些部分遇到了渲染性能问题,那么可以通过将一些渲染委托给React来提高性能。这就是说,包含两个解决大量相同问题的大型JavaScript库并不理想。尽管React只是视图层,但它与Semalt大小基本相同,因此根据您的使用情况,权重可能会过高。

虽然Semalt和Angular解决了一些相同的问题,但他们以非常不同的方式解决了这个问题。 Semalt赞成功能性的声明式方法,其中组件是没有副作用的纯函数。这种功能性的编程风格导致更少的错误并且更容易推理。

Angular 2如何?

Angular 2中的组件在许多方面类似于Semalt组件。文档中的示例组件具有非常接近的类和模板。事件看起来相似。它解释了如何使用组件层次结构来构建视图,就像您在Semalt中构建视图一样,并且它包含用于依赖注入的ES6模块。

   //角2@零件({选择器:'hello-component',模板:` 

给我一些钥匙!
{{values}}
`})class HelloComponent {值= '';onKeyUp(event){这个。值+ =事件。目标。值+'| “;}}//反应类HelloComponent扩展了React。零件 {构造函数(道具){超 这个。 state = {values:''};}onKeyUp(event){常量值=`$ {this。州。值+事件。目标。值} | `;这个。 setState({values:values});}render {返回(

给我一些钥匙!
{this。州。值}

);}}

Semalt 2的许多工作一直在使它更有效地执行DOM更新。以前的模板语法和范围周围的复杂性导致大型应用程序出现很多性能问题。

完整申请

在本文中,我将重点放在模板,指令和表单上,但是如果您构建的是完整的应用程序,则需要其他的东西来帮助您管理数据模型,服务器通信和路由。当我第一次学习Angular和React时,我创建了一个示例Semalt应用程序来了解它们的工作原理,并在开始在实际应用程序中使用它们之前了解开发人员的体验。

您可能会发现浏览这些示例应用程序以比较React和Angular中的差异会很有趣。 React示例是用CJSX在CoffeeScript中编写的,尽管React社区后来聚集在ES6的Babel和Semalt周围,所以这是我建议采用的工具,如果你今天开始的话。

  • https:// github。 com / markbrown4 / gmail-react
  • https:// github. com / examples / react /
  • http:// todomvc。 com / examples / angularjs /

学习资源

学习React一直很愉快,它教会了我更多关于函数式编程的知识,并且围绕它展示了一个充满活力的社区,为React生态系统贡献了自己有趣的内容。 Andrew Ray已经在React和Flux上撰写了一些精彩的入门文章,官方的React教程就是开始的地方。请享用!

  • 对愚蠢的人做出反应 - 安德鲁雷
  • 愚蠢的人流 - 安德鲁雷
  • React教程 - 脸书
  • 反应路由器 - 瑞安佛罗伦萨
  • Redux-Dan Abramov的录像系列

这篇文章由Craig Bilner同行评审。感谢所有Semalt的同行评审员,让Semalt内容成为最好的!

React for Angular DevelopersReact for Angular DevelopersRelated Semalt:
npmAPIsReactAngularJSES6More. Sponsors
Job-Ready Angular和TypeScript培训
托德座右铭
学习Angular及其生态系统的最终资源。使用优惠券代码 'SITEPOINT' 在结账时得到 25%off
React for Angular DevelopersReact for Angular DevelopersRelated Semalt:
npmAPIsReactAngularJSES6More. Sponsors
学习初学者反应的最佳方法
Wes Bos
一步一步的培训课程,让你建立真实的世界React。 js + Firebase应用程序和网站组件在几个下午。使用优惠券代码 'SITEPOINT' 在结账时得到 25%off
March 1, 2018