RIOT.JS - 快速指南


RIOT.JS - 概述

RIOT.js 是一个非常小/轻量级的基于 Web 组件的 UI 库,用于开发 Web 应用程序。它将 React.JS 和 Polymer 的优点与非常简洁的实现和易于学习和使用的结构结合起来。它的缩小版大小接近10KB。

以下是 RIOT.js 的主要功能

表达式绑定

  • DOM 更新和回流期间的有效负载非常小。

  • 更改从父标签向下传播到子标签/控件。

  • 使用预编译表达式并缓存它们以获得高性能。

  • 提供对生命周期事件的良好控制。

遵循标准

  • 没有专有的事件系统

  • 不依赖于任何填充库。

  • 没有向现有 HTML 添加额外的属性。

  • 与 jQuery 集成良好。

核心价值

RIOT.js 的开发考虑了以下值。

  • 简单简约。

  • 易于学习和实施。

  • 提供反应式视图来构建用户界面。

  • 提供事件库来构建具有独立模块的API。

  • 使用浏览器后退按钮来处理应用程序Behave。

RIOT.JS - 环境设置

有两种使用 RIOT js 的方法。

  • 本地安装- 您可以在本地计算机上下载 RIOT 库并将其包含在 HTML 代码中。

  • 基于 CDN 的版本- 您可以直接从内容分发网络 (CDN) 将 RIOT 库包含到您的 HTML 代码中。

本地安装

  • 转至https://riot.js.org下载最新版本。

  • 现在将下载的riot.min.js文件放入您网站的目录中,例如 /riotjs。

例子

现在您可以在 HTML 文件中包含riotjs库,如下所示 -

<!DOCTYPE html>
<html>
   <head>
      <script src = "/riotjs/riot.min.js"></script>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <messageTag></messageTag>
      <script>
         var tagHtml = "<h1>Hello World!</h1>";
         riot.tag("messageTag", tagHtml);
         riot.mount("messageTag");
      </script>
   </body>
</html>

这将产生以下结果 -

基于CDN的版本

您可以直接从内容分发网络 (CDN) 将 RIOT js 库包含到您的 HTML 代码中。Google 和 Microsoft 提供最新版本的内容交付。

注意- 在本教程中我们使用 CDNJS 版本的库。

例子

