C:\vuejs\my-vue-app>npm run serve
src/App.vue
//src/App.vue <template> <div id="app"> <h1>Vue.js Vue CLI Image Upload Preview</h1> <HelloWorld/> </div> </template> <script> import HelloWorld from './components/filePreview.vue' export default { name: 'App', components: { HelloWorld } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>src/components/filePreview.vue
//src/components/filePreview.vue <template> <div> <div class="imagePreviewWrapper" :style="{ 'background-image': `url(${previewImage})` }" @click="selectImage"> </div> <input ref="fileInput" type="file" @input="pickFile"> </div> </template> <script> export default { data() { return { previewImage: null }; }, methods: { selectImage () { this.$refs.fileInput.click() }, pickFile () { let input = this.$refs.fileInput let file = input.files if (file && file[0]) { let reader = new FileReader reader.onload = e => { this.previewImage = e.target.result } reader.readAsDataURL(file[0]) this.$emit('input', file[0]) } } } } </script> <style> .imagePreviewWrapper { width: 250px; height: 250px; display: block; cursor: pointer; margin: 0 auto 30px; background-size: cover; background-position: center center; } </style>