Riot 3.7にアップデートしたところ、今まで動いていたコードがうまく動かなくなってしまいました。
falsyな値
JavaScriptには、falsyな値(条件式に入れるとfalse
として処理される値)が7つあります1。
false
null
undefined
0
-0
-
''
(空文字列) NaN
Riot 3.7では、このうち数値でない4つ(false
、null
、undefined
、''
(空文字列))の挙動が3.6以前と違ってきます。
実際にやってみた
まずはこちらのPlunkrを御覧ください。ラジオボタンを生成して、onchange
でvalue
をalert
するようにしてあるだけですが、false
、null
、undefined
、''
の4つは、「on」という妙な値を表示します2。これは、Riotで値のないvalue
属性を削除してしまっているからということです(Issue)。そして、value
のないラジオボタンはon
という値を持つものとみなされるので、このような挙動となります。
対策
なかなかバグの方は解決しないので、対策を考えてみました。
Q1: HTMLとして書き出したい値は何?
Riotが最終的に生成するのはHTMLである以上、その結果は何かしらの文字列となります。最終結果がfalse
という形で必要なのなら、"false"
という文字列にすれば、この問題は影響しません。ただ、最終型として空文字列を出力したいのなら、この方法は使えません。
Q2: 属性なしではまずいですか?
多くの属性では、attr=''
とした場合と、attr
がない場合で動作は変わりません。影響しないのなら、入っていないままでも特に困りません。ただ、一部には意味が違う例があります。
-
type
がradio
やcheckbox
の<input>
の場合、value
なしではvalue="on"
とみなされることがあります。 -
<img>
のalt
については、alt=""
だと「画像は装飾なのでテキスト化不要」、alt
なしでは「画像はテキストで代替不能」と、テキストにならない点では同じですが、セマンティクスは正反対になります。 - (絶賛募集中)
Q3: 他の手段はありませんか?
<img>
のalt
はどうしようもなさそうですが、<input>
のvalue="on"
については直接radio
やcheckbox
を出力に使わず、hidden
で値を出力させるようにすれば、value
なしがvalue=""
と同じように動いてくれます。