Requestパラメータを画面に表示する #nuxtjs #vuejs

概要

http://localhost:3000/sample?hoge=abc123

のようにRequestされた場合に、 abc123 を画面に表示してみる

asyncDataを使う

pageコンポーネントの場合、asyncDataというメソッドを使うと、Context経由でリクエストの情報を取得できる。

asyncDataはレンダリング前に呼びだれ、結果はdataとマージされる。

Queryパラメータの場合は context.query で取得できる

pages/sample.vue はこんな感じになる。

<template>
  <div>
    <p>hoge: {{hoge}}</p>
  </div>
</template>

<script>
export default {
  data: function() {
    return {
      // asyncDataで上書きされる
      hoge: 'default'
    }
  },
  asyncData(context) {
    return {
      // asyncDataでreturnすると、dataにマージされる
      hoge: context.query['hoge']
    }
  }
}
</script>

http://localhost:3000/sample だと「default」が表示されるが、 ?hoge=abc123 をつけると、「abc123」が表示されるようになる。

なお、下記のようにも書ける。

// 最初からqueryを使っちゃう
asyncData({ query }) {
  return {
    hoge: query['hoge']
  }
}

propsでサブコンポーネントに値を受け渡す

asyncDataは pageコンポーネントでしか使えないみたい。

propsを使えばサブコンポーネントに値を受け渡すことができる。

サブコンポーネントの作成

サブコンポーネントcomponents/Sample.vue として作成する。

propsを宣言しておくと値を外から受け取れるようになり、dataと同じように扱える。

今回は hogeFromPage という名前で受け渡すようにする。

<template>
  <p>hoge from page: {{hogeFromPage}}</p>
</template>

<script>
export default {
  
  props: ['hogeFromPage']
}
</script>

Pageコンポーネントから値を受け渡す。

propsは <sample hogeFromPage='hello!' /> のような形式で渡せるようになるのだけど、VueComponentの値を渡すときは v-bind を使えばよさそう。

<template>
  <div>
    <!-- v-bindで値を渡す -->
    <!-- <sample hogeFromPage='hello!' /> -->
    <sample v-bind="{'hogeFromPage': hoge}" />
  </div>
</template>

<script>
// サブコンポーネントをimport
import sample from '~/components/Sample'

export default {
  data: function() {
    return {
      hoge: 'default'
    }
  },
  // サブコンポーネントの利用
  components: { sample },
  asyncData(context) {
    return {
      hoge: context.query['hoge']
    }
  }
}
</script>

これでhogeの値をサブコンポーネントでも使えるようになるはず。

注意点としては コンポーネントからサブコンポーネントへの依存が発生してしまう こと。

親が子のことを意識しなければいけなくなるので、利用は慎重にした方がよさそう。

参考

ja.nuxtjs.org