とんたんの技術メモ

注)ただのメモです。

vue v-scroll スクロールイベントのメモ

最後尾でイベントを発火させる方法

<v-btn
  v-show="showBtn"
  v-scroll="onScroll"
  fab
  dark
  depressed
  @click="$vuetify.goTo(to)"
>{{ label }}</v-btn>

private onScroll(e: any) {
  if (typeof window === 'undefined') return

  const { scrollTop, clientHeight, scrollHeight } = e.target.scrollingElement
  if (scrollTop + clientHeight >= scrollHeight) {
    this.showBtn = false
    return
  }
  this.showBtn = true
}

nuxtに外部スクリプトを埋め込んだときのメモ

defer: 非同期 body: フッターに埋め込む

head() {
  return {
    titleTemplate: null,
    __dangerouslyDisableSanitizers: ['script'],
    script: [
      {
        hid: 'conversion-analytics1',
        src:
          'https://xxxx.com/tagjs/ConversionTags.min.js',
        defer: true,
        body: true,
      },
      {
        hid: 'conversion-analytics2',
        innerHTML: `
        document.addEventListener('DOMContentLoaded', (event) => {
          conversionTag.run();
        })
      `,
        type: 'text/javascript',
        charset: 'utf-8',
        body: true,
      },
    ],
  }
},

vscode + docker + eslint + prettier の開発環境構築メモ

prettierがnode_modulesにないとエラーをはいた。

コンテナでインストールされてるnode_modulesがホスト側にマウントされてないことが原因。

macにnode入れてとか汚染したくないので他の方法を模索…

docker-composeでyarn installするのは起動遅くなって嫌だし、、、

結局コンテナ側にあるnode_modulesをホスト側にコピーすることにした。

docker-compose -f docker-compose.local.yml run --rm -v $PWD/node_modules:/app/node_modules -w /app [web] yarn install

これでホスト側にnode_modulesをコピーできるので、vscode + docker + eslint + prettierを汚染することなく使える。

あとは、vscodeワークスペースのsettings.jsonに以下を書いたら動いた。

{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "prettier.configPath": "./node_modules/prettier",
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "eslint.format.enable": true,
  "eslint.codeAction.showDocumentation": {
    "enable": true
  }
}

nuxtjsで画面遷移するとストアーのデータが書き換わるのでエラーになる件の対応

ほぼ同じ内容で、同じstoreを使いまわしてるページで画面遷移すると、キーは同じだけどバリューの内容が変わるのでエラーになる。

例えばA to Bの場合、Bのfetchが完了後に、ストアが変わるのでAが再レンダリングされてから、Bがレンダリングされて遷移するという流れになるみたい。

これに関しては、おそらくスライドアニメーションなどにも対応するために、この挙動になっているのだろうと予想…

バグではないらしい

で対応方法として、、、

  1. 共通処理 plugins/router.js でbeforeEachとか使って遷移中ですよフラグを更新して、再レンダリングを防ぐ これすると、コードがシンプルになっていい感じ

  2. ストアの中身をページごとに分割する 同じストアだけど、データをページごとに分割して、getterとかで取得分けする これすると、スライドアニメーションとかにも対応できる でもちょっとめんどくさい

  3. その他 思いつかず

案件によって使い分けるのがいいかな

APIエンドポイントを分けるか分けないか?

公開している記事一覧と、自分の下書きを含む記事一覧のAPIどう分ける?

/articles

/me/articles

or

/articles

/articles?me

最初分けてみたけど管理が大変…パターン増えたらファイルが多くなって超めんどくさいw

なので、エンドポイントは1個にして、コントローラーのパターンマッチで分けたほうが管理しやすい

認証は、ルーターでやるんじゃなくてコントローラーで指定