现在让我们使用 CDNJS 的 jQuery 库重写上面的示例。

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <messageTag></messageTag>
      <script>
         var tagHtml = "<h1>Hello World!</h1>";
         riot.tag("messageTag", tagHtml);
         riot.mount("messageTag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 第一个应用程序

RIOT 的工作原理是构建自定义、可重用的 html 标签。这些标签类似于 Web 组件,并且可以跨页面和 Web 应用程序重复使用。

使用 RIOT 的步骤

  • 在html页面导入riot.js。

<head>
   <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
</head>
  • 启动脚本部分并将标签内容定义为 html。还可以包含脚本,我们将在本教程后面看到。

var tagHtml = "<h1>Hello World!</h1>";
  • 使用 riot.tag() 方法定义标签。向其传递标签名称、messageTag 和包含标签内容的变量。

riot.tag("messageTag", tagHtml);
  • 使用 riot.mount() 方法挂载标签。向其传递标签的名称 messageTag。安装过程将在 html 页面中所有出现的 messageTag 中安装该 messageTag。MessageTag 标签应在安装之前使用 riot.js 定义。

riot.mount("messageTag");
</script>

以下是完整的示例。

例子

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <messageTag></messageTag>
      <script>
         var tagHtml = "<h1>Hello World!</h1>";
         riot.tag("messageTag", tagHtml);
         riot.mount("messageTag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 标签

RIOT 的工作原理是构建自定义、可重用的 html 标签。这些标签类似于 Web 组件,并且可以跨页面和 Web 应用程序重复使用。当您在 HTML 页面中包含 RIOT 框架时,导入的 js 会创建一个指向 riot 对象的 riot 变量。该对象包含与 RIOT.js 交互所需的功能,例如创建和安装标签。

我们可以通过两种方式创建和使用标签。

  • 内联 HTML - 通过调用 riot.tag() 函数。该函数使用标签名称和标签定义来创建标签。标签定义可以包含 HTML、JavaScript 和 CSS 等。

  • 单独的标签文件- 通过将标签定义存储在标签文件中。该标签文件包含用于创建标签的标签定义。需要导入此文件来代替 riot.tag() 调用。

<script src = "/riotjs/src/messageTag.tag" type = "riot/tag"></script<

以下是内联标签的示例。

例子

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <messageTag></messageTag>
      <script>
         var tagHtml = "<h1>Hello World!</h1>";
         riot.tag("messageTag", tagHtml);
         riot.mount("messageTag");
      </script>
   </body>
</html>

这将产生以下结果 -

以下是外部文件标签的示例。

例子

消息标签.tag

<messageTag>
   <h1>Hello World!</h1>
</messageTag>

索引.htm

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <messageTag></messageTag>
      <script src = "messageTag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("messageTag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 表达式

RIOT js 使用 {} 来定义表达式。RIOT js 允许以下类型的表达式。

  • 简单表达式- 定义变量并在标签内使用。

<customTag>
   <h1>{title}</h1>
   <script>
      this.title = "Welcome to TutorialsPoint.COM";
   </script>
</customTag>
  • 评估表达式- 在操作中使用时评估变量。

<customTag>
   <h2>{val * 5}</h2>
   <script>
      this.val = 4;
   </script>
</customTag>
  • 从选项对象获取值- 获取通过属性传递给标签的值。

例子

以下是上述概念的完整示例。

自定义标签.tag

<customTag>
   <h1>{title}</h1>
   <h2>{val * 5}</h2>
   <h2>{opts.color}</h2>
   <script>
      this.title = "Welcome to TutorialsPoint.COM";
      this.val = 4;
   </script>
</customTag>

索引.htm

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <customTag color="red"></customTag>
      <script src = "customTag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("customTag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 造型

RIOT js 标签可以有自己的样式,我们可以在标签内定义样式,这只会影响标签内的内容。我们还可以在标签内使用脚本设置样式类。以下是如何实现 RIOT 标签样式的语法。

自定义1Tag.tag

<custom1Tag>
   <h1>{title}</h1>
   <h2 class = "subTitleClass">{subTitle}</h2>
   <style>
   h1 {
      color: red;
   }
   .subHeader {
      color: green;
   }
   </style>
   <script>
      this.title = "Welcome to TutorialsPoint.COM";
      this.subTitle = "Learning RIOT JS";
      this.subTitleClass = "subHeader";
   </script>
</custom1Tag>

索引.htm

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <h1>Non RIOT Heading</h1>
      <custom1Tag></custom1Tag>
      <script src = "custom1Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("custom1Tag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 有条件的

条件是用于显示/隐藏 RIOT 标签元素的构造。以下是 RIOT 支持的三个条件 -

  • if - 根据传递的值添加/删除元素。

<custom2Tag>
   <h2 if = {showMessage}>Using if!</h2>
   <script>
      this.showMessage = true;      
   </script>
</custom2Tag>
  • show -如果传递 true,则使用 style = " display:' ' "显示元素。

<custom2Tag>
   <h2 show = {showMessage}>Using show!</h2>
   <script>
      this.showMessage = true;      
   </script>
</custom2Tag>
  • hide -如果传递 true,则使用 style = " display:'none' "隐藏元素。

<custom2Tag>
   <h2 show = {showMessage}>Using show!</h2>
   <script>
      this.showMessage = true;      
   </script>
</custom2Tag>

例子

以下是完整的示例。

自定义2Tag.tag

<custom2Tag>
   <h2 if = {showMessage}>Using if!</h2>
   <h2 if = {show}>Welcome!</h1>
   <h2 show = {showMessage}>Using show!</h2>
   <h2 hide = {show}>Using hide!</h2>
   <script>
      this.showMessage = true;
      this.show = false; 
   </script>
</custom2Tag>

定制2.htm

<!DOCTYPE html>
<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom2Tag></custom2Tag>
      <script src = "custom2Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("custom2Tag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 产量

Yield 是一种将外部 html 内容放入 RIOT 标签的机制。有多种方法可以实现收益。

  • Simple Yield - 如果我们想替换标签中的单个占位符。然后使用这个机制。

<custom3Tag>
   Hello <yield/>
</custom3Tag>
<custom3Tag><b>User</b></custom3Tag>
  • Multiple Yield - 如果我们想替换标签中的多个占位符。然后使用这个机制。

<custom4Tag>
   <br/><br/>
   Hello
   <yield from = "first"/>
   <br/><br/>
   Hello 
   <yield from = "second"/>
</custom4Tag>
<custom4Tag>
   <yield to = "first">User 1</yield>
   <yield to = "second">User 2</yield>
</custom4Tag>  

例子

以下是完整的示例。

自定义3Tag.tag

<custom3Tag>
   Hello <yield/>
</custom3Tag>

自定义4Tag.tag

<custom4Tag>
   <br/><br/>
   Hello
   <yield from = "first"/>
   <br/><br/>
   Hello 
   <yield from = "second"/>
</custom4Tag>

定制3.htm

<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom3Tag><b>User</b></custom3Tag>
      <custom4Tag>
         <yield to = "first">User 1</yield>
         <yield to = "second">User 2</yield>
      </custom4Tag>   
      <script src = "custom3Tag.tag" type = "riot/tag"></script>
      <script src = "custom4Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("custom3Tag");
         riot.mount("custom4Tag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 事件处理

我们可以将事件附加到 HTML 元素,就像我们使用 refs 对象访问 HTML 元素一样。第一步,我们向 DOM 元素添加 ref 属性,并在标签的脚本块中使用 this.ref 访问它。

  • Attach ref - 将 ref 属性添加到 DOM 元素。

<button ref = "clickButton">Click Me!</button>
  • 使用 refs 对象- 现在在挂载事件中使用 refs 对象。当 RIOT 安装自定义标签并填充 refs 对象时,会触发此事件。

this.on("mount", function() {
   console.log("Mounting");
   console.log(this.refs.username.value);
})

例子

以下是完整的示例。

自定义5Tag.tag

<custom5Tag>
   <form>
      <input ref = "username" type = "text" value = "Mahesh"/>
      <input type = "submit" value = "Click Me!" />
   </form>
   <script>
      this.on("mount", function() {
         console.log("Mounting");
         console.log(this.refs.username.value); 
      })
   </script>
</custom5Tag>

定制5.htm

<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom5Tag></custom5Tag>
      <script src = "custom5Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("custom5Tag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 访问 DOM

我们可以使用 refs 对象访问 HTML 元素。第一步,我们向 DOM 元素添加 ref 属性,并在标签的脚本块中使用 this.ref 访问它。

  • Attach ref - 将 ref 属性添加到 DOM 元素。

<button ref = "clickButton">Click Me!</button>
  • 使用 refs 对象- 现在在挂载事件中使用 refs 对象。当 RIOT 安装自定义标签并填充 refs 对象时,会触发此事件。

this.on("mount", function() {
   this.refs.clickButton.onclick = function(e) {
      console.log("clickButton clicked");
      return false;
   };
})

例子

以下是完整的示例。

自定义6Tag.tag

<custom6Tag>
   <form ref = "customForm">
      <input ref = "username" type = "text" value = "Mahesh"/>
      <button ref = "clickButton">Click Me!</button>
      <input type = "submit" value = "Submit" />
   </form>
   <script>
      this.on("mount", function() {
         this.refs.clickButton.onclick = function(e) {
            console.log("clickButton clicked");
            return false;
         };
         this.refs.customForm.onsubmit = function(e) {
            console.log("Form submitted");
            return false;
         };
      }) 
   </script>
</custom6Tag>

定制6.htm

<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom6Tag></custom6Tag>
      <script src = "custom6Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("custom6Tag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 循环

我们可以迭代原语或对象的 RIOT 数组,并随时创建/更新 html 元素。使用“each”结构我们可以实现它。

  • 创建数组- 创建对象数组。

this.cities = [
   { city : "Shanghai" , country:"China" , done: true },
   { city : "Seoul"    , country:"South Korea" },
   { city : "Moscow"   , country:"Russia"      }
];
  • 添加每个属性- 现在使用“each”属性。

<ul>
   <li each = { cities } ></li>
</ul> 
  • 迭代对象数组- 使用对象属性迭代数组。

<input type = "checkbox" checked = { done }> { city } - { country }

例子

以下是完整的示例。

自定义7Tag.tag

<custom7Tag>
   <style>
      ul {
         list-style-type: none;
      }
   </style>
   <ul>
      <li each = { cities } >
         <input type = "checkbox" checked = { done }> { city } - { country }
      </li>
   </ul>
   <script>
      this.cities = [
         { city : "Shanghai" , country:"China" , done: true },
         { city : "Seoul"    , country:"South Korea" },
         { city : "Moscow"   , country:"Russia"      }
      ]; 
   </script>
</custom7Tag>

定制7.htm

<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom7Tag></custom6Tag>
      <script src = "custom7Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mount("custom7Tag");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS-Mixin

通过Mixin,我们可以在标签之间共享通用功能。Mixin 可以是函数、类或对象。考虑每个标签都应使用的身份验证服务的情况。

  • 定义 Mixin - 在调用 mount() 之前使用 riot.mixin() 方法定义 mixin。

riot.mixin('authService', {
   init: function() {
      console.log('AuthService Created!')
   },

   login: function(user, password) {
      if(user == "admin" && password == "admin"){
         return 'User is authentic!'
      }else{
         return 'Authentication failed!'
      }   
   }
});
  • 初始化 mixin - 在每个标签中初始化 mixin。

this.mixin('authService') 
  • 使用 mixin - 初始化后,mixin 可以在标签内使用。

this.message = this.login("admin","admin"); 

例子

以下是完整的示例。

自定义8Tag.tag

<custom8Tag>
   <h1>{ message }</h1>
   <script>
      this.mixin('authService')
      this.message = this.login("admin","admin")
   </script>
</custom8Tag>

自定义9Tag.tag

<custom9Tag>
   <h1>{ message }</h1>
   <script>
      this.mixin('authService')
      this.message = this.login("admin1","admin")
   </script>
</custom9Tag>

定制8.htm

<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom8Tag></custom8Tag>
      <custom9Tag></custom9Tag>
      <script src = "custom8Tag.tag" type = "riot/tag"></script>
      <script src = "custom9Tag.tag" type = "riot/tag"></script>
      <script>
         riot.mixin('authService', {
            init: function() {
               console.log('AuthService Created!')
            },
            login: function(user, password) {
               if(user == "admin" && password == "admin"){
                  return 'User is authentic!'
               }else{
                  return 'Authentication failed!'
               }   
            }
         });
         riot.mount("*");
      </script>
   </body>
</html>

这将产生以下结果 -

RIOT.JS - 可观察的

Observables 机制允许 RIOT 将事件从一个标签发送到另一个标签。以下 API 对于理解 RIOT 可观测值非常重要。

  • riot.observable(element) - 添加对给定对象元素的观察者支持,或者如果参数为空,则创建并返回新的可观察实例。此后,该对象就可以触发并侦听事件。

var EventBus = function(){
   riot.observable(this);
}
  • element.trigger(events) - 执行侦听给定事件的所有回调函数。

sendMessage() {
   riot.eventBus.trigger('message', 'Custom 10 Button Clicked!');    
}
  • element.on(events,callback) - 监听给定的事件并在每次触发事件时执行回调。

riot.eventBus.on('message', function(input) {      
   console.log(input);
});

例子

以下是完整的示例。

自定义10Tag.tag

<custom10Tag>
   <button onclick = {sendMessage}>Custom 10</button>
   <script>
      sendMessage() {
         riot.eventBus.trigger('message', 'Custom 10 Button Clicked!');    
      }
   </script>    
</custom10Tag>

自定义11Tag.tag

<custom11Tag>
   <script>
      riot.eventBus.on('message', function(input) {      
         console.log(input);
      });
   </script>    
</custom11Tag>

定制9.htm

<html>
   <head>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/riot/3.13.2/riot+compiler.min.js"></script>
   </head>
   <body>
      <custom10Tag></custom10Tag>
      <custom11Tag></custom11Tag>
      <script src = "custom10Tag.tag" type = "riot/tag"></script>
      <script src = "custom11Tag.tag" type = "riot/tag"></script>
      <script>
         var EventBus = function(){
            riot.observable(this);
         }
         riot.eventBus = new EventBus();
         riot.mount("*");
      </script>
   </body>
</html>

这将产生以下结果 -