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.jsApp.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で良いんだと思う。