This repository was archived by the owner on May 25, 2024. It is now read-only.
File tree 10 files changed +225
-225
lines changed
10 files changed +225
-225
lines changed Original file line number Diff line number Diff line change 5
5
Vue.js ではテンプレート、ロジック、そしてスタイルを 1 つのファイルにまとめることで、単一ファイルコンポーネント(` Single File Components ` 、略称 ` SFC ` )として利用することができます。` SFC ` は ` <script setup> ` 内で ` import ` することで、テンプレートで直接使用することが可能となります。
6
6
7
7
``` vue{2,6}
8
- <template>
9
- <MyComponent />
10
- </template>
11
-
12
8
<script setup>
13
9
import MyComponent from './MyComponent.vue'
14
10
</script>
11
+
12
+ <template>
13
+ <MyComponent />
14
+ </template>
15
15
```
16
16
17
17
現在は商品を表示しているだけですが、ヘッダーの情報が増えたり、フッターなどのコンテンツを足していくと ` template ` のコードはどんどん肥大化していきます。それだけでなく、例えば商品に複数写真を表示、個数によって表示金額の変更、といった機能を追加していくと ` script ` のコードも肥大化していきます。肥大化するとコードの見通しも悪くなり、メンテナンスも大変になってきます。そのような状況に陥らないために、商品をコンポーネントに変更してみましょう。
62
62
#### Card.vue
63
63
64
64
``` vue
65
+ <script setup>
66
+ /**
67
+ * 価格を3桁ごとのカンマ付きで返す
68
+ * @param {number} price 価格
69
+ */
70
+ function pricePrefix(price) {
71
+ return price.toLocaleString()
72
+ }
73
+ </script>
74
+
65
75
<template>
66
76
<div class="thumbnail">
67
77
<img
75
85
</div>
76
86
</template>
77
87
78
- <script setup>
79
- /**
80
- * 価格を3桁ごとのカンマ付きで返す
81
- * @param {number} price 価格
82
- */
83
- function pricePrefix(price) {
84
- return price.toLocaleString()
85
- }
86
- </script>
87
-
88
88
<style>
89
89
.item > div.thumbnail > img {
90
90
width: 100%;
Original file line number Diff line number Diff line change @@ -51,14 +51,14 @@ Vue.js では、`{{ }}` のような `Mustache` 構文を使ってテキスト
51
51
:::
52
52
53
53
``` vue
54
- <template>
55
- <div>{{ message }}</div>
56
- </template>
57
-
58
54
<script setup>
59
55
import { ref } from 'vue'
60
56
const message = ref('Welcome to Vue Handson!')
61
57
</script>
58
+
59
+ <template>
60
+ <div>{{ message }}</div>
61
+ </template>
62
62
```
63
63
64
64
``` js
Original file line number Diff line number Diff line change 1
- // region template
2
- <template >
3
- <header class =" header" >
4
- <img
5
- src =" /images/logo.svg"
6
- alt =" " >
7
- <h1 >Vue.js ハンズオン</h1 >
8
- </header >
9
- <main class =" main" >
10
- <template
11
- v-for =" item in items "
12
- :key =" item .id " >
13
- <div
14
- v-if =" !item.soldOut"
15
- class =" item"
16
- :class =" { 'selected-item': item.selected }"
17
- @click =" item.selected = !item.selected" >
18
- <Card
19
- :id =" item.id"
20
- :image =" item.image"
21
- :name =" item.name"
22
- :description =" item.description"
23
- :price =" item.price" />
24
- </div >
25
- </template >
26
- </main >
27
- </template >
28
- // endregion template
29
-
30
1
// region script
31
2
<script setup>
32
3
import { ref } from ' vue'
@@ -78,6 +49,35 @@ const items = ref([
78
49
</script >
79
50
// endregion script
80
51
52
+ // region template
53
+ <template >
54
+ <header class =" header" >
55
+ <img
56
+ src =" /images/logo.svg"
57
+ alt =" " >
58
+ <h1 >Vue.js ハンズオン</h1 >
59
+ </header >
60
+ <main class =" main" >
61
+ <template
62
+ v-for =" item in items "
63
+ :key =" item .id " >
64
+ <div
65
+ v-if =" !item.soldOut"
66
+ class =" item"
67
+ :class =" { 'selected-item': item.selected }"
68
+ @click =" item.selected = !item.selected" >
69
+ <Card
70
+ :id =" item.id"
71
+ :image =" item.image"
72
+ :name =" item.name"
73
+ :description =" item.description"
74
+ :price =" item.price" />
75
+ </div >
76
+ </template >
77
+ </main >
78
+ </template >
79
+ // endregion template
80
+
81
81
// region style
82
82
<style >
83
83
body {
Original file line number Diff line number Diff line change 1
- <template >
2
- <div class =" thumbnail" >
3
- <img
4
- :src =" image"
5
- alt =" " >
6
- </div >
7
- <div class =" description" >
8
- <h2 >{{ name }}</h2 >
9
- <p >{{ description }}</p >
10
- <span >¥<span class =" price" >{{ pricePrefix(price) }}</span ></span >
11
- </div >
12
- </template >
13
-
14
1
<script setup>
15
2
defineProps ({
16
3
name: {
@@ -44,6 +31,19 @@ function pricePrefix(price) {
44
31
}
45
32
</script >
46
33
34
+ <template >
35
+ <div class =" thumbnail" >
36
+ <img
37
+ :src =" image"
38
+ alt =" " >
39
+ </div >
40
+ <div class =" description" >
41
+ <h2 >{{ name }}</h2 >
42
+ <p >{{ description }}</p >
43
+ <span >¥<span class =" price" >{{ pricePrefix(price) }}</span ></span >
44
+ </div >
45
+ </template >
46
+
47
47
<style >
48
48
.item > div .thumbnail > img {
49
49
width : 100% ;
Original file line number Diff line number Diff line change 1
- // region template
2
- <template >
3
- <header class =" header" >
4
- <img
5
- src =" /images/logo.svg"
6
- alt =" " >
7
- <h1 >Vue.js ハンズオン</h1 >
8
- </header >
9
- <main class =" main" >
10
- <template
11
- v-for =" item in items "
12
- :key =" item .id " >
13
- <div
14
- v-if =" !item.soldOut"
15
- class =" item"
16
- :class =" { 'selected-item': item.selected }"
17
- @click =" item.selected = !item.selected" >
18
- <div class =" thumbnail" >
19
- <img
20
- :src =" item.image"
21
- alt =" " >
22
- </div >
23
- <div class =" description" >
24
- <h2 >{{ item.name }}</h2 >
25
- <p >{{ item.description }}</p >
26
- <span >¥<span class =" price" >{{ pricePrefix(item.price) }}</span ></span >
27
- </div >
28
- </div >
29
- </template >
30
- </main >
31
- </template >
32
- // endregion template
33
-
34
1
// region script
35
2
<script setup>
36
3
import { ref } from ' vue'
@@ -88,6 +55,39 @@ function pricePrefix(price) {
88
55
</script >
89
56
// endregion script
90
57
58
+ // region template
59
+ <template >
60
+ <header class =" header" >
61
+ <img
62
+ src =" /images/logo.svg"
63
+ alt =" " >
64
+ <h1 >Vue.js ハンズオン</h1 >
65
+ </header >
66
+ <main class =" main" >
67
+ <template
68
+ v-for =" item in items "
69
+ :key =" item .id " >
70
+ <div
71
+ v-if =" !item.soldOut"
72
+ class =" item"
73
+ :class =" { 'selected-item': item.selected }"
74
+ @click =" item.selected = !item.selected" >
75
+ <div class =" thumbnail" >
76
+ <img
77
+ :src =" item.image"
78
+ alt =" " >
79
+ </div >
80
+ <div class =" description" >
81
+ <h2 >{{ item.name }}</h2 >
82
+ <p >{{ item.description }}</p >
83
+ <span >¥<span class =" price" >{{ pricePrefix(item.price) }}</span ></span >
84
+ </div >
85
+ </div >
86
+ </template >
87
+ </main >
88
+ </template >
89
+ // endregion template
90
+
91
91
// region style
92
92
<style >
93
93
body {
Original file line number Diff line number Diff line change 1
- // region template
2
- <template >
3
- <header class =" header" >
4
- <img
5
- src =" /images/logo.svg"
6
- alt =" " >
7
- <h1 >Vue.js ハンズオン</h1 >
8
- </header >
9
- <main class =" main" >
10
- <template
11
- v-for =" item in items "
12
- :key =" item .id " >
13
- <div
14
- v-if =" !item.soldOut"
15
- class =" item" >
16
- <div class =" thumbnail" >
17
- <img
18
- :src =" item.image"
19
- alt =" " >
20
- </div >
21
- <div class =" description" >
22
- <h2 >{{ item.name }}</h2 >
23
- <p >{{ item.description }}</p >
24
- <span >¥<span class =" price" >{{ pricePrefix(item.price) }}</span ></span >
25
- </div >
26
- </div >
27
- </template >
28
- </main >
29
- </template >
30
- // endregion template
31
-
32
1
// region script
33
2
<script setup>
34
3
import { ref } from ' vue'
@@ -82,6 +51,37 @@ function pricePrefix(price) {
82
51
</script >
83
52
// endregion script
84
53
54
+ // region template
55
+ <template >
56
+ <header class =" header" >
57
+ <img
58
+ src =" /images/logo.svg"
59
+ alt =" " >
60
+ <h1 >Vue.js ハンズオン</h1 >
61
+ </header >
62
+ <main class =" main" >
63
+ <template
64
+ v-for =" item in items "
65
+ :key =" item .id " >
66
+ <div
67
+ v-if =" !item.soldOut"
68
+ class =" item" >
69
+ <div class =" thumbnail" >
70
+ <img
71
+ :src =" item.image"
72
+ alt =" " >
73
+ </div >
74
+ <div class =" description" >
75
+ <h2 >{{ item.name }}</h2 >
76
+ <p >{{ item.description }}</p >
77
+ <span >¥<span class =" price" >{{ pricePrefix(item.price) }}</span ></span >
78
+ </div >
79
+ </div >
80
+ </template >
81
+ </main >
82
+ </template >
83
+ // endregion template
84
+
85
85
<style >
86
86
body {
87
87
font-family : sans-serif ;
Original file line number Diff line number Diff line change
1
+ // #region script
2
+ <script setup>
3
+ import { ref } from ' vue'
4
+ const item = ref ({
5
+ id: 1 ,
6
+ name: ' アボカドディップバケット' ,
7
+ description:
8
+ ' 刻んだ野菜をアボカドと混ぜてディップに。こんがり焼いたバゲットとお召し上がりください。' ,
9
+ price: 480 ,
10
+ image: ' /images/item1.jpg'
11
+ })
12
+ </script >
13
+ // #endregion script
14
+
1
15
// region template
2
16
<template >
3
17
<header class =" header" >
23
37
</template >
24
38
// endregion template
25
39
26
- // #region script
27
- <script setup>
28
- import { ref } from ' vue'
29
- const item = ref ({
30
- id: 1 ,
31
- name: ' アボカドディップバケット' ,
32
- description:
33
- ' 刻んだ野菜をアボカドと混ぜてディップに。こんがり焼いたバゲットとお召し上がりください。' ,
34
- price: 480 ,
35
- image: ' /images/item1.jpg'
36
- })
37
- </script >
38
- // #endregion script
39
-
40
40
// region style
41
41
<style >
42
42
body {
You can’t perform that action at this time.
0 commit comments