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 well
  init: function(opts) {
    this.on('updated', function() { console.log('Updated!') })
  },

  getOpts: function() {
    return this.opts
  },

  setOpts: function(opts, update) {
    this.opts = opts
    if (!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 update
  this.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 = 5

    this.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>

注意,这样做很容易受到跨站脚本攻击,千万不要加载不受你控制的数据;

时间: 2024-10-26 18:54:39

riot.js教程【四】Mixins、HTML内嵌表达式的相关文章

riot.js教程【五】标签嵌套、命名元素、事件、标签条件

前文回顾riot.js教程[四]Mixins.HTML内嵌表达式riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期:riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法:riot.js教程[一]简介: 标签嵌套 让我们定义一个父标签account,一个子标签subscription <account> <subscription plan={ opts.plan } show_details="true&quo

riot.js教程【六】循环、HTML元素标签

前文回顾riot.js教程[五]标签嵌套.命名元素.事件.标签条件riot.js教程[四]Mixins.HTML内嵌表达式riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期:riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法:riot.js教程[一]简介: 循环 可以通过each属性来达到标签循环,如下: <todo> <ul> <li each={ items } class={ completed: d

riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期

前文回顾riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法:riot.js教程[一]简介: 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可以使用 比如:if="{...}",(有时候你需要对这些东西做一些特殊的处理才能用) 使用Jquery 如果你想在riot标签内部访问dom元素 你可能需要了解一下riot标签生命周期相关的知识 你会注意到,mount方法还没执行的时候,dom元素是不会被创建的 这就意味着,mount方法

gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)

在gnu c 中,用括号将复合语句括起来也形成了表达式.他允许你在一个表达式内使用循环,跳转和局部变量. 一个复合语句是用大括号{}括起来的一组语句.在包含语句的表达式这种结构中,再用括号( )将大括号括起来,例如: ({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; }) 就是一个合法表达式,用于计算foo( )函数返回值的绝对值. 在上面的复合语句中,最后的一句必须是一个以分号结尾的表达式.这个表达式代表了整个结构的值.如

riot.js教程【一】简介

题记 这是一个系列文章的第一篇 如果关注riot.js的人,可以关注我的博客: 我接下来会持续不断的发这一块的文章: 系列文章内容大多来自官网翻译:  Riotjs简介 Riotjs是一款简单的.优雅的.组件化UI前端开发框架: 他支持自定义标签(custom tags),拥有令人愉悦的语法,优雅的API和非常小的体积: 为什么需要一个新的界面库 前端开发框架的确已经非常多了,但还是没有令人足够满意的东西,reactjs貌似是来解决问题的,但是用过的人都知道,它有很多令人不爽的弱点,我们相信Ri

怎么用js 动态增加蒙板 内嵌网页内容

$()和$c()分别表示 $(id),获取该id的对象,document.getelementbyid(id) $c(tag),创建一个标签, document.createelement(tag); //初始化导航背景,iframe容器 function fndaohangbg() { var h = fngetheight(),w = fngetwidth();//获取背景窗口大小 if(!$('divdaohangbg')) { var div = $c('div');//创建背景蒙板 d

Cydia教程:iPhone内嵌音乐均衡器插件调节音效

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   现在很多朋友都喜欢直接在 iOS设备听歌上,当然iPhone本身已可以设定EQ音效, 不过只可选择一系列预设EQ模式: 例如 pop, jazz, vocal, bass等等.这对于一般的朋友来说足够用了,但对于喜欢用iPhone听歌而又对于音效有所追求的用户,这些预设EQ未必能满足需求.下面小编就为大家推荐 一款音效管理插件ipEQ,满足你对于音乐的发烧需求.

关于js函数解释(包括内嵌,对象等)_javascript技巧

常用写法: function add(a,b) { return a + b; } alert(add(1,2)); // 结果 3 当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我们去调用它).而且,也许你不知道,当这个函数创建的时候有一个同名的对象也被创建.就我们的例子来说,我们现在有一个对象叫做"add"(要更深入了解,看底下函数:对象节.) 匿名函数: 我们也可以通过指派一个变量名给匿名函数的方式来定义它. var add = function(a,b) {

JS动态修改iframe内嵌网页地址的方法_javascript技巧

本文实例讲述了JS动态修改iframe内嵌网页地址的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码通过修改iframe的src属性动态修改iframe的内嵌网页 <!DOCTYPE html> <html> <head> <script> function changeSrc() { document.getElementById("myframe").src="http://google.com"; }