ページ内で使用している値を子コンポーネントに渡す方法をメモ。
サンプルコード
まずコンポーネントに分ける前の状態を試してみます。
pagesディレクトリ内にindex.vueというファイルを作成して、以下のような内容にします。
<template> <div class="p-article-list"> <article class="p-article-item" v-for="article of articles" :key="article.id"> <NuxtLink class="p-article-item__link" v-bind:to="'/article/' + article.id + '/'"> <div class="p-article-item__date">{{ article.date }}</div> <p class="p-article-item__ttl">{{ article.title }}</p> </NuxtLink> </article> </div> </template> <script> export default { data() { return { articles: [ { "id": "0003", "date": "2021/07/10", "title": "記事C", "body": "記事Cの本文です。" }, { "id": "0002", "date": "2021/07/10", "title": "記事B", "body": "記事Bの本文です。" }, { "id": "0001", "date": "2021/07/10", "title": "記事A", "body": "記事Aの本文です。" } ] } } } </script> <style> .p-article-list { margin-bottom: 50px; } .p-article-item { border-bottom: #cccccc 1px solid; padding: 15px; } .p-article-item__link { color: #333333; text-decoration: none; } .p-article-item__date { font-size: 14px; } .p-article-item__ttl { margin: 0; font-size: 16px; } </style>
配列のデータを一覧として表示しています。
この記事部分(articleタグ部分)をコンポーネントとして分けてみます。
まずnuxt.config.jsに下記を追加します。
export default { components: true }
次にcomponentsディレクトリ内にArticleItem.vueというファイルを作成して、以下のような内容にします。
<template> <article class="p-article-item"> <NuxtLink class="p-article-item__link" v-bind:to="'/article/' + article.id + '/'"> <div class="p-article-item__date">{{ article.date }}</div> <p class="p-article-item__ttl">{{ article.title }}</p> </NuxtLink> </article> </template> <script> export default { props: ['article'] } </script> <style> .p-article-item { border-bottom: #cccccc 1px solid; padding: 15px; } .p-article-item__link { color: #333333; text-decoration: none; } .p-article-item__date { font-size: 14px; } .p-article-item__ttl { margin: 0; font-size: 16px; } </style>
templete内はほぼそのままで、styleもarticleタグ内で使用している部分を持ってきています。
12行目が親からのデータを受け取る部分です。
pages/index.vueを以下のように変更します。
<template> <div class="p-article-list"> <ArticleItem v-for="article of articles" :article="article" :key="article.id" /> </div> </template> <script> export default { data() { return { articles: [ { "id": "0003", "date": "2021/07/10", "title": "記事C", "body": "記事Cの本文です。" }, { "id": "0002", "date": "2021/07/10", "title": "記事B", "body": "記事Bの本文です。" }, { "id": "0001", "date": "2021/07/10", "title": "記事A", "body": "記事Aの本文です。" } ] } } } </script> <style> .p-article-list { margin-bottom: 50px; } </style>
scriptは変更なしで、styleはArticleItem.vueに移行した部分を削除しています。
3行目がコンポーネント(ArticleItem.vue)を指定している部分で、「:article=”article”」とすることで指定したコンポーネントにarticleのデータを渡しています。
コメントが承認されるまで時間がかかります。