Vuetify?
Vuetifyλ Vue.jsλ₯Ό μν λμμΈ νλ μμν¬μ
λλ€.
μ΄λ² ν¬μ€ν
μμλ Vue.jsμ Vuetify λ₯Ό νμ©ν΄μ μλ²μ νμΌμ μ
λ‘λνλ λ°©λ²μ λν΄ μμλ³΄κ³ μ ν©λλ€.
ν΄λΉ ν¬μ€ν μ μ¬μ μ νμΌ μ λ‘λλ₯Ό μ²λ¦¬ν μ μλ λ°±μλ μλ²κ° ꡬμ±λμ΄μλ€λ μ μ¬νμ μ§νλ©λλ€.
Vuetify File input μ»΄ν¬λνΈ μ¬μ©
Vuetify μμλ κΈ°μ‘΄μ HTML input
νκ·Έ μν μ νλ μ¬λ¬κ°μ§ μ
λ ₯ μ μ© μ»΄ν¬λνΈλ€μ΄ μ‘΄μ¬ν©λλ€.
μ΄μ€ μ ν¬λ νμΌ μ
λ‘λλ₯Ό μν v-file-input
νκ·Έλ₯Ό νμ©ν©λλ€.
Product.vue
v-file-input μ»΄ν¬λνΈ
v-file-input
μ μ νλ νμΌμ λ³κ²½μ΄ μλ€λ©΄ change
μ΄λ²€νΈλ₯Ό ν΅ν΄ μνλ μμ
μ μνν μ μμ΅λλ€.
ν΄λΉ μ΄λ²€νΈ νΈλ€λ§ ν¨μλ₯Ό λ±λ‘ν΄μ€ λ€ μ νλ νμΌμ μΆμ ν μ μλλ‘ ν©λλ€.
<template>
<div>
μν λ±λ‘νκΈ°
<v-file-input label="File input" @change="selectFile"></v-file-input>
<v-btn @click="submit">μλ²μ μ μ‘νκΈ°</v-btn>
</div>
</template>
νμΌ μ 보λ₯Ό μ μ₯ν λ°μ΄ν° μ μΈ
μ νλ νμΌ κ°μ²΄λ₯Ό κ΄λ¦¬ν λ°μ΄ν° μμ±μ μ μΈν΄μ€λλ€.
data() {
return {
image: '',
}
},
νμΌ μ ν μ΄λ²€νΈ μ²λ¦¬
μμ change
μ΄λ²€νΈ νΈλ€λ¬ ν¨μλ‘ λ±λ‘ν selectFile
ν¨μμμλ μΈμλ‘ μ νλ νμΌ κ°μ²΄λ₯Ό μ λ¬λ°μ΅λλ€.
ν΄λΉ κ°μ²΄λ₯Ό data
μ image
μ ν λΉν΄μ€λλ€.
// νμΌ λ³κ²½ μ μ΄λ²€νΈ νΈλ€λ¬
selectFile(file) {
this.image = file;
},
axios λ‘ μλ²μ νμΌ μ λ‘λνκΈ°
μ΄μ μ νλ νμΌμ μ μ‘νκΈ° μν΄ formData
λ₯Ό μμ±ν©λλ€.axios
μ μμ² μΈμλ‘ μλ² api μ£Όμλ₯Ό μ§μ νκ³ Node.jsμ multer
λͺ¨λμ μν΄Content-Type
μ multipart/form-data
λ‘ μ§μ ν΄μ€¬μ΅λλ€.
async submit() {
const formData = new FormData();
formData.append('image', this.image);
try {
const { data } = await axios.post('http://127.0.0.1:3000/product/create', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
console.log(data);
} catch(err) {
console.log(err);
}
}
μ 체 μ½λ
<template>
<div>
μν λ±λ‘νκΈ°
<v-file-input label="File input" @change="selectFile"></v-file-input>
<v-btn @click="submit">μλ²μ μ μ‘νκΈ°</v-btn>
</div>
</template>
import axios from "axios";
export default {
data() {
return {
image: "test image",
};
},
methods: {
async submit() {
const formData = new FormData();
formData.append("image", this.image);
try {
const { data } = await axios.post(
"http://127.0.0.1:3000/product/create",
formData,
{
headers: {
"Content-Type": "multipart/form-data",
},
}
);
console.log(data);
} catch (err) {
console.log(err);
}
},
// νμΌ λ³κ²½ μ μ΄λ²€νΈ νΈλ€λ¬
selectFile(file) {
this.image = file;
},
},
};
μ€ν κ²°κ³Ό(μλ² λ‘κ·Έ)
POST /product/create 200 11.313 ms - 129
OPTIONS /product/create 204 0.205 ms - 0
{
image: 'profile-1590918594170.jpg',
}
μ°Έκ³ μλ£
'π archive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Vue.js ν΄λμ€μ μ€νμΌ λ°μΈλ© μ μ©νκΈ° (1) | 2021.03.02 |
---|---|
Vue.js μμ λ°μν(Reactivity)μ λ€λ£¨λ λ°©λ² (0) | 2021.03.02 |
Vue-router λ€λΉκ²μ΄μ κ°λ νμ©νκΈ° (0) | 2021.03.01 |
Vue.js μ€μ²© λΌμ°ν° (Nested Router) μ¬μ©νκΈ° (0) | 2021.03.01 |
Vue-Router history mode μ§μμ μν Django μ€μ (0) | 2021.03.01 |
π¬ λκΈ