100DaysOfCode #26: Vue.js <script>直接組み込み(16) コンポーネントのv-modelでイベントが伝わらない(汗)
やったこと
- コンポーネントの基本: 1h
今日の進捗のコードはコチラ。
きづいた(困った)こと: コンポーネントのv-modelでイベントが伝わらない
Vueのドキュメントコンポーネントの基本内のコンポーネントで v-model を使うでは、
そのとおり コンポーネントのタグで v-model
を使って v-on
v-bind
を統合するテクニックが紹介されています。
カスタムイベントは v-model で動作するカスタム入力を作成することもできます。このことを覚えておいてください:
<input v-model="searchText">
これは以下と同じことです:
<input v-bind:value="searchText" v-on:input="searchText = $event.target.value"
勉強会でも「実は」と但し書きされるぐらい認知されていない?テクニックです。
Vueの v-model は v-bind と v-on を組み合わせた効果になる、というのは初耳で有用な話でした✨
https://y-mix.hateblo.jp/entry/2019/07/18/223422
v-bind相当はできたけどv-onが…
さて、このコンポーネントで v-model を使うの動きを確かめるために、次の点を考えて下記のコードを書きましたが正しく動作しません。
propsから値が渡っている(v-bind
はできている)のですが、
console.log()
が出ていないのでイベントが伝わらずに関数が呼ばれていない(v-on
ができていない)状態です。
原因がわからないので保留です……
HTML
<div id="components-5"> <h3>コンポーネントでv-modelを使う(v-on動作せず)</h3> <p>{{ censoredMessage }}</p> <custom-input v-model="censoredMessage"></custom-input> </div>
JavaScript
Vue.component("custom-input", { props: ['inputtedValue'], template: `<input :value="inputtedValue" @input="$emit('onCustomInput', $event.target.value)"></input>` }); new Vue({ el: "#components-5", data: { censoredMessage: 'ここに検閲された入力値が表示されます' }, methods: { onCustomInput: function (inputtedValue) { console.log('inputted'); this.censoredMessage = "censored" } } });