前置き
slotを使った実践・応用編です👏
いやいや、基礎が知りたいの😡
という方は基礎編をどうぞ!
slotを使おう!実践・応用編
では、ここからは
実際にコードを書いてみましょう。
作る物はこちら!
アイコンはICOON MONOさんでお借りしております。
callとmailで検索すればヒットします。
https://icooon-mono.com/
構成
お問い合わせページで
電話かメールかを選択していただき、
それぞれの詳細ページに飛ぶようなボタンを作ります。
・画像(imgもしくはsvgが入る)とpが入ったシンプルなボタン。
・ボタンは幅によって可変に。
・余白や幅の値など、スタイリングは大体で良いです。
・リンク先は記載しなくて良いです。
やりたい方は次の #slotを使おう!実践・応用編+α へどうぞ
・slotを使って見た目が出来ていればOK!
Let's try!
CSSも勉強中の方は
ごちゃつかないように
まずは自分がやりたいことを優先してください🌟
スタイリングは先でも後でも良いです。
まずは作る楽しさを知りましょう🎶🤗
ticktack…
できましたか?
答えはこちら!!
スタイリングはscssで記載してますが、
通常のcssでももちろんOKです!
scss
入れ子にした書き方ができます!
構造が把握しやすくなるので便利です💕
答え
) components
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<template> <button class="button-default"> <slot /> <p> <slot name="label" /> </p> </button> </template> <script> export default { } </script> <style lang="scss" scoped> .button-default { cursor: pointer; display: block; text-align: center; height: 150px; border-radius: 8px; border: 1px solid #dddddd; &:hover { transform: scale(1.04); transition-duration: 40ms; } > p { margin-top: 20px; font-family: 'Noto Sans CJK JP'; font-size: 20px; letter-spacing: 0.1em; } } </style> |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<template> <div class="page"> <div class="buttons"> <ButtonDefault class="button"> <img class="img" src="/callcenter.png" alt=""> <template v-slot:label> お電話でのお問い合わせ </template> </ButtonDefault> <ButtonDefault class="button"> <img src="/mail.png" alt=""> <template v-slot:label> メールでのお問い合わせ </template> </ButtonDefault> </div> </div> </template> <script> import ButtonDefault from '~/components/Buttons/ButtonDefault.vue' export default { components: { ButtonDefault, }, } </script> <style lang="scss" scoped> .page { padding: 20px; > .buttons { display: flex; justify-content: space-between; > .button { width: calc(50% - 11px); > img { with: 36px; } } } } </style> |
- 画像slotをsvgなどで囲まない
imgかsvgどちらでも使えるようにしたいので、
画像は親で指定します
=スタイリングは親で行う
=どうしても子で書く場合はdivで囲む - slot nameを使う場合、それぞれにつけなくても良い
2つslotがあれば、
片方のみnameをつければ区別ができます!
ただ分かりやすく個別につける方が⭕ - 親ではtemplate v-slot: で指定
- ボタン同士の余白など、配置は親で指定
できましたか?🤩
これでslotには慣れましたね🎉
+α ぜひチャレンジしてください!
slotを使おう!実践・応用編 +α
構成
- slot利用
- リンク先追加ver.
- nuxt-linkや$attrsを使用
ディレクトリ の構造はファイル名は下記とします。
1 2 3 4 5 6 |
components/ --| Buttons/ -----| ButtonDefault.vue pages/ --| index.vue |
Let's try!
コンポーネント自体にnuxt-linkつける…?
こうかな…?
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<template> <nuxt-link to="/contact/call"> <ButtonDefault> <img class="img" src="/callcenter.png" alt=""> <template v-slot:label> お電話でのお問い合わせ </template> </ButtonDefault> </nuxt-link> </template> <script> import ButtonDefault from '~/components/Buttons/ButtonDefault.vue'; export default { components: { ButtonDefault, } } </script> |
これはダメなんです…!🙅♀️
ticktack…
答え
さぁ答えを見てみましょう!
スタイリングなどは同じのため、
template内のみ記載します!
) components
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<template> <nuxt-link v-bind="$attrs" class="button-default" > <slot /> <p> <slot name="label" /> </p> </nuxt-link> </template> <script> export default { } </script> |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<template> <div class="page"> <div class="buttons"> <ButtonDefault to="/contact/call" class="button"> <img class="img" src="/callcenter.png" alt=""> <template v-slot:label> お電話でのお問い合わせ </template> </ButtonDefault> <ButtonDefault to="/contact/mail" class="button"> <img src="/mail.png" alt=""> <template v-slot:label> メールでのお問い合わせ </template> </ButtonDefault> </div> </div> </template> <script> import ButtonDefault from '~/components/Buttons/ButtonDefault.vue'; export default { components: { ButtonDefault, } } </script> |
Point!
- 子でbuttonタグをnuxt-linkにする
リンク先を$attrsにし、親で遷移先を自由に指定する - 親で読み込んだコンポーネントに遷移先を指定
to="/contact/call" の部分
読み込んだコンポーネントに
直接nuxt-linkを指定する方法が
検索してもなかなか出てきませんでした。。。
でもこれで大丈夫!
いかがでしたか?😀
これであなたも今日からslotマスターです✨🏀🧢