728x90
λ°μν
π‘ μ€μ΅ ν¬μΈνΈ!
- μ€λμ Instagram νλ‘μ νΈλ₯Ό μμ±νμ¬ Instagram κ³Ό μ μ¬νκ² λ μ΄μμμ λ§λ€κ³ λ°μ΄ν°λ°μΈλ©κΉμ§ ν΄λ³΄μλ€.
- λ μ΄μμμ μ¬μ€μ κ°μ¬λμ΄ λ€ λ§λ€μ΄ μ€μ κ±°λΌ... λ΄κ° ν κ±°λΌκ³ λ λ°μ΄ν°νμΌ λ§λ€κ³ λ°μ΄ν°λ°μΈλ©ν κ² μΈμλ μλ€.
- λμ€μ λ μ΄μμ λ§λλ κ²λ νΌμμ μ§νν΄λ³΄λ©΄ μκ°μ μ’ μ€λ κ±Έλ¦¬κ² μ§λ§ μ¬λ―Έμμ§ μμκΉ μκ°ν΄λ³Έλ€.
π Vue λ‘ Instagram νλ‘μ νΈ μμ±νκΈ°
- Vue μ€μΉ, νλ‘μ νΈ μμ± λ° κ°λ°νκ²½ μ
ν
νλ λ°©λ²μ μ΄μ μ ν¬μ€ν
ν΄λ κ² μμ΄μ μμΈν μ€λͺ
μ μλ΅νλ€.
(νΉμ vue μ€μΉνλ λ°©λ² λ° κ°λ°νκ²½ μ ν νλ λ°©λ²μ΄ κΆκΈνλ€λ©΄ μ¬κΈ°λ₯Ό ν΄λ¦!)
π Instagram μ²λΌ λ μ΄μμ λ§λ€κΈ° λ° λ°μ΄ν°λ°μΈλ©νκΈ°
π€ λ°μ΄ν°λ₯Ό λ΄μ posts.js νμΌ λ§λ€κΈ°
export default [
{
name: "Kim Hyun",
userImage: "https://placeimg.com/100/100/arch",
postImage: "https://placeimg.com/640/480/arch",
likes: 36,
date: "May 15",
liked: false,
content: "μ€λ 무μμ νλλ©΄μ μ무κ²λ μνμ΄μ",
filter: "perpetua"
},
{
name: "John Doe",
userImage: "https://placeimg.com/200/200/people",
postImage: "https://placeimg.com/640/480/people",
likes: 20,
date: "Apr 20",
liked: false,
content: "νν μλμ€νκ·Έλ¨",
filter: "clarendon"
},
{
name: "Minny",
userImage: "https://placeimg.com/100/100/animals",
postImage: "https://placeimg.com/640/480/animals",
likes: 49,
date: "Apr 4",
liked: false,
content: "μ°λ¦¬μ§ κ°λ νμ₯μ€ λ¬Όλ λ΄λ¦Ό",
filter: "lofi"
}
]
- post.js νμΌμ λ§λ λ€μ, κ°μ¬λμ΄ μ 곡ν΄μ£Όμ λ°μ΄ν°λ₯Ό λ΄μ export default λ¬Έλ²μ μ¬μ©νμ¬ λ€λ₯Έ νμΌμμ import ν μ μκ² λ§λ€μ΄μ£Όμλ€.
π€ App.vue
// μ 체 μ½λ 미리보기
// μ 체 μ½λμ λ΄μ©μ΄ λ무 κΈΈμ΄, css λΆλΆμ μ μΈνλ€.
<template>
<div class="header">
<ul class="header-button-left">
<li>Cancel</li>
</ul>
<ul class="header-button-right">
<li>Next</li>
</ul>
<img src="./assets/logo.png" class="logo" />
</div>
<Container :posts="posts" />
<div class="footer">
<ul class="footer-button-plus">
<input type="file" id="file" class="inputfile" />
<label for="file" class="input-plus">+</label>
</ul>
</div>
</template>
<script>
import Container from "./components/Container.vue";
import posts from "./assets/posts";
export default {
name: "App",
data() {
return {
posts: posts,
};
},
components: {
Container: Container,
},
};
</script>
<style>
</style>
- posts.js μμ λ°μ΄ν°λ€μ posts λΌλ μ΄λ¦μΌλ‘ import ν΄μμ data 보κ΄ν¨μ λ±λ‘ν΄μ£Όμλ€.
- κ·Έλ¦¬κ³ App.vue μμ Container.vue κ° μκ³ , λ κ·Έ μμ Post.vue λ₯Ό 보μ¬μ€ κ²μ΄λ―λ‘ μΌλ¨ App.vue μ Container.vue λ₯Ό import νκ³ components μ λ±λ‘ν΄μ€ λ€μ <template></template> μμ μνλ μμΉμ Container Component λ₯Ό λ£μ΄μ£Όμλ€.
- κ·Έλ¦¬κ³ posts λΌλ λ°μ΄ν°λ μ΅μ’ μ μΌλ‘ Post.vue κΉμ§ μ μ‘λμ΄μΌ νλ―λ‘, posts λΌλ μ΄λ¦μΌλ‘ data 보κ΄ν¨μ posts λ₯Ό μ μ‘ν΄μ£Όμλ€.
π€ Container.vue
// μ 체 μ½λ 미리보기
// μ 체 μ½λμ λ΄μ©μ΄ λ무 κΈΈμ΄, css λΆλΆμ μ μΈνλ€.
<template>
<div>
<Post :post="post" v-for="(post, i) in posts" :key="i" />
</div>
</template>
<script>
import Post from "./Post.vue";
export default {
name: "Container",
data() {
return {}
},
components: {
Post: Post,
},
props: {
posts: Array,
},
};
</script>
<style>
</style>
- Container.vue μμλ Post.vue κ° λ€μ΄κ°μΌ νλ―λ‘, λ¨Όμ Post.vue λ₯Ό import ν΄μ€ νμ components μ λ±λ‘ν΄μ£Όμλ€.
- κ·Έ λ€μ <template></template> μμ μνλ μμΉμ Post Component λ₯Ό λ£μ΄μ£Όμλ€.
- κ·Έλ¦¬κ³ , App.vue μμ λ°μμ¨ posts λ₯Ό props μ λ±λ‘ν ν λ°λ³΅λ¬Έμ ν΅ν΄ posts μ λ΄κΈ΄ λ°μ΄ν° νλνλλ₯Ό post λΌλ μ΄λ¦μΌλ‘ λ€μ Post.vue λ‘ μ μ‘ν΄μ£Όμλ€.
(μ¬κΈ°λ μμ§ ν·κ°λ €μ, λ°λ³΅λ¬Έ λ§λλ μ°μ΅μ ν νμ νλμ© μ½λλ₯Ό μμ ν΄λκ°λ€.)
π€ Post.vue
// μ 체 μ½λ 미리보기
// μ 체 μ½λμ λ΄μ©μ΄ λ무 κΈΈμ΄, css λΆλΆμ μ μΈνλ€.
<template>
<div class="post">
<div class="post-header">
<div
class="profile"
:style="{ backgroundImage: `url(${post.userImage})` }"
></div>
<span class="profile-name">{{ post.name }}</span>
</div>
<div
class="post-body"
:style="{
backgroundImage: `url(${post.postImage})`,
}"
></div>
<div class="post-content">
<p>{{ post.likes }} Likes</p>
<p>
<strong>{{ post.name }}</strong> {{ post.content }}
</p>
<p class="date">{{ post.date }}</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {};
},
props: {
post: Object,
},
components: {},
};
</script>
<style>
</style>
- μ΄μ Container.vue μμ props λ‘ λ°μ post λ₯Ό props μ λ±λ‘ν λ€ νλμ© λ°μ΄ν°λ°μΈλ©μ ν΄μ£Όλ©΄ λλ€.
- λ€λ§, style μμ±μ λ°μ΄ν°λ°μΈλ©νλ κ² μ²μμλ μ‘°κΈ μ΄λ €μ λ€.
- λ¨Όμ , style μμ±μ λ°μ΄ν°λ°μΈλ©μ νκΈ° μν λ°μμ μΌλ‘ style μμ μ½λ‘ ( : )μ λΆμ¬μ£Όμλ€.
- μμ±ν λμλ κ°μ²΄ ꡬ문μ νμ©νμ¬ :style="{ backgroundImage: `url(${post.userImage})` }" μ κ°μ΄ μμ±ν΄λ λκ³ , μΌλ°μ μΈ μΈλΌμΈ μ€νμΌ μμ± μμ±νλ―μ΄ :style="`background-image: url(${post.userImage})`" μ κ°μ΄ μμ±ν΄λ λλ€.
- λ¨, κ°μ²΄ ꡬ문μ νμ©ν λμλ μμ±λͺ μ camelCase μ kebab-case λ‘ μμ±ν΄μΌ νλ€.
728x90
λ°μν
'[κ°λ°] Practice > Vue.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Vue.js] ν λ§λ€κΈ° λ° νμ μ΄μ©ν μ¬μ§ μ λ‘λ νμ΄μ§ λ§λ€κΈ° (0) | 2022.04.06 |
---|---|
[Vue.js] μλ²λ‘ ajax μμ²νλ λ보기 λ²νΌ λ§λ€κΈ° (0) | 2022.04.06 |
[Vue.js] Nested routes μ push ν¨μ μ¬μ©ν΄λ³΄κΈ° (0) | 2022.04.05 |
[Vue.js] URL νλΌλ―Έν°λ₯Ό νμ©ν μμΈ νμ΄μ§ λ§λ€κΈ° (0) | 2022.04.05 |
[Vue.js] vue-router μ€μΉ ν λΌμ°ν νκΈ° (0) | 2022.04.05 |