Vue+Vant 사진 업로드 및 표시 사례
vant 에 사진 구성 요소 업로드:https://youzan.github.io/vant/#/zh-CN/uploader
그림 을 업로드 할 구성 요소 uploader:
<van-uploader :after-read="onRead" accept="image/*" multiple>
<imgclass="head-img" src="/static/images/addpic.png" ref="goodsImg"/>
</van-uploader>
method 중
methods: {
//
onRead(file) {
console.log(file);
//
this.$refs.goodsImg.src = file.content;
}
}
vant 가 올 린 사진 은 base 64 로 처리 되 었 으 니 바로 뒤로 보 낼 수 있 습 니 다.추가 지식:vue+vant+crodova 이미지 업로드,이미지 미리 보기,이미지 삭제 실현
함수 호출 방법 은 그림 미리 보기 에 구덩이 가 있 고 그림 은 표시 되 지 않 습 니 다.
<template>
<div class="add-check-page">
<head-com :title="title"></head-com>
<van-form @submit="onSubmit">
<h2 class="van-doc-demo-block__title"> </h2>
<van-field name="uploader" class="pic-uploader">
<template #input>
<template v-for="(item, index) in file_path">
<div class="item" :key="index">
<van-image fit="cover" :src="IP + item" @click="preView(index)">
<template v-slot:loading>
<van-loading type="spinner" size="20" />
</template>
</van-image>
<van-icon name="close" @click="delPic(index)" />
</div>
</template>
<van-icon class="up-btn" @click="picture" :name="require('#/images/add_check_icon.png')" />
<van-uploader id="photo" multiple :after-read="afterRead" style="display:none">
<van-button
class="up-btn"
:icon="require('#/images/add_check_icon.png')"
type="default"
/>
</van-uploader>
</template>
</van-field>
<van-button class="save" block type="default" native-type="submit"> </van-button>
</van-form>
<van-action-sheet
v-model="show"
:actions="actions"
@select="onSelect"
cancel-text=" "
close-on-click-action
/>
<loading :showLoading="showLoad"></loading>
// ,
<van-image-preview
v-if="imgShow"
v-model="imgShow"
:images="preList"
:start-position="startIndex"
@closed="handleClose"
></van-image-preview>
</div>
</template>
<script>
import headCom from '_c/header/index.vue'
import loading from '_c/loading/index.vue'
export default {
components: {
headCom,
loading
},
data() {
return {
// id
id: '',
id2: '',
title: '',
file_name: [],
file_path: [],
content: '',
show: false,
actions: [{ name: ' ' }, { name: ' ' }],
showLoad: false,
imgPre: '',
imgShow: false,
preList: [],
startIndex: 0
}
},
beforeRouteLeave(to, from, next) {
if (this.imgPre) {
this.imgPre.close()
}
next()
},
created() {
this.id = this.$route.params.id
if (this.$route.name === 'editCheck') {
this.title = ' '
this.getInfo()
} else {
this.title = ' '
}
},
methods: {
async getInfo() {
this.showLoad = true
try {
let data = {
id: this.id
}
let res = await this.$api.check.edit(data)
this.content = res.detail.content
this.id2 = res.detail.company_id
res.photo_list.forEach((item) => {
this.file_name.push(item.file_name)
this.file_path.push(item.file_path)
})
this.showLoad = false
} catch (error) {
this.showLoad = false
this.$toast(error.msg)
}
},
async onSubmit(values) {
this.showLoad = true
try {
let data = {}
if (this.$route.name === 'editCheck') {
data = {
id: this.id,
company_id: this.id2,
content: values.content,
file_names: [...this.file_name],
file_paths: [...this.file_path]
}
await this.$api.check.editPost(data)
} else {
//
data = {
company_id: this.id,
content: values.content,
file_names: [...this.file_name],
file_paths: [...this.file_path]
}
await this.$api.check.addPost(data)
}
this.showLoad = false
this.$router.go(-1)
} catch (error) {
this.$toast(error.msg)
}
},
//
delPic(index) {
this.file_path.splice(index, 1)
this.file_name.splice(index, 1)
},
//
preView(index) {
this.startIndex = index
this.preList = []
this.file_path.forEach((item) => {
this.preList.push(this.IP + item)
})
this.imgShow = true
},
//
handleClose() {
this.preList = []
this.imgShow = false
},
async afterRead(file) {
this.showLoad = true
try {
if (file.length) {
file.forEach(async (item) => {
let res = await this.$api.base.upload(item)
this.file_name.push(res.name)
this.file_path.push(res.url)
this.showLoad = false
})
} else {
let res = await this.$api.base.upload(file)
this.file_name.push(res.name)
this.file_path.push(res.url)
this.showLoad = false
}
} catch (e) {
this.showLoad = false
this.$toast(e.data)
}
},
picture() {
this.show = true
},
//
onSelect(item) {
this.show = false
if (item.name === ' ') {
this.takePhoto()
} else {
let dl = document.getElementById('photo')
dl.click()
}
},
//
takePhoto() {
let that = this
// crodova
navigator.camera.getPicture(success, error, {})
function success(imageURI) {
that.showLoad = true
// file uri
that.fileUpload(imageURI)
}
function error() {
this.$toast(' ')
}
},
// cordova FileUpload
fileUpload: function(imageURI) {
let that = this
let FileUploadOptions = window.FileUploadOptions
let FileTransfer = window.FileTransfer
let options = new FileUploadOptions()
options.fileKey = 'file'
options.fileName = imageURI.substr(imageURI.lastIndexOf('/') + 1)
options.mimeType = 'image/jpeg'
let ft = new FileTransfer()
ft.upload(imageURI, encodeURI(this.API + '/user/uploadImg'), function(data) {
let resString = data.response
let resObject = JSON.parse(resString) //
if (resObject.code === 1) {
that.file_name.push(resObject.data.name)
that.file_path.push(resObject.data.url)
that.showLoad = false
} else {
that.showLoad = false
that.$toast(resObject.msg)
}
})
}
}
}
</script>
이상 의 Vue+Vant 사진 을 올 리 고 표시 한 사례 는 바로 편집장 님 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 될 수 있 고 많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vue Render 함수로 DOM 노드 코드 인스턴스 만들기render에서createElement 함수를 사용하여 DOM 노드를 만드는 것은 직관적이지 않지만 일부 독립 구성 요소의 디자인에서 특수한 수요를 충족시킬 수 있습니다.간단한 렌더링 예는 다음과 같습니다. 또한 v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.