以下記事の2ページ目「Composition APIを利用したロジックの共通化」をやってみるがうまくいかない
※ 新Vue.js「Vue 3」でコンポーネント実装法を大きく変える「Composition API」:CodeZine(コードジン)
※ 新Vue.js「Vue 3」でコンポーネント実装法を大きく変える「Composition API」:CodeZine(コードジン)
現象
こうなって欲しいが
こうなってしまう
v-forでterminal配列を表示させている筈だが、その上の階層のstate変数全体が表示されている?
テキストボックス(input)のv-modelも"[object Object]"と表示されてしまう。
件数表示(compute)とボタンのイベントは正常
こうなってしまう
v-forでterminal配列を表示させている筈だが、その上の階層のstate変数全体が表示されている?
テキストボックス(input)のv-modelも"[object Object]"と表示されてしまう。
件数表示(compute)とボタンのイベントは正常
ソース
main.js
import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app')App.vue
<template> <div> <phones/> </div> </template> <script> import Phones from './components/Phones.vue' export default { name: 'App', components: { Phones }, } </script>components/PhonesLogic.js
import { reactive, computed, toRefs} from 'vue' export default function PhonesLogic(initialList) { const state = reactive( { terminals: initialList, newTerminal: '', }, ) function addNew() { state.terminals.push(state.newTerminal) state.newTerminal = '' } const count = computed(function() { return state.terminals.length }) return {...toRefs(state), addNew, count} }components/Phones.vue
<template> <div> <h4>iOS: {{ iOSLogic.count }} 機種</h4> <ul> <li v-for="(elem, index) in iOSLogic.terminals" v-bind:key="index"> {{ elem }} </li> </ul> <h4>Android: {{ androidLogic.count }} 機種</h4> <ul> <li v-for="(elem, index) in androidLogic.terminals" v-bind:key="index"> {{ elem }} </li> </ul> <h4>合計: {{ countTotal }} 機種</h4> <div> <input v-model="iOSLogic.newTerminal" placeholder="iOS機種"> <button @click="iOSLogic.addNew">追加</button> </div> <div> <input v-model="androidLogic.newTerminal" placeholder="Android機種"> <button @click="androidLogic.addNew">追加</button> </div> </div> </template> <script> import { computed } from 'vue' import PhonesLogic from './PhonesLogic' export default { setup() { // PhoneLogicでiOS/Androidの各処理ロジックを生成 const iOSLogic = PhonesLogic(['iPhone 11']) const androidLogic = PhonesLogic(['Galaxy S20 5G']) // 総端末数を計算する算出プロパティ const countTotal = computed(function() { return iOSLogic.count.value + androidLogic.count.value }) // ここまで定義してきた内容を返却 return { iOSLogic, androidLogic, countTotal } } } </script>
調査
components/PhonesLogic.js PhonesLogicメソッドの戻り値 "...toRefs(state)" を "state" へ変更
li要素のterminals配列を参照している箇所を "xxxLogic.terminals" から "xxxLogic.state.terminals" へ変更
input要素のv-modelを "xxxLogic.newTerminal" から "xxxLogic.state.newTerminal" へ変更したら正常動作した。
オリジナルのサンプルソース(p005_refactor)から、
・components/Phones.vue
・components/PhonesLogic.js
・App.vue
・main.js
をコピーしてみたがダメ
ということはソースコードのパンチミスが原因ではない
li要素のterminals配列を参照している箇所を "xxxLogic.terminals" から "xxxLogic.state.terminals" へ変更
input要素のv-modelを "xxxLogic.newTerminal" から "xxxLogic.state.newTerminal" へ変更したら正常動作した。
オリジナルのサンプルソース(p005_refactor)から、
・components/Phones.vue
・components/PhonesLogic.js
・App.vue
・main.js
をコピーしてみたがダメ
ということはソースコードのパンチミスが原因ではない
Vue.js
0 件のコメント:
コメントを投稿