前提・実現したいこと
Vueを学習しており、現在はMonacaでアプリの画面遷移について勉強中です。
v-ons-navigatorで管理されたコンポーネント間で共有できる変数を用意したいと考えています。
コンポーネントは
・App.vue (v-ons-navigator所持)
・Page1.vue (最初に表示されるページ)
・Page2.vue (途中でpush、popされるページ)
の三つです。
App.vueに作ったtodos配列を、push時に子に渡し、
子からは、emitで値を親に渡して、親のコンポーネントで配列の追加を行っております。
下記は、そのソースコードとなっております。
page1、page2それぞれ配列を追加できる形になっておりますが、
描画の更新が行われません。またこのほかに方法があればご教授願いたいです。
ソースコード (試したこと①の内容)
vue.js
1//App.vue 2 3<template> 4 <v-ons-navigator 5 :page-stack="pageStack" 6 @push-page="pushPage" 7 @pop-page="popPage" 8 @add-todo="addTodo" 9 ></v-ons-navigator> 10</template> 11 12<script> 13import page1 from './Page1' 14import page2 from './Page2' 15 16export default { 17 data() { 18 return { 19 pageStack: [], 20 todos: [ 21 { 22 text: 'todo one', 23 }, 24 { 25 text: 'todo two', 26 }, 27 { 28 text: 'todo three', 29 } 30 ] 31 } 32 }, 33 methods: { 34 pushPage(page) { 35 this.pageStack.push({ 36 extends: page, 37 data : ()=> { 38 return { 39 todos: this.todos 40 } 41 } 42 }) 43 }, 44 popPage() { 45 this.pageStack.pop(); 46 }, 47 addTodo(val) { 48 this.todos.push({text: val}) 49 } 50 }, 51 created: function(){ 52 this.pushPage(page1); 53 } 54} 55</script>
vue.js
1// Page1.vue 2 3<template> 4 <v-ons-page> 5 <custom-toolbar>Page 1</custom-toolbar> 6 <v-ons-list-item v-for="(todo) in todos"> 7 <label> 8 {{ todo.text }} 9 </label> 10 </v-ons-list-item> 11 12 <ons-button @click="nextPage"> 13 Page2に遷移する 14 </ons-button> 15 <ons-button @click="change"> 16 todoを追加する 17 </ons-button> 18 </v-ons-page> 19</template> 20 21<script> 22import page2 from './Page2' 23export default { 24 methods: { 25 nextPage() { 26 this.$emit('push-page', page2) 27 }, 28 change() { 29 this.$emit('add-todo', 'page1の値です') 30 } 31 }, 32 props: ['pageStack'] 33} 34</script>
vue.js
1//Page2.vue 2 3<template> 4 <v-ons-page> 5 <custom-toolbar>Page 2</custom-toolbar> 6 <ons-button @click="pop"> 7 Page1に戻る 8 </ons-button> 9 <ons-button @click="change"> 10 todoを追加する 11 </ons-button> 12 </v-ons-page> 13</template> 14 15<script> 16export default { 17 methods: { 18 pop() { 19 this.$emit('pop-page') 20 }, 21 change() { 22 this.$emit('add-todo', 'page2の値です') 23 } 24 }, 25 props: ['pageStack'] 26} 27</script>
試したこと
①pushの第二引数でextendを使用し、data型で直接渡す方法を試しました。
結果:参照で渡せないことと、親に返すだけではPage1とPage2の同期がとれないことが問題となりました。
追記:子の間でも値を共有していることはconsole.logにて確認できましたが、再描画のみが行われていない状態でした。
②vueの解説でよくあるpropsで行うやりかたも、ons-navigatorが絡むと形がイメージできず、
取り入れることができませんでした。
追記:ons-navigatorでpropsは利用できないとのことでした。代わりのextends。
③Vue.prototype.$hoge というグローバルに近いものも試しましたが、思ったように値変更ができないようで断念しました。
補足情報
vue : 2.5.16
vue-onsenui : 2.6.1
onsenui : 2.10.3
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/20 13:59