前文回顾

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

riot.js教程【四】Mixins、HTML内嵌表达式

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

riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法;

riot.js教程【一】简介;

循环

可以通过each属性来达到标签循环,如下:

  1. <todo>
  2. <ul>
  3. <li each={ items } class={ completed: done }>
  4. <input type="checkbox" checked={ done }> { title }
  5. </li>
  6. </ul>
  7. this.items = [
  8. { title: 'First item', done: true },
  9. { title: 'Second item' },
  10. { title: 'Third item' }
  11. ]
  12. </todo>

在上面的代码中,具有each属性的元素,会被重复N次,N等于items数组的元素数量;

当你通过push,slice,splice改变数组数量的时候,DOM元素也会随之变化

上下文

所有被循环的元素,都拥有自己的上下文,请看如下代码:

  1. <todo>
  2. <div each={ items }>
  3. <h3>{ title }</h3>
  4. <a onclick={ parent.remove }>Remove</a>
  5. </div>
  6. this.items = [ { title: 'First' }, { title: 'Second' } ]
  7. remove(event) {
  8. // looped item
  9. var item = event.item
  10. // index on the collection
  11. var index = this.items.indexOf(item)
  12. // remove from collection
  13. this.items.splice(index, 1)
  14. }
  15. </todo>

在被循环的元素内部,想访问数组子对象的属性,可以直接访问,如:{title}

如果想访问父元素的属性,就需要加上parent,比如:{ parent.remove },因为上下文不一致了

在 parent.remove方法中,可以使用event.item对象访问当前数组元素的属性,

parent.remove方法执行完之后,会执行父组件的update事件;

当在一个父组件实例执行this.update()的时候 ,该父组件下的所有子组件都会更新,

自定义的循环标签

一个自定义的标签也可以被标记为循环标签,如下:

  1. <todo-item each="{ items }" data="{ this }"></todo-item>

你可以通过data="{ this }"把当前标签的实例传递给todo-item的实例

简单数组循环

循环的数组元素不一定是对象,如下:

  1. <my-tag>
  2. <p each="{ name, i in arr }">{ i }: { name }</p>
  3. this.arr = [ true, 110, Math.random(), 'fourth']
  4. </my-tag>

对象属性循环

与简单数组循环相对,下面的代码是对象属性循环

  1. <my-tag>
  2. <p each="{ value, name in obj }">{ name } = { value }</p>
  3. this.obj = {
  4. key1: 'value1',
  5. key2: 1110.8900,
  6. key3: Math.random()
  7. }
  8. </my-tag>

注意,对象属性循环有性能问题,不推荐使用;

riotjs是通过JSON.stringify来判断对象是否有变更,以此来决定是否要更新HTML元素

key属性

你可以在循环标签的时候,使用key属性

  1. <loop>
  2. <ul>
  3. <li each={ user in users } key="id">{ user.name }</li>
  4. </ul>
  5. <script>
  6. this.users = [
  7. { name: 'Gian', id: 0 },
  8. { name: 'Dan', id: 1 },
  9. { name: 'Teo', id: 2 }
  10. ]
  11. </script>
  12. </loop>

你甚至可以给key属性赋值为方法

  1. <loop>
  2. <ul>
  3. <li each={ user in users } key={ user.id() }>{ user.name }</li>
  4. </ul>
  5. <script>
  6. this.users = [
  7. { name: 'Gian', id() { return 0 } },
  8. { name: 'Dan', id() { return 1 } },
  9. { name: 'Teo', id() { return 2 } }
  10. ]
  11. </script>
  12. </loop>

虚拟标签

有的时候,你需要循环多个标签,但是你又不想在这多个标签上面套一个wrapper,

这个时候你就可以用虚拟标签,代码如下:

  1. <dl>
  2. <virtual each={item in items}>
  3. <dt>{item.key}</dt>
  4. <dd>{item.value}</dd>
  5. </virtual>
  6. </dl>

你可以在虚拟标签上添加if 或者 data-is属性

  1. <virtual data-is="my-tag" if={condition}>
  2. <p>Show me with no wrapper on condition</p>
  3. </virtual>

HTML元素标签

你可以把HTML元素当作riot标签使用,但只能在body内这么用,如下:

  1. <ul data-is="my-list"></ul>
  2. riot.mount('my-list')

当你碰到这种情况的时候,你需要使用data-is属性

  1. <my-fancy-options>
  2. <option>foo</option>
  3. <option>bar</option>
  4. </my-fancy-options>
  5. <!-- 下面的代码是错误的, 一个 select 标签 只允许出现<option> 子元素 -->
  6. <select>
  7. <my-fancy-options />
  8. </select>
  9. <!-- 下面的代码是正确的 因为渲染 <option> 标签时会使用 <select> 作为父标签 -->
  10. <select data-is='my-fancy-options'></select>

本系列写完了,祝好!

riot.js教程【六】循环、HTML元素标签的更多相关文章

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

    前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...

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

    前文回顾 riot.js教程[四]Mixins.HTML内嵌表达式 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二] ...

  3. riot.js教程【四】Mixins、HTML内嵌表达式

    前文回顾 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法: riot.j ...

  4. riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法

    基本要求 一个riot标签,就是展现和逻辑的组合(也就是html和JS): 以下是编写riot标签最基本的规则: 先撰写HTML,再撰写JS,JS代码可以写在<script>标签内部,但这 ...

  5. riot.js教程【一】简介

    Riotjs简介 Riotjs是一款简单的.优雅的.组件化UI前端开发框架: 他支持自定义标签(custom tags),拥有令人愉悦的语法,优雅的API和非常小的体积: 为什么需要一个新的界面库 前 ...

  6. 通过JS动态的修改HTML元素的样式和增添标签元素等

    一. 通过JS动态的修改HTML元素的样式   1. 要想在js中动态的修改HTML元素的样式,首先需要写document,    document我们称之为文档对象,这个对象中保存了当前网页中所有的 ...

  7. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  8. js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性

    js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性 <!doctype html> <html> <head> <meta char ...

  9. 阅读:重新介绍 JavaScript(JS教程)

    这篇文章是记录自己阅读重新介绍 JavaScript(JS 教程)的记录和个人体会 在线调试代码工具:https://codepen.io/pen 引言 分歧根源:名字Javascript和Java有 ...

随机推荐

  1. OpenGL ES2.0光照

    一.简单光照原理 平行光(正常光) 光照效果=   环境颜色 + 漫反射颜色 + 镜面反射颜色 点光源 光照效果=   环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子 聚光灯 光照效果= ...

  2. Ubuntu 中登录相关的日志

    登录相关的日志涉及到系统的安全,所以是系统管理中非常重要的一部分内容.本文试图对登录相关的日志做一个整理. /var/log/auth.log 这是一个文本文件,记录了所有和用户认证相关的日志.无论是 ...

  3. substance在java swing中使用注意事项

    package org.dgw.uidemo; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.UI ...

  4. Python 初学者 入门 应该学习 python 2 还是 python 3?

    许多刚入门 Python 的朋友都在纠结的的问题是:我应该选择学习 python2 还是 python3? 对此,咪博士的回答是:果断 Python3 ! 可是,还有许多小白朋友仍然犹豫:那为什么还是 ...

  5. asp.net C# 实现微信服务器配置

    微信服务器配置接收页面示例代码 /// <summary> /// 微信的Token /// </summary> const string Token = "Tok ...

  6. 【转】NOR Flash擦写和原理分析

    1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存 ...

  7. 【NOIP2015提高组】 Day1 T2 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  8. 【计算机网络】 一个小白的DNS学习笔记

    参考书籍 <计算机网络-自顶向下>  作者 James F. Kurose   DNS的作用   DNS是因特网的目录服务 DNS是因特网的目录服务,它提供了主机名到IP地址映射的查询服务 ...

  9. 走进 Xamarin Test Recorder for Xamarin.Forms

    此篇是承接之前 走进 UITest for Xamarin.Forms 的,所以如果没有看过之前的可以先看下之前的 UITest 比起上一篇纯敲代码只适合程序员的 UITest ,这一篇不管是程序员还 ...

  10. angular指令之complie和link不得不说的故事

    angular指令比较晦涩难懂的就是complie和link字段了,什么时候该用complie?什么时候该用link?总是很难分别清楚.当理解了指令的真正编译原理的时候,就会发现这相当的简单. ng怎 ...