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

简介: 前文回顾riot.js教程【五】标签嵌套、命名元素、事件、标签条件riot.js教程【四】Mixins、HTML内嵌表达式riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期;riot.

前文回顾
riot.js教程【五】标签嵌套、命名元素、事件、标签条件
riot.js教程【四】Mixins、HTML内嵌表达式
riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期;
riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法;
riot.js教程【一】简介;

循环

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

<todo>
  <ul>
    <li each={ items } class={ completed: done }>
      <input type="checkbox" checked={ done }> { title }
    </li>
  </ul>

  this.items = [
    { title: 'First item', done: true },
    { title: 'Second item' },
    { title: 'Third item' }
  ]
</todo>

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

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

上下文

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

<todo>
  <div each={ items }>
    <h3>{ title }</h3>
    <a onclick={ parent.remove }>Remove</a>
  </div>

  this.items = [ { title: 'First' }, { title: 'Second' } ]

  remove(event) {

    // looped item
    var item = event.item

    // index on the collection
    var index = this.items.indexOf(item)

    // remove from collection
    this.items.splice(index, 1)
  }
</todo>

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

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

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

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

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

自定义的循环标签

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

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

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

简单数组循环

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

<my-tag>
  <p each="{ name, i in arr }">{ i }: { name }</p>

  this.arr = [ true, 110, Math.random(), 'fourth']
</my-tag>

对象属性循环

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

<my-tag>
  <p each="{ value, name  in obj }">{ name } = { value }</p>

  this.obj = {
    key1: 'value1',
    key2: 1110.8900,
    key3: Math.random()
  }
</my-tag>

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

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

key属性

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

<loop>
  <ul>
    <li each={ user in users } key="id">{ user.name }</li>
  </ul>
  <script>
    this.users = [
      { name: 'Gian', id: 0 },
      { name: 'Dan', id: 1 },
      { name: 'Teo', id: 2 }
    ]
  </script>
</loop>

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

<loop>
  <ul>
    <li each={ user in users } key={ user.id() }>{ user.name }</li>
  </ul>
  <script>
    this.users = [
      { name: 'Gian', id() { return 0 } },
      { name: 'Dan', id() { return 1 } },
      { name: 'Teo', id() { return 2 } }
    ]
  </script>
</loop>

虚拟标签

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

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

<dl>
  <virtual each={item in items}>
    <dt>{item.key}</dt>
    <dd>{item.value}</dd>
  </virtual>
</dl>

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

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

HTML元素标签

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

<ul data-is="my-list"></ul>

riot.mount('my-list')

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

<my-fancy-options>
  <option>foo</option>
  <option>bar</option>
</my-fancy-options>

<!-- 下面的代码是错误的, 一个 select 标签 只允许出现<option> 子元素 -->
<select>
  <my-fancy-options />
</select>

<!-- 下面的代码是正确的 因为渲染 <option> 标签时会使用 <select> 作为父标签 -->
<select data-is='my-fancy-options'></select>

本系列写完了,祝好!

目录
相关文章
|
2月前
|
移动开发 搜索推荐 UED
HTML5的新语义化标签
HTML5引入的这些新语义化标签,通过明确标识内容的结构和意义,使得网页结构更加清晰,易于理解和维护。使用这些标签不仅提升了网页的可读性和可访问性,还增强了搜索引擎和辅助技术对网页内容的解析能力。在实际开发中,合理使用这些语义化标签,能够显著提升网页的质量和用户体验。
100 49
|
2月前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
39 2
2024年5月node.js安装(winmac系统)保姆级教程
|
1月前
|
Web App开发 移动开发 HTML5
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
91 2
|
2月前
|
存储 移动开发 前端开发
高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容
本文深入探讨了高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容,旨在提升开发效率、网站性能和用户体验。
66 5
|
2月前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
62 3
|
2月前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
50 4
|
2月前
|
移动开发 HTML5
html5+three.js公路开车小游戏源码
html5公路开车小游戏是一款html5基于three.js制作的汽车开车小游戏源代码,在公路上开车网页小游戏源代码。
76 0
html5+three.js公路开车小游戏源码
|
2月前
|
移动开发 编解码 UED
除了 `<audio>` 和 `<video>` 标签,HTML5 还支持哪些多媒体格式?
【10月更文挑战第19天】HTML5对多种多媒体格式的支持,为网页开发者提供了丰富的选择,能够更好地满足不同类型多媒体内容在网页中的展示和交互需求,提升了网页的用户体验和多媒体应用的多样性。
|
2月前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
157 6
|
3月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
62 4

热门文章

最新文章