728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์์ ์ด๋ฏธ์ง๋ค์ ํํฐ ๊ธฐ๋ฅ์ ์ ์ฉํด์ ๋ณด์ฌ์ฃผ๋ ๊ฑด ๋ง๋ค์๋๋ฐ, ์๊ฐํด๋ณด๋ ์์ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ์ ๋ ํฐ ์ด๋ฏธ์ง์ ํํฐ๊ฐ ์ ํ์ง๋ ๊ธฐ๋ฅ์ ์ ๋ง๋ค์ด์(์บก์ฒํ๋ค๊ฐ ์๊ฐ๋ฌ๋ค...) ์กฐ๋ง๊ฐ ์ฝ๋๋ฅผ ์์ ํด์ผ๊ฒ ๋ค.
๐ ํํฐ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
- ์ฌ์ง ์ ๋ก๋ ํ์ด์ง(ํํฐ ์ ํ ํ์ด์ง)๋ฅผ ๋ณด๋ฉด ํ๋จ์ ์์ ๋ฐ์ค๋ค์ด ์๋๋ฐ ์ด ๊ฐ ๋ฐ์ค๋ค์ FilterBox Component ๋ก ๋ฐ๊พธ์ด์ค ๊ฒ์ด๋ค.
๐ค FilterBox.vue ๋ง๋ค๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋์ ๋ด์ฉ์ด ๊ธธ์ด css ๋ถ๋ถ์ ์ ์ธํ๋ค.
<template>
<div class="filter-item" :style="`background-image: url(${imgUrl})`">
</div>
</template>
<script>
export default {
name: "FilterBox",
data() {
return {};
},
props: {
imgUrl: String,
},
};
</script>
<style>
.filter-item {
width: 100px;
height: 100px;
margin: 10px 10px 10px auto;
padding: 8px;
display: inline-block;
color: white;
background-size: cover;
background-position: center;
}
</style>
- FilterBox Component ๋ก ์์ ๋ฐ์ค๋ค์ ์ฑ์ฐ๊ธฐ ์ํด์๋ ์ฐ์ FilterBox Component ๋ถํฐ ๋ง๋ค์ด์ผ ํ๋ค.
- ๋ฐ๋ผ์, FilterBox.vue ํ์ผ์ ๋ง๋ค์ด์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ์์ ๋ฐ์ค๋ค์ ์ ๋ก๋ํ ์ด๋ฏธ์ง๊ฐ ์ฑ์์ง ์ํ์์ ํํฐ๊ฐ ์ ํ์ง๋ ๊ฒ์ด๋ฏ๋ก, ๊ฐ ๋ฐ์ค์ background-image ์์ฑ์ผ๋ก App.vue ๋ก๋ถํฐ props ๋ก ๋ฐ์์จ imgUrl ์ ๋ฃ์ด์ฃผ์๋ค.
๐ค 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"
:style="{ backgroundImage: `url(${imgUrl})` }"
></div>
<div class="filters">
<FilterBox
:class="filter"
:imgUrl="imgUrl"
v-for="(filter, i) in filters"
:key="i"
></FilterBox>
</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";
import FilterBox from "./FilterBox.vue";
export default {
name: "Container",
data() {
return {
filters: [
"aden",
"_1977",
"brannan",
"brooklyn",
"clarendon",
"earlybird",
"gingham",
"hudson",
"inkwell",
"kelvin",
"lark",
"lofi",
"maven",
"mayfair",
"moon",
"nashville",
"perpetua",
"reyes",
"rise",
"slumber",
"stinson",
"toaster",
"valencia",
"walden",
"willow",
"xpro2",
],
};
},
components: {
Post,
FilterBox,
},
props: {
posts: Array,
step: Number,
imgUrl: String,
},
};
</script>
<style>
</style>
- Container.vue ์์ FilterBox Component ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก, ์ฐ์ FilterBox ๋ผ๋ ์ด๋ฆ์ผ๋ก FilterBox Component ๋ฅผ import ํด์ฃผ๊ณ , components ์๋ ๋ฑ๋กํด์ฃผ์๋ค.
[ "aden", "_1977", "brannan", "brooklyn", "clarendon", "earlybird", "gingham", "hudson",
"inkwell", "kelvin", "lark", "lofi", "maven", "mayfair", "moon", "nashville", "perpetua",
"reyes", "rise", "slumber", "stinson", "toaster", "valencia", "walden", "willow", "xpro2"]
- ๊ทธ๋ฌ๊ณ ๋์, data ๋ณด๊ดํจ์ filters ๋ผ๋ ํญ๋ชฉ์ ๋ง๋ค์ด์ ์์ ํํฐ๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด์์ฃผ์๋ค.
<div class="filters">
<FilterBox
:class="filter"
:imgUrl="imgUrl"
v-for="(filter, i) in filters"
:key="i"
></FilterBox>
</div>
- ์ด์ filters ์ ๋ด๊ธด ๋ฐ์ดํฐ๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ ค์, ์ฌ์ง ์ ๋ก๋ ํ์ด์ง ํ๋จ์ ์์ ์ด๋ฏธ์ง๋ค์ ํํฐ๋ฅผ ์์์ฃผ๋ฉด ๋๋ค.
- ์ด ๋, ์ค์ํ ๊ฒ์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค๊ณ ํด์ ์ค์ ๋ก ํํฐ๊ฐ ์ ์ฉ๋๋ ๊ฒ์ ์๋๊ณ ๊ทธ๋ฅ filters ์ ๊ธธ์ด๋งํผ ์ ๋ก๋ํ ์ด๋ฏธ์ง์ ๋๊ฐ์ด ์๊ธด ์์ ์ด๋ฏธ์ง๋ง ์๊ธด๋ค๋ ๊ฒ์ด๋ค.
- ์ค์ ๋ก ํํฐ ๊ธฐ๋ฅ์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋จผ์ CSSgram ์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ฃผ์ด์ผ ํ๋ค.
(์ค์น๋ฐฉ๋ฒ์ ์๋ ์ฐธ๊ณ !) - ์ด์ FilterBox Component ์ ๊ฐ filter ๋ค์ด ์ ์ฉ๋๋๋ก class ์ filter ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํด์ฃผ๋ฉด ๊ฐ ํํฐ์ ํํฐ๋ช ์ ํด๋นํ๋ ํํฐ๊ฐ ์ ์ฉ๋๋ค.
๐ค CSSgram ์ค์นํ๊ธฐ ๋ฐ ์ฌ์ฉํ๊ธฐ
- ์ฌ์ค ์ธ์คํ๊ทธ๋จ ํํฐ๋ CSS ์์ฑ๋ง์ผ๋ก๋ ํ๋ด๋ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ํ๋ฉด CSS ์์ฑ์ ํตํด ์ฑ๋, ๋ช ๋, ์ ๋ช ๋, ๋ธ๋ฌ์ ๊ฐ์ ํจ๊ณผ๋ฅผ ์ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ด๋ ๊ฒ filter ์ linear-gradient ์์ฑ๋ง์ผ๋ก ์ธ์คํ๊ทธ๋จ ํํฐ๋ฅผ ์ฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ฐ, ๊ทธ๊ฒ์ด ๋ฐ๋ก CSSgram ์ด๋ค.
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/cssgram/0.1.12/cssgram.min.css" integrity="sha512-kr3JaEexN5V5Br47Lbg4B548Db46ulHRGGwvyZMVjnghW1BKmqIjgEgVHV8D7V+Cbqm/VBgo3Rcbtv+mGLoWXA==" crossorigin="anonymous" />
- CSSgram ์ค์น๋ ์ ์ฝ๋๋ฅผ index.html ์ <head></head> ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋๋ค.
- ์ค์น๊ฐ ์๋ฃ๋์์ผ๋ฉด ์ํ๋ ์ด๋ฏธ์ง์ class="hudson" ๊ณผ ๊ฐ์ด class ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ํํฐ๊ฐ ์ ์ฉ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] mitt ์ ์ฌ์ฉํ์ฌ ๋ฉ๋ฆฌ ๋จ์ด์ง Component ๊ฐ ๋ฐ์ดํฐ ์ ์กํ๊ธฐ (0) | 2022.04.07 |
---|---|
[Vue.js] props ๋์ slot ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.04.07 |
[Vue.js] ๊ธ๋ฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2022.04.06 |
[Vue.js] ์๋ฒ ์์ด ์ ๋ก๋ํ ์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ (0) | 2022.04.06 |
[Vue.js] ํญ ๋ง๋ค๊ธฐ ๋ฐ ํญ์ ์ด์ฉํ ์ฌ์ง ์ ๋ก๋ ํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2022.04.06 |