困ってること
Vue.jsでサイトを作っており、
インスタンスごとに下記のようなメソッドを使って、ある程度スクロールするとイベントを発火するためのフラグ(isActive)をtrueにする処理を使っています。
(trueになると、isshowなりでコンテンツが現れます。今回その部分は割愛します)
vue
1new Vue({ 2 el:'app', 3 data:{ 4 scrollY:0, 5 isActive:false 6 }, 7 mounted(){ 8 window.addEventListener('scroll',this.handleScroll); 9 10 }, 11 methods: { 12 handleScroll() { 13 this.scrollY = window.scrollY; 14 if (this.scrollY >= 3000 //3000までウインドウがスクロールするとtrueに 15 this.isActive = true; 16 } 17 } 18} 19})
html
1<section class="app"> 2 <div v-show="isActive" > 3 <h1>ある程度スクロールすると現れるコンテンツ </h1> 4 </div> 5</section>
やりたいこと
今はこれを、インスタンスごとに書いて、
コンテンツの位置によって3000の部分(スクロールの値)を変えているのですが、
メンテナンス性がわるいので、methodsのところを1箇所に書き、それを使いまわしたいと思っています。
component化すればいいのかもしれませんが、
componentでtemplateを複数の場所で使う方法はわかるのですが、メソッドの使い回す方法がわかりません。。(公式「https://jp.vuejs.org/v2/guide/components.html」にはコンポーネントでもmethods、オプションを受け入れます。とあるのでできるとは思うのですが。。)
さらに各インスタンス毎のコンテンツの位置も伝えたいのです。
自分で試したこと
こんな感じで試しに書いてみましたが、、コンソール上、
[Vue warn]: Failed to mount component: template or render function not defined.
found in
---> <MoveTest>
<Root>
というエラーになってしまいます。
html
1<div id="test"> 2 <move-test><span v-show="isActive">ここが動くか</span></move-test> 3</div>
vue
1//コンポーネント 2Vue.component('move-test', { 3 props:['position'], 4 mounted(){ 5 window.addEventListener('scroll',this.handleScroll); 6 }, 7 methods: { 8 handleScroll() { 9 this.scrollY = window.scrollY; 10 if (this.scrollY >= position){ 11 this.isActiveup = true; 12 }else{ 13 this.isActive = false; 14 } 15 } 16 } 17}) 18 19new Vue({ 20 el:'#test', 21 data:{ 22 position:2000, 23 isActive:false 24 } 25 }) 26
何か誤っているのか、もしくはそもそも
スクロール時に複数のコンテンツに動きをつけたいなら、もう少し違う方法がないか、などアドバイスいただけますと幸いです。
追記:
<div id="test"> <move-test><span v-show="isActive">ここが動くか</span></move-test> </div> <div id="test2"> <move-test><span v-show="isActive">ここも動くか</span></move-test> </div>というコンテンツを記載したい時に、
test1とtest2をインスタンス化した時に、それぞれを共通したメソッド(ただし発火のタイミングはtest1.2で異なる)で使う方法があればと思っています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/09 11:22
2019/06/09 11:49