Vue.js始めるおれおれアドベントカレンダー2016 – 3日目
なんだかこんな感じのことを言われてしまいまして。
[Vue warn]: id="item-name-{{item.id}}": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div id="{{ val }}">, use <div :id="val">.
読んで字のごとくなんですが、属性で title="{{foo}}"
みたいな書き方は(昔は大丈夫だったけど)今は駄目で、代わりに :title="foo"
みたいにしてね、とのことでした。(ちなみに昔の文法を知ってたんじゃなくてAngularJSと混同して間違えました。)
警告が出る版
<label for="item-name-{{item.id}}">Name</label> <input id="item-name-{{item.id}}" v-model="item.name" class="form-control" type="text" />
警告は出るけど動く。つまり本当に form
の値が文字通りの item-name-{{item.id}}
になる。
警告が出ない版(修正版)
<label :for="`item-name-${item.id}`">Name</label> <input :id="`item-name-${item.id}`" v-model="item.name" class="form-control" type="text" />
これで想定通りの動作。ラベルクリックで入力欄にフォーカス。
あ、でもテンプレート文字列を使ってるので、IE以外の環境でご覧ください。あー今回はただの例だからってんで簡単に書いちゃったけど、実務ではどうするんだろな。JSはBabeれば良いんだろうけど、HTMLだしなあ。IE 11を無視するわけにもいかんだろうし。
警告が出ない昔の版(おまけ)
コードは警告出る版と同じだけど、読み込むVueのバージョンだけv1.0.28にしたもの。
(直近この件については <input>
を <label>
の中に持てれば for
とか指定する必要もなくなってそもそも問題が起きないんだけど、 Bootstrap なんか使うとほら、分けて書けって感じだったから。)
その他
なんか言われたり言われなかったりもしたんだけど、縮小版 vue.min.js
の方だと無言で、開発者版 vue.js
の方で言われました。おおなるほど。
item-name-${item.id}
みたいなのって
どう扱ったら良いんだろう? そのまま書く今回ので動いてるけど、関数化して例えば :for="getControlId('name')"
みたいにした方が良いんだろうか。
methods: { getControlId: function(name) { return `item-${name}-${this.id}`; }, },
みたいな。