速習vue.jsという本を読んでいて、以下のサンプルコードが出てきました:
お題
<!DOCTYPE html>
<html lang="ja">
<body>
<div id="app">
<form>
<label for="name">メールアドレス:</label>
<textarea v-bind:value="emails.join(';')" v-on:input="emails = $events.target.value.split(';')"></textarea>
<ul>
<li v-for:"email in emails">{{ email }}</li>
</ul>
</div>
</body>
</html>
new Vue({
el: '#app',
data: {
emails: []
}
});
これを算出プロパティとしたほうが良い書き方、と合ったので試してみました。
ダメだったコード
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta charset='UTF-8'/>
<title>騾溽ソ歎ue.js</title>
</head>
<style>
[v-cloak] {
display: none;
}
</style>
<body>
<div id='app'>
<form>
<textarea v-bind:value="joinedEmail" v-on:input="splitEmails($event.target.value)" cols="80" rows="10"></textarea>
</form>
<ul>
<li v-for="email in emails">{{ email }}</li>
</ul>
</div>
<script src='https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js'></script>
<script src='./hello.js'></script>
</body>
</html>
var app = new Vue({
el: '#app',
data: {
emails: ['foo@foo.com','bar@bar.com'],
},
computed: {
joinedEmail: function() {
return this.emails.join(';');
},
splitEmails: function(value) {
this.emails = value.split(';');
}
},
methods: {
}
});
なぜダメなのかまだ完全に理解できていませんが、computed
ではそもそも、引数を渡せないみたいです。
ちなみにsplitEmails関数をmethodsに移動させると動きます。
動くコード
setterを使うことで実現できました:
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta charset='UTF-8'/>
<title>速習Vue.js</title>
</head>
<style>
[v-cloak] {
display: none;
}
</style>
<body>
<div id='app'>
<form>
<textarea v-bind:value="joinedEmail" v-on:input="splitEmails = $event.target.value" cols="80" rows="10"></textarea>
</form>
<ul v-cloak>
<li v-for="email in emails">{{ email }}</li>
</ul>
</div>
<script src='https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js'></script>
<script src='./hello.js'></script>
</body>
</html>
var app = new Vue({
el: '#app',
data: {
emails: ['a@a.com','b@b.com'],
myval: ''
},
computed: {
joinedEmail: function() {
return this.emails.join(';');
},
splitEmails: {
set: function(value) {
this.emails = value.split(';');
}
}
},
methods: {
}
});
とりあえず動くようになりましたが、動作原理をちゃんと理解せねば…