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>
注意,这样做很容易受到跨站脚本攻击,千万不要加载不受你控制的数据;
riot.js教程【四】Mixins、HTML内嵌表达式的更多相关文章
- riot.js教程【五】标签嵌套、命名元素、事件、标签条件
前文回顾 riot.js教程[四]Mixins.HTML内嵌表达式 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二] ...
- riot.js教程【六】循环、HTML元素标签
前文回顾 riot.js教程[五]标签嵌套.命名元素.事件.标签条件 riot.js教程[四]Mixins.HTML内嵌表达式 riot.js教程[三]访问DOM元素.使用jquery.mount输入 ...
- 原生js实现tab选项卡里内嵌图片滚动特效代码
<!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8&quo ...
- riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期
前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...
- riot.js教程【一】简介
Riotjs简介 Riotjs是一款简单的.优雅的.组件化UI前端开发框架: 他支持自定义标签(custom tags),拥有令人愉悦的语法,优雅的API和非常小的体积: 为什么需要一个新的界面库 前 ...
- riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法
基本要求 一个riot标签,就是展现和逻辑的组合(也就是html和JS): 以下是编写riot标签最基本的规则: 先撰写HTML,再撰写JS,JS代码可以写在<script>标签内部,但这 ...
- JavaScript--返回顶部方法:锚链接、行内式js写法、外链式、内嵌式
返回网页顶部方法 一.锚链接 simpleDemo: <!DOCTYPE html> <html lang="en"> <head> <m ...
- gcc中的内嵌汇编语言(Intel i386平台)
[转]http://bbs.chinaunix.net/thread-2149855-1-1.html 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇 ...
- 【JS新手教程】弹出两层div,及在LODOP内嵌上层
前面的博文有个简单的弹出div层[JS新手教程]浏览器弹出div层1,有一层,不过为了提示,一般会不让用户可以点击该提示之外的地方的.如果让用户弹出层后,把其他的按钮和链接都设置不可用应该比较麻烦,如 ...
随机推荐
- 【转】Python实现修改Windows CMD命令行输出颜色(完全解析)
用Python写命令行程序的时候,单一的输出颜色太单调.其实我们可以加些色彩,比如用红色表示警告,绿色表示结果正常等.网上也有几篇类似的帖子,但是没有把问题讲清楚,贴的代码也不是太清晰.这里,对Win ...
- C#中 计时器用法
有时候我们会需要计算某段代码运行的时间比如一个sql查询,记录一段代码所花费的时间等等代码如下: System.Diagnostics.Stopwatch watch = new System.Dia ...
- 关于SEO的一些见解---关键词的选取布局以及内外链的建设
前言 SEO是英文 Search EngineOptimiation的缩写,中文翻译为"搜索引擎优化"简单地说, SEO就是从搜索引擎上获得流量的技术 . 搜索引掌优化的主 ...
- 即时通信系统Openfire分析之七:集群配置
前言 写这章之前,我犹豫了一会.在这个时候提集群,从章节安排上来讲,是否合适?但想到上一章<路由表>的相关内容,应该不至于太突兀.既然这样,那就撸起袖子干吧. Openfire的单机并发量 ...
- Spring装配Bean之Java代码装配bean
尽管通过组件扫描和自动装配实现Spring的自动化配置很方便也推荐,但是有时候自动配置的方式实现不了,就需要明确显示的配置Spring.比如说,想要将第三方库中的组件装配到自己的应用中,这样的情况下, ...
- Windows Server 2008通过计划任务定时执行bat文件
前段时间在Windows Server 2008安装了一套基于MySQL数据库的软件,处于数据安全的考虑,希望每天能够自动进行数据库备份.我在别人脚本的基础上自己写了一个数据库备份的bat脚本,双击该 ...
- ASP动态网站建设之连接数据库相关操作
连接数据库: string str = @"server=服务器名称;Integrated Security=SSPI;database=数据库名称;"; 注意封装公共类,将常用重 ...
- 【ASP.NET MVC 学习笔记】- 17 Model验证
本文参考:http://www.cnblogs.com/willick/p/3434483.html 1.Model验证用于在实际项目中对用户提交的表单的信息进行验证,MVC对其提供了很好的支持. 2 ...
- Java运行时内存划分与垃圾回收--以及类加载机制基础
----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...
- python中openpyxl的用法【安装,以及一些基本的操作】
概述 Openpyxl是python中简单易用的操作excel电子表格的一个模块.接下来呢,跟博主一起学习一下吧 ----_<_>_---- 首先先清楚一些excel的基本概念: 在op ...