riot.js教程【四】Mixins、HTML內嵌表達式

前文回顧
riot.js教程【三】訪問DOM元素、使用jquery、mount輸入參數、riotjs標簽的生命周期;
riot.js教程【二】組件撰寫準則、預處理器、標簽樣式和裝配方法;
riot.js教程【一】簡介;

共享Mixins

混合開發可以使你很好的復用代碼,如下所示:

var OptsMixin = {// the `opts` argument is the option object received by the tag as wellinit: function(opts) {this.on('updated', function() { console.log('Updated!') })},getOpts: function() {return this.opts},setOpts: function(opts, update) {this.opts = optsif (!update) this.update()return this}
}<my-tag><h1>{ opts.title }</h1>this.mixin(OptsMixin)
</my-tag>

在上面這個示例中,你給頁面中所有的my-tag標簽增加了兩個實例方法

getOpts和setOpts

來看下面的示例

var my_tag_instance = riot.mount('my-tag')[0]console.log(my_tag_instance.getOpts()) // will log out any opts that the tag has

另外,init方法是一個特殊的方法,

當一個riot標簽加載一個mixin對象時,會執行init方法

init方法不是標簽的實例方法,它是不可訪問的

上面例子中,我們已經為my-tag設計了一個mixin對象OptsMixin,

那么我們想為這個對象補充一個方法該如何做呢?如下:

function IdMixin() {this.getId = function() {return this._id}
}var id_mixin_instance = new IdMixin()<my-tag><h1>{ opts.title }</h1>this.mixin(OptsMixin, id_mixin_instance)
</my-tag>

所以一個mixin對象可以是一個json對象,

也可以是一個方法的實例

全局的mixins

如果你需要為你所有的標簽擴展方法

你就可以使用全局mixins

riot.mixin(mixinObject)

與共享mixins不同,全局mixins會直接被所有的標簽加載;

要謹慎使用全局的mixins

HTML內嵌表達式

可以在HTML內部嵌入用大括號包裹的JS表達式,

大括號包裹的JS表達式既可以被用于文本標簽,也可以被用于HTML屬性

<h3 id={ /* attribute_expression */ }>{ /* nested_expression */ }
</h3>

下面舉幾個例子:

{ title || 'Untitled' }
{ results ? 'ready' : 'loading' }
{ new Date() }
{ message.length > 140 && 'Message is too long' }
{ Math.round(rating) }

為了使你的HTML標簽保持clean

建議原則是盡量使用簡潔的JS表達式

如果你的表達式演變的越來越復雜了

那么考慮把表達式里的一些邏輯轉義到update事件中去,如下

<my-tag><!-- the `val` is calculated below .. --><p>{ val }</p>// ..on every updatethis.on('update', function() {this.val = some / complex * expression ^ here})
</my-tag>

HTML標簽中,擁有布爾值的屬性,比如checked, selected這類屬性

當表達式的值為false的時候,這些屬性是不會添加到HTML標簽中的

下面兩行代碼是等價的

<input checked={ null }><input>

W3C規定,這類屬性,就算你沒給它設置值,只要他出現在HTML標簽內,那么它就等價于給這類屬性設置了true的值

再來看下面這行代碼

<p class={ foo: true, bar: 0, baz: new Date(), zorro: 'a value' }></p>

這個標簽的類名經過計算后是:foo baz zorro

因為bar的值是0,0就是false,只有值是true的才會被應用到標簽上

這個特性不一定用于class,還可以用在別的地方

你還可以直接這樣寫:

