4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Riot.jsAdvent Calendar 2017

Day 9

Riot.jsのイベントオブジェクトに入ってくるitem

Last updated at Posted at 2017-12-08

Riotタグ内でイベントハンドラを仕掛けた場合、普通のイベントオブジェクトに加えてitemというメンバが入っていることがあります。

ループ時の対応

以前、Riotのeach=で配列を管理していたときに、途中で飛ばすとインデックスがずれるという問題が起きたのですが、その過程で、「each内部で回したものが、イベントオブジェクトで取れる」ことが判明しました。

e.itemの中身

回し方によって、入ってくるものが違います。

  • each={arr}のように、変数名指定なしの場合…e.item自体がarrの要素として入っていたオブジェクトになる
  • each={item in arr}のように値だけ取る形にした場合…e.item.itemに配列の要素が入る
  • each={item, i in arr}のように値と順番を取るようにした場合…e.item.itemに配列の要素、e.item.i回した分だけのインデックスが入る

なお、値はシャローコピーなので、配列の要素が配列などオブジェクト型だった場合、イベントハンドラ内からそのまま破壊的に変更することで、元の配列要素を変更することも可能です。

イベントセットの方法

e.itemがセットされるのは、ネイティブでaddEventListenerした場合には動かず、タグ内でon***={}のようにした場合に限られます。on***でセットできないカスタムイベントの場合は、使えないということになります。

子タグからの駆動

よくあるパターンとして、「特殊な入力フォームをRiotで作って、それを親タグで使う」というようなものが考えられます。ネイティブでchangeイベントが発生するような状況の場合、子タグ自体にonchangeを仕掛けておくと、バブリングで上がってきた分もRiot経由で処理して、itemが入ります。

一方で、子タグのJavaScriptコードで値を書き換えたような場合、changeイベントは発生しませんので、同様な動作を期待するのなら自力で発生させる必要があります。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?