728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ๋ค๋ฅธ ํ์ด์ง๊ฐ ํ์ํ๋ค๋ฉด vue-router ๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง ๊ฐ๋จํ UI ๋ค์ ํญ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋์ฑ ํธํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
- ๋ค๋ง, ํ์ด์ง ์ด๋(์์ผ๋ก๊ฐ๊ธฐ, ๋ค๋ก๊ฐ๊ธฐ) ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ๋ฉด vue-router ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ํํฐ ์ ํ ํ์ด์ง์ ๊ธ ์์ฑ ํ์ด์ง๋ ์์ง ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํด์ฃผ์ง ์์ ๋ ์ด์์๋ง ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ step ์ด 0 ์ธ ๊ฒฝ์ฐ (๋ฉ์ธ ํฌ์คํธ ํ์ด์ง)
๐ step ์ด 1 ์ธ ๊ฒฝ์ฐ (ํํฐ ์ ํ ํ์ด์ง/์ฌ์ง ์ ๋ก๋ ํ์ด์ง)
๐ step ์ด 2 ์ธ ๊ฒฝ์ฐ (๊ธ ์์ฑ ํ์ด์ง)
๐ ์ฌ์ง ์ ๋ก๋ ํ๋ฉด ๋ง๋ค๊ธฐ
- Instagram ์ ๋ณด๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก posts ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง๊ฐ ์๊ณ , ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ๋ ์ด๋ฏธ์ง๋ฅผ ๊พธ๋ฏธ๋ ํ์ด์ง ๋ฐ ๊ธ์ ์ ๋ ํ์ด์ง๊ฐ ์๋ค.
- ์์ ์ ์ฌํ๊ฒ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด์ Container.vue ํ์ผ ์์ ๋ชจ๋ ํ์ด์ง ๋ ์ด์์์ ๋ง๋ค์ด ๋ฃ์ด๋ ํ์, ํญ์ ์ ํํ๋ฉด ํด๋น ํญ์ ๋ ์ด์์ ๋ฐ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ฒ๋ผ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋ ํน์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํด์ฃผ์๋ค.
๐ค 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" :step="step" />
<button class="btn" @click="more" v-if="step === 0">๋๋ณด๊ธฐ</button>
<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";
import axios from "axios";
export default {
name: "App",
data() {
return {
posts: posts,
moreCnt: 0,
step: 0,
};
},
methods: {
more() {
axios
.get(`https://codingapple1.github.io/vue/more${this.moreCnt}.json`)
.then((result) => {
this.posts.push(result.data);
this.moreCnt++;
})
.catch(() => {
console.log("GET ์์ฒญ์ ์คํจํ์ต๋๋ค.");
});
},
},
components: {
Container: Container,
},
};
</script>
<style>
</style>
- ๋จผ์ , data ๋ณด๊ดํจ์ step ์ด๋ผ๋ ํญ๋ชฉ์ ๋ง๋ค์ด์ 0~2๊น์ง์ ์ซ์๋ฅผ ์ ์ฅํ๊ธฐ๋ก ํ๋ค.
- step ์ด 0 ์ธ ๊ฒฝ์ฐ์๋ ๋ฉ์ธํ๋ฉด์ธ Post.vue ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํ๊ณ step ์ด 1 ์ธ ๊ฒฝ์ฐ์๋ ํํฐ ์ ํ ํ์ด์ง๋ฅผ, step ์ด 2 ์ธ ๊ฒฝ์ฐ์๋ ๊ธ ์์ฑ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๋ง์ด๋ค.
- ๊ฐ ํ์ด์ง ๋ ์ด์์์ ๊ฒฝ์ฐ Container.vue ํ์ผ์ ์์ผ๋ฏ๋ก, step ์ step ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก props ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ Container.vue ๋ก ์ ์กํด์ฃผ์๋ค.
- ์ด์๋ ๋ณ๊ฐ๋ก ์ฌ์ง ์ ๋ก๋ ํ์ด์ง๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ๋ ์๊ด ์์ง๋ง, "๋๋ณด๊ธฐ" ๋ฒํผ์ ๊ฒฝ์ฐ Post.vue ๋ฅผ ๋ณด์ฌ์ค ๋์๋ง ๋ณด์ด๋ ๊ฒ ์์ฐ์ค๋ฌ์์, v-if ๋ฌธ์ ์ถ๊ฐํ์ฌ step ์ด 0 ์ธ ๊ฒฝ์ฐ์๋ง ๋ณด์ด๋๋ก ํด์ฃผ์๋ค.
๐ค Container.vue
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋์ ๋ด์ฉ์ด ๊ธธ์ด css ๋ถ๋ถ์ ์ ์ธํ๋ค.
<template>
<div>
<div v-if="step === 0">
<Post :post="post" v-for="(post, i) in posts" :key="i" />
</div>
<!-- ํํฐ์ ํํ์ด์ง -->
<div v-if="step === 1">
<div class="upload-image"></div>
<div class="filters">
<div class="filter-1"></div>
<div class="filter-1"></div>
<div class="filter-1"></div>
<div class="filter-1"></div>
<div class="filter-1"></div>
</div>
</div>
<!-- ๊ธ์์ฑํ์ด์ง -->
<div v-if="step === 2">
<div class="upload-image"></div>
<div class="write">
<textarea class="write-box">write!</textarea>
</div>
</div>
</div>
</template>
<script>
import Post from "./Post.vue";
export default {
name: "Container",
data() {
return {};
},
components: {
Post: Post,
},
props: {
posts: Array,
step: Number,
},
};
</script>
<style>
</style>
- ์ด์ App.vue ์์ props ๋ฌธ๋ฒ์ผ๋ก Container.vue ๋ก ์ ๋ฌ๋ฐ์ step ์ props ์ ๋ฑ๋กํด์ฃผ์๋ค.
- ๊ทธ ๋ค์์ผ๋ก, v-if ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ step ์ ์ซ์์ ๋ฐ๋ผ ๋ณด์ฌ์ค ํ์ด์ง๋ค์ ๋ฌถ์ด์ฃผ์๋ค.
- ๋ฐ๋ผ์, ์ด์ step ์ด 0 ์ธ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ ๊ฐ์๋งํผ Post.vue ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , step ์ด 1 ์ธ ๊ฒฝ์ฐ์๋ ํํฐ ์ ํ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , step ์ด 2 ์ธ ๊ฒฝ์ฐ์๋ ๊ธ ์์ฑ ํ์ด์ง๊ฐ ๋ณด์ฌ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] ๊ธ๋ฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2022.04.06 |
---|---|
[Vue.js] ์๋ฒ ์์ด ์ ๋ก๋ํ ์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ (0) | 2022.04.06 |
[Vue.js] ์๋ฒ๋ก ajax ์์ฒญํ๋ ๋๋ณด๊ธฐ ๋ฒํผ ๋ง๋ค๊ธฐ (0) | 2022.04.06 |
[Vue.js] Instagram ํ๋ก์ ํธ ์์ฑํ๊ธฐ ๋ฐ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ (0) | 2022.04.06 |
[Vue.js] Nested routes ์ push ํจ์ ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.04.05 |