Vue.js始めるおれおれアドベントカレンダー2016 – 10日目
作れないことはないんだけど、どうするのが最良なんだろうか。とりあえず作ってみた。
スクロールを拾う
方々でスクロールを監視する必要はないので、偉い部品に任せる。それが main.js なのか App.vue なのか。今回は試しに main.js でやってみた。
- main.js
const app = new Vue({
el: '#app',
render: function (createElement) {
return createElement(App)
},
methods: {
startWatchingScroll: function () {
document.addEventListener('scroll', () => {
const scrollTop = document.body.scrollTop || document.documentElement.scrollTop
console.log(scrollTop)
store.commit('updateScrollTop', scrollTop)
})
}
}
})
app.startWatchingScroll()
removeEventListener() の事は今回はさておく。
- App.vue
<style>
…
</style>
<template>
<div class="scrollTop">Top: {{scrollTop}}</div>
</template>
<script>
var store = require('./store.js')
module.exports = {
data: function () {
return store.state
}
}
</script>
もらって表示するだけ。
よくわからないこと
スクロール監視を行うひと
main.js か App.vue か?
App.vue の方が実質的な本体感があるのでこっちらでやるべきなような。あるいは App.vue は各コンポーネントの取りまとめ役だけになってもらって、その外側に触れるのは main.js の方にするか。今回は後者の方が良いかなーと思ったんだけどあまり自信がない。
他の選択肢として、 main.js 内に app の関数ではなくて直接イベント監視する方法もありそう。
new Vue({
…
})
document.addEventListener('scroll', () => {
const scrollTop = document.body.scrollTop || document.documentElement.scrollTop
store.commit('updateScrollTop', scrollTop)
})
こっちの方が良いかな。あーなんかこっちの方が良い気がしてきた。いやどうなんだろ。
scrollTop を格納する場所
これはたぶんStoreで良いんだと思う。