728x90
λ°μν
π‘ μ€μ΅ ν¬μΈνΈ!
π νμΌ μ λ‘λ μ μ½λ μ€ννκΈ°
- Vue λ μΉλΈλΌμ°μ λ€λ£¨λ κ²μ λμμ£Όλ λꡬμΌλΏμ΄λ―λ‘, μ€μ§μ μΌλ‘ μΉ κ°λ°μ μ νκΈ° μν΄μλ Vue λ¬Έλ²λΏλ§ μλλΌ μΉλΈλΌμ°μ μ κΈ°λ₯λ€μ λ§μ΄ μμμΌ νλ€.
- μμ μλ μ¬μ©μκ° μ λ‘λν μ΄λ―Έμ§λ₯Ό μλ²λ‘ 보λ΄μ μ μ₯νκ³ , μ μ₯ν μ΄λ―Έμ§ URL μ λ€μ μ¬μ©μμκ² λ³΄λΈ λ€μ <img src=""> μ λ£μ΄μ 보μ¬μ£Όλ λ± κ³Όμ μ΄ λ³΅μ‘νμ¬ λ°λ‘ λΈλΌμ°μ μ λ°μνμ¬ λ³΄μ¬μ£Όλ κ² μ΄λ €μ λ€.
- νμ§λ§ IE11 μ΄μμμλ λΈλΌμ°μ λ΄μμ μ§μ μ΄λ―Έμ§λ₯Ό μ‘°μνλ κ²μ΄ κ°λ₯ν΄μ‘λλ° λνμ μΌλ‘ λκ°μ§ λ°©λ²μ΄ μλ€.
- FileReader() λ₯Ό μ¬μ©νκΈ°
: μ΄λ―Έμ§λ₯Ό κΈμλ‘ λ³νν μ μκ³ , λ³νλ κΈμλ μ΄λκ°μ μ μ₯νκ±°λ μ¬μ©νλ κ²μ΄ κ°λ₯νλ€. - URL.createObjectURL() μ μ¬μ©νκΈ°
: μ΄λ―Έμ§ URL μ μ κΉ μμ±ν΄μ€λ€. (λ¨, μλ‘κ³ μΉ¨νλ©΄ μ¬λΌμ§λ€.)
- FileReader() λ₯Ό μ¬μ©νκΈ°
π URL.createObjectURL() μ¬μ©ν΄λ³΄κΈ°
// μ 체 μ½λ 미리보기
// μ 체 μ½λμ λ΄μ©μ΄ κΈΈμ΄ 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 v-if="step === 2">λ°ν</li>
</ul>
<img src="./assets/logo.png" class="logo" />
</div>
<Container :posts="posts" :step="step" :imgUrl="imgUrl" />
<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: "",
};
},
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++;
},
},
components: {
Container: Container,
},
};
</script>
<style>
</style>
<input @change="uploadImg" type="file" id="file" class="inputfile" />
- "+" λ²νΌμ λλ¬μ νμΌμ μ νν΄μ <input /> μ λ³νκ° λ°μνλ©΄ uploadImg λΌλ ν¨μκ° μ€νλκ² ν΄μ£Όμλ€.
methods: {
uploadImg(e) {
let file = e.target.files;
let url = URL.createObjectURL(file[0]);
this.imgUrl = url;
this.step++;
}
}
- μ΄μ μμ uploadImg ν¨μλ₯Ό methods μ μμ±ν΄μ£Όλ©΄ λλ€.
- νμΌμ΄ μ λ‘λν λ e.target.files λΌλ μ½λλ₯Ό νμ©νλ©΄ μ λ‘λν νμΌλ€μ 리μ€νΈλ₯Ό μ μ μμΌλ©°, λμ κ²½μ° μ΄λ₯Ό file μ΄λΌλ λ³μμ λ΄μμ£Όμλ€.
- νμΌ νλλ§ μ¬λ €λ array μλ£νμΌλ‘ λ§λ€μ΄μ£Όλ―λ‘ μ λ‘λν νμΌμ΄ νλμΈ κ²½μ° νΉμ 첫λ²μ§Έ νμΌλ§ μμμ url μ΄ νμν κ²½μ°, μμ κ°μ΄ URL.createObjectURL(file[0]) ννμ μ½λλ₯Ό μμ±νλ©΄ μμμ url μ΄ μμ±λλ€.
- κ·Έλ¦¬κ³ μ΄ κ³Όμ μμ μμ±λ url μ Container.vue μμ μ¬μ©ν΄μΌ νλ―λ‘, data 보κ΄ν¨μ imgUrl μ΄λΌλ νλͺ©μ λ§λ€μ΄μ€ νμ uploadImg() μμ μμλ‘ μμ±λ url μ imgUrl μ μ μ₯ν΄μ£Όμλ€.
- μμ μμ μ΄ λλλ©΄ λ©μΈ νμ΄μ§(step : 0)μ κ·Έλλ‘ λ¨μμλ κ² μλλΌ νν° μ ν νμ΄μ§(step: 1)λ‘ λμ΄κ°μΌ νλ―λ‘ step κ°μ +1 ν΄μ£Όμλ€.
- μ΄μ μμ±λ url μ΄ μ μ₯λ imgUrl μ imgUrl μ΄λΌλ μ΄λ¦μΌλ‘ props λ¬Έλ²μ ν΅ν΄ Container.vue λ‘ μ μ‘ν΄μ£Όλ©΄ Container.vue μμ imgUrl μ μ¬μ©ν μ μκ² λλ€.
π μμ±λ μμ URL λ°μ΄ν°λ°μΈλ©νκΈ°
// μ 체 μ½λ 미리보기
// μ 체 μ½λμ λ΄μ©μ΄ κΈΈμ΄ 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">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,
imgUrl: String,
},
};
</script>
<style>
</style>
- App.vue λ‘λΆν° props λ¬Έλ²μΌλ‘ μ λ¬λ°μ imgUrl μ props μ λ±λ‘ν΄μ€ λ€μ, <template></template> λ΄μμ νμν λΆλΆμ style μ background-image μμ±μΌλ‘ λ°μ΄ν°λ°μΈλ©ν΄μ£Όμλ€.
728x90
λ°μν
'[κ°λ°] Practice > Vue.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[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 |
[Vue.js] Instagram νλ‘μ νΈ μμ±νκΈ° λ° λ°μ΄ν°λ°μΈλ©νκΈ° (0) | 2022.04.06 |