728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
๐ "๋ฐํ" ๋ฒํผ ๋๋ฅด๋ฉด ๊ธ๋ฐํ๋๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋์ ๋ด์ฉ์ด ๊ธธ์ด css ๋ถ๋ถ์ ์ ์ธํ๋ค.
<template>
<div class="header">
<ul class="header-button-left">
<li v-if="step === 1 || step === 2" @click="step = 0">Cancel</li>
</ul>
<ul class="header-button-right">
<li @click="step++" v-if="step === 1">Next</li>
<li @click="publish" v-if="step === 2">๋ฐํ</li>
</ul>
<img src="./assets/logo.png" class="logo" />
</div>
<Container
:posts="posts"
:step="step"
:imgUrl="imgUrl"
@content="content = $event"
/>
<button class="btn" @click="more" v-if="step === 0">๋๋ณด๊ธฐ</button>
<div class="footer" v-if="step === 0">
<ul class="footer-button-plus">
<input @change="uploadImg" 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,
imgUrl: "",
content: "",
};
},
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 ์์ฒญ์ ์คํจํ์ต๋๋ค.");
});
},
uploadImg(e) {
let file = e.target.files;
let url = URL.createObjectURL(file[0]);
this.imgUrl = url;
this.step++;
},
publish() {
let myPost = {
name: "Bak Seoyun",
userImage: "https://placeimg.com/100/100/arch",
postImage: this.imgUrl,
likes: 28,
date: "Jun 1",
liked: false,
content: this.content,
filter: "perpetua",
};
this.posts.unshift(myPost);
this.step = 0;
},
},
components: {
Container: Container,
},
};
</script>
<style>
</style>
- "๋ฐํ" ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ์ด๋ฏธ์ง์ ์์ฑํ ๊ธ์ด ๋ฉ์ธํ์ด์ง ๋งจ ์์ ํฌ์คํธ๋ก ๋ ์ผ ํ๋ค.
- ์ฆ, "๋ฐํ" ๋ฒํผ์ ๋๋ ์ ๋ posts ๋ฐ์ดํฐ์ ๋งจ ์์ ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ์ด๋ฏธ์ง์ ์์ฑํ ๊ธ์ด object ํ์์ผ๋ก ๋ค์ด๊ฐ์ผ ํ๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ฌ๋ฉด ์ ๋ฐ์ดํธ๋ posts ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ Post component ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ๋์ด ๋ฉ์ธ ํ์ด์ง์ ๋ณด์ฌ์ง๋ค.
<li @click="publish" v-if="step === 2">๋ฐํ</li>
- ๋จผ์ , "๋ฐํ" ๋ฒํผ์ ํด๋ฆญํ๋ฉด publish() ๋ผ๋ ํจ์๊ฐ ๋์ํ๋๋ก ํด์ฃผ์๋ค.
publish() {
let myPost = {
name: "Bak Seoyun",
userImage: "https://placeimg.com/100/100/arch",
postImage: this.imgUrl,
likes: 28,
date: "Jun 1",
liked: false,
content: this.content,
filter: "perpetua",
};
this.posts.unshift(myPost);
this.step = 0;
},
- posts ๋ผ๋ ๋ฐ์ดํฐ์ ์ฌ์ฉ์๊ฐ ์์ฑํ post ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด, ์์ ๊ฐ์ด ๊ธฐ์กด์ posts ๋ด์ object ๋ฐ์ดํฐ์ ๋๊ฐ์ ํ์์ผ๋ก object ๋ฅผ ํ๋ ๋ง๋ ๋ค์, posts ์ unshift() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
- ์ด๋ฒ์ push() ๋์ unshift() ๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ณด์ฌ์ง๋ ํฌ์คํธ๋ค ์ค ๋งจ ์์ ์๋ ํฌ์คํธ๊ฐ ์๋ก ์ถ๊ฐํ ํฌ์คํธ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ทธ๋ฆฌ๊ณ "๋ฐํ" ๋ฒํผ์ ํตํด ๋ฐํ์ด ๋๊ณ ๋๋ฉด ๊ทธ๋๋ก ๊ธ์์ฑ ํ์ด์ง์ ๋จธ๋ฌด๋ ๊ฒ ์๋๋ผ ๋ฉ์ธ ํ์ด์ง๋ก ๋์์ค๋ ๊ฒ์ด ์์ฐ์ค๋ฌ์ฐ๋ฏ๋ก step ์ 0 ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ฉด ๋๋ค.
- ์ฌ๊ธฐ์ ์ ๋ก๋ํ ์ด๋ฏธ์ง๋ imgUrl ์ ๊ฐ์ ธ์ค๋ฉด ๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ฐ, ์ฌ์ฉ์๊ฐ ์์ฑํ ๊ธ ๋ด์ฉ์ ์ด๋ป๊ฒ ๊ฐ์ ธ์ค๋ฉด ๋ ๊น?
- ๋ฐ๋ก data ๋ณด๊ดํจ์ content ๋ผ๋ ํญ๋ชฉ์ ๋ง๋ค์ด์, ํ์ Component ์ธ Container.vue ์์ <textarea/> ์ ์ ๋ ฅ๋ ๊ฐ์ custom event ๋ก ๋ฐ์์ค๋ฉด ๋๋ค.
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋์ ๋ด์ฉ์ด ๊ธธ์ด 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"
:style="{ backgroundImage: `url(${imgUrl})` }"
></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"
:style="{ backgroundImage: `url(${imgUrl})` }"
></div>
<div class="write">
<textarea
class="write-box"
@input="$emit('content', $event.target.value)"
placeholder="๋ด์ฉ์ ์
๋ ฅํ์ธ์!"
></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,
imgUrl: String,
},
};
</script>
<style>
</style>
- ์ ์ฝ๋์ ๊ฐ์ด ์ฌ์ฉ์๊ฐ <textarea /> ์ ์ ๋ ฅํ ๊ฐ์ธ $event.target.value ๋ฅผ @input ์ ํตํด content ๋ผ๋ ์ด๋ฆ๊ณผ ํจ๊ป App.vue ๋ก ์ ์กํด์ฃผ์๋ค.
<Container
:posts="posts"
:step="step"
:imgUrl="imgUrl"
@content="content = $event"
/>
- App.vue ์๋ ์ด๋ฏธ data ๋ณด๊ดํจ์ content ๋ผ๋ ํญ๋ชฉ์ ๋ง๋ค์ด๋์์ผ๋, ์ ์ฝ๋์ฒ๋ผ custom event ๋ฅผ @content ๋ก ๋ฐ์์ content ์ $event ๋ฅผ ์ ์ฅํด์ฃผ์๋ค.
- ์ด์ <textarea /> ๊ฐ ์์ ๋ ๋๋ง๋ค content ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ณ , "๋ฐํ" ๋ฒํผ์ ๋๋ฅด๋ฉด ์ต์ข ์ ์ผ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ publish() ๋ด์ this.content ์ ํ ๋น๋๋ ๊ฒ์ด๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] props ๋์ slot ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.04.07 |
---|---|
[Vue.js] ์ธ์คํ๊ทธ๋จ ํํฐ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2022.04.07 |
[Vue.js] ์๋ฒ ์์ด ์ ๋ก๋ํ ์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ (0) | 2022.04.06 |
[Vue.js] ํญ ๋ง๋ค๊ธฐ ๋ฐ ํญ์ ์ด์ฉํ ์ฌ์ง ์ ๋ก๋ ํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2022.04.06 |
[Vue.js] ์๋ฒ๋ก ajax ์์ฒญํ๋ ๋๋ณด๊ธฐ ๋ฒํผ ๋ง๋ค๊ธฐ (0) | 2022.04.06 |