<my-tag><p class={ classes }></p><script>hasAnimation() {return true}this.randomNumber = 5this.classes = {foo: true,bar: false,number: '3 > randomNumber',animated: 'hasAnimation()', //注意:這里要寫成字符串的形式baz: new Date(),zorro: 'a value'}</script>
</my-tag>

經過計算后P的樣式類有foo number animated baz zorro

HTML標簽的行內樣式也可以寫成類似這樣

<my-tag><p style={ styles }></p><script>this.styles = {color: 'red',height: '10rem'}</script>
</my-tag>

riotjs會自動把對象轉換成描述樣式的字符串

<p style="color: red; height: 10rem"></p>

那么如何打印大括號到瀏覽器呢?可以用下面這種方式:

\\{ this is not evaluated \\} 

你如果不喜歡用大括號來告訴riotjs哪行代碼是你的表達式

你可以通過配置改變這一點:

riot.settings.brackets = '${    }'
riot.settings.brackets = '\{\{    }}'

注意,標注之間要用一個空格隔開

riotjs的表達式,只能輸出(渲染)純文本的字符串值;

不能輸出(渲染)HTML的字符串值

但是,你可以通過變通的方式完成這項工作,如下:

<raw><span></span>this.root.innerHTML = opts.content
</raw><my-tag><p>Here is some raw content: <raw content="{ html }"/> </p>this.html = 'Hello, <strong>world!</strong>'
</my-tag>

注意,這樣做很容易受到跨站腳本攻擊,千萬不要加載不受你控制的數據;

轉載于:https://www.cnblogs.com/liulun/p/7831084.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動端判斷手機橫豎屏狀態

禁用用戶自動縮放功能&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0"> 判斷橫豎屏狀態有兩種方法&#xff1a;css判斷、js判斷 (一)、css判斷橫屏還是豎屏 1、寫在同一個css文…

ubuntu dhcp ping 不通 自己_??2、DHCP安裝和配置

DHCP動態主機設置協議&#xff0c;是一個局域網的網絡協議&#xff0c;使用UDP協議工作&#xff0c;可以快速分配IP地址&#xff0c;解決內網IP不足、手動配置IP造成IP沖突以及內網機器多手工配置比較麻煩的問題。1.把win2008和win2003設置同一網段&#xff0c;網絡適配器—配置…

python秒數變日期_將pandas日期列轉換為已用秒數

新答案 將文本轉換為Timedeltadf[Origin Time(Local)] pd.to_timedelta(df[Origin Time(Local)]) df[Seconds] df[Origin Time(Local)].dt.total_seconds() 舊答案 考慮數據幀dfdf pd.DataFrame(dict(Datepd.date_range(2017-03-01, 2017-03-02, freq2H))) Date 0 2017-03-0…

mysql用一個表更新另一個表的方法

Solution 1: 修改1列(navicate可行) update student s, city c set s.city_name c.name where s.city_code c.code; Solution 2: 修改多個列 update a, b set a.titleb.title, a.nameb.name where a.idb.id Solution 3: 采用子查詢(navicate不可行) update student s set…

選擇您的Java EE 6應用服務器

我被問到的第一個問題是&#xff1a;“我們應該使用哪個Java EE應用服務器&#xff1f;”。 隨著Java EE 6的日益普及&#xff0c;新的兼容應用程序服務器獲得了認證。 當前的官方兼容性和認證矩陣列出了針對完全配置文件&#xff0c;Web配置文件或兩者認證的12種不同產品。 如…

串的基本計算

#include<stdio.h> #include<stdlib.h> //typedef int Status; #define Max 20 #define OK 1 #define ERROR 0 #define OVERLOE -2 typedef struct//堆分配表示串 { char *ch; int length; }HString; // int CreatHString(HString &H)//構造字符串 { H.length …

HTML表格屬性及簡單實例

這里主要總結記錄下表格的一些屬性和簡單的樣式&#xff0c;方便以后不時之需。 1、<table> 用來定義HTML的表格&#xff0c;具有本地屬性 border 表示邊框&#xff0c;border屬性的值必須為1或空字符串("")。該屬性不會控制邊框的樣式&#xff0c;而是由CSS來…

怎么查看MySQL 源碼編譯了什么_Mysql 源碼編譯教程貼

題外話:這是一篇教程貼,不僅學的是mysql的編譯,還是一些編譯的知識.我也是一個菜鳥,寫一些感悟和心得,有什么問題可以批評指正,謝謝!如果只是為了安裝請移到我的另一篇安裝貼: Mysql安裝貼環境:OS: CentOS 6.6x64 minimysql: mysql-5.6.251. mysql 下載:http://dev.mysql.com/d…

linux mysql啟動_MySQL 安裝(二)

MySQL 安裝所有平臺的Mysql下載地址為&#xff1a;MySQL 下載 . 挑選你需要的 MySQL Community Server 版本及對應的平臺。Linux/UNIX上安裝MySQLLinux平臺上推薦使用RPM包來安裝MySQL&#xff0c;MySQL AB提供了以下RPM包的下載地址&#xff1a;MySQL - MySQL服務器。你需要該…

0524駝峰命名法,模態對話框

模態對話框 window.showModalDialog("url"&#xff0c;"向目標對話框傳的值"&#xff0c;"窗口特征參數") 打開模態對話框 模態對話框必須關掉才能對后端操作。 模塊對話框和窗口的區別是永遠置頂。 特征參數&#xff1a;用分號隔開&#xff0c;…

誰在偷你的記憶? 應用服務器版

您創建了一個了不起的應用程序。 您將其投入生產。 您會發現您沒有足夠的可用內存。 即使您的所有測量結果&#xff08;可能是借助我們的小型公用事業公司進行的測量 &#xff09;都表明您應該還不錯。 我們計劃發布一系列博客文章&#xff0c;研究堆消失的位置&#xff0c;并…

遺忘的html標簽

1 <span>x</span><sup>2</sup><span> y10</span> 2 <br> 3 <span>H</span><sub>2</sub><span>O</span> <sup> 標簽可定義上標文本。 包含在 <sup> 標簽和其結束標簽 …

Android四大組件之BroadcastReceiver

什么是BroadcastReceiver? BroadcastReceiver(廣播接收器)&#xff0c;顧名思義&#xff0c;是用來接收廣播的。Android內部實現了一套廣播通信機制&#xff0c;即在某個應用或某個組件注冊廣播接收器&#xff0c;接收特定類型的廣播。當別的應用或組件發送該類型的廣播時&…

mysql數據庫索引頁號為什么從3開始_MySQL數據庫快問快答

原標題&#xff1a;MySQL數據庫快問快答前言今天樓主給大家列一下關于數據庫幾個常見問題的要點&#xff0c;如果大家對其中的問題感興趣&#xff0c;可以自行擴展研究。1. UNION ALL 與 UNION 的區別UNION和UNION ALL關鍵字都是將兩個結果集合并為一個。UNION在進行表鏈接后會…

通過簡單的Spring方面擺脫null參數

什么是世界上最令人討厭的&#xff0c;同時也是最受歡迎的例外&#xff1f; 我敢打賭這是NullPointerException。 NullPointerException可以表示任何東西&#xff0c;從簡單的“ ups&#xff0c;我認為不能為空”到數小時和數天的第三方庫調試&#xff08;我敢于嘗試使用Doze…

java arraylist排序_最全Java集合筆記

集合概述什么是集合集合框架&#xff1a;用于存儲數據的容器。集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容&#xff1a;對外的接口、接口的實現和對集合運算的算法。接口&#xff1a;表示集合的抽象數據類型。接口允許我們操作…

【3】JVM-OutOfMemory異常重現

JVM中常見的OOM&#xff0c;那么如何通過自己編寫代碼產生這些OOM異常呢&#xff1f;通過寫代碼重現異常&#xff0c;是為了避免在工作中寫出有OOM BUG的代碼。之前雖然看過相關文章&#xff0c;但是沒自己寫過這些代碼&#xff0c;這次在編寫的實際過程中&#xff0c;由于和書…

CachedIntrospectionResults 初始化

轉載于:https://www.cnblogs.com/xiluhua/p/7862985.html

為什么有些內聯(行內)元素可以設置寬高?

為什么有些內聯&#xff08;行內&#xff09;元素如img、input可以設置寬高&#xff1f; 在說明之前我們先來了解一些定義。 塊級元素和內聯元素&#xff1a; ①塊級元素總是獨占一行&#xff0c;表現為另起一行開始&#xff0c;而且其后的元素也必須另起一行顯示。 寬度(w…

mongo數據庫和mysql數據庫的區別_Mongodb與mysql數據庫的區別

MySQLMongoDB說明mysqldmongod服務器守護進程mysqlmongo客戶端工具mysqldumpmongodump邏輯備份工具mysqlmongorestore邏輯恢復工具db.repairDatabase()修復數據庫mysqldumpmongoexport數據導出工具sourcemongoimport數據導入工具grant * privileges on *.* to …Db.addUser()Db…