CropperJs 图像在 Vue 中很小,但在编辑后它会恢复正常大小
CropperJs image is tiny in Vue but after editing it gets back to normal size
这是一个非常奇怪的行为,我不知道该怎么做,我正在使用 Vue.js 和 CropperJs 构建一个用于裁剪图像的网站,主页用户 select他们想要裁剪的图像并单击 'Continue',下一页显示一个名为 ImageCropper.vue
的组件,canvas 一切都成功显示,但它很小,但假设我编辑了 html,即使我只添加一个空行,图像也会恢复到它应该的大小(我没有为它预定义的大小,所以它只占用容器宽度的 100%,高度是自动的,我想。)
ImageCropper.vue
<template>
<div class="image-container">
<img ref="image" :src="source">
</div>
</template>
<script>
import Cropper from 'cropperjs'
export default {
name: "ImageCropper",
props: ["source"],
data() {
return {
cropper: null,
imageElement: null
}
},
mounted() {
this.imageElement = this.$refs.image
this.cropper = new Cropper(this.imageElement, {
aspectRatio: 1
})
}
}
</script>
编辑模板前:
编辑后(只是加了一个空行):
我试过用css设置样式,但是none好像有效果,是不是我用vue的方式有问题?如果重要的话,这是 Vue 和 Vuetify。
有一个可用的包装器,它的 vue-cropperjs,检查一下。
<template>
<div>
<vue-cropper ref="cropper" :src="source" alt="Source Image"></vue-cropper>
<v-btn @click="save">Save</v-btn>
</div>
</template>
<script>
import VueCropper from 'vue-cropperjs';
import 'cropperjs/dist/cropper.css';
export default{
name: "ImageCropper",
components: {
VueCropper
},
methods: {
save: function(){
this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
//Do anything with the blob, for eg: attach to form data and send to serve
const formData = new FormData();
formData.append("type", "profile");
formData.append('file', blob, this.fileName);
});
}
}
}
</script>
问题是裁剪器在其容器不可见时被初始化,因为我使用的是 vuetify 的步进器,裁剪部分出现在用户点击 "continue" 之后,然后是 display: none
,但是,当我编辑它时,它是可见的并且 cropper 正在重新初始化,同时它的容器是可见的,因此导致它正常渲染(使用 vue cli 热重新加载)。我不知道这到底是什么原因,但我很确定这不是我这边的编码错误,也许 cropperjs 和 vuetify 的步进器不能很好地协同工作。我通过将 continueClicked
添加到我的 Vuex 状态并将默认设置为 false 来解决它,然后将 @click 侦听器添加到初始的 Continue 按钮,它将 Vuex 中的 continueClicked
设置为 true,添加 v-if="continueClicked"
指令到ImageCropper.vue
组件,像这样:
<ImageCropper v-if="continueClicked" />
,这样当单击“继续”按钮并且 continueClicked
设置为 true 时,裁剪器会在其容器可见时呈现。
这是一个非常奇怪的行为,我不知道该怎么做,我正在使用 Vue.js 和 CropperJs 构建一个用于裁剪图像的网站,主页用户 select他们想要裁剪的图像并单击 'Continue',下一页显示一个名为 ImageCropper.vue
的组件,canvas 一切都成功显示,但它很小,但假设我编辑了 html,即使我只添加一个空行,图像也会恢复到它应该的大小(我没有为它预定义的大小,所以它只占用容器宽度的 100%,高度是自动的,我想。)
ImageCropper.vue
<template>
<div class="image-container">
<img ref="image" :src="source">
</div>
</template>
<script>
import Cropper from 'cropperjs'
export default {
name: "ImageCropper",
props: ["source"],
data() {
return {
cropper: null,
imageElement: null
}
},
mounted() {
this.imageElement = this.$refs.image
this.cropper = new Cropper(this.imageElement, {
aspectRatio: 1
})
}
}
</script>
编辑模板前:
编辑后(只是加了一个空行):
我试过用css设置样式,但是none好像有效果,是不是我用vue的方式有问题?如果重要的话,这是 Vue 和 Vuetify。
有一个可用的包装器,它的 vue-cropperjs,检查一下。
<template>
<div>
<vue-cropper ref="cropper" :src="source" alt="Source Image"></vue-cropper>
<v-btn @click="save">Save</v-btn>
</div>
</template>
<script>
import VueCropper from 'vue-cropperjs';
import 'cropperjs/dist/cropper.css';
export default{
name: "ImageCropper",
components: {
VueCropper
},
methods: {
save: function(){
this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
//Do anything with the blob, for eg: attach to form data and send to serve
const formData = new FormData();
formData.append("type", "profile");
formData.append('file', blob, this.fileName);
});
}
}
}
</script>
问题是裁剪器在其容器不可见时被初始化,因为我使用的是 vuetify 的步进器,裁剪部分出现在用户点击 "continue" 之后,然后是 display: none
,但是,当我编辑它时,它是可见的并且 cropper 正在重新初始化,同时它的容器是可见的,因此导致它正常渲染(使用 vue cli 热重新加载)。我不知道这到底是什么原因,但我很确定这不是我这边的编码错误,也许 cropperjs 和 vuetify 的步进器不能很好地协同工作。我通过将 continueClicked
添加到我的 Vuex 状态并将默认设置为 false 来解决它,然后将 @click 侦听器添加到初始的 Continue 按钮,它将 Vuex 中的 continueClicked
设置为 true,添加 v-if="continueClicked"
指令到ImageCropper.vue
组件,像这样:
<ImageCropper v-if="continueClicked" />
,这样当单击“继续”按钮并且 continueClicked
设置为 true 时,裁剪器会在其容器可见时呈现。