为什么 vue-signature-pad 不能在模态中工作?
Why doesn't vue-signature-pad work in a modal?
我目前正在使用以下库:https://www.npmjs.com/package/vue-signature-pad which has the following example: https://codesandbox.io/s/n5qjp3oqv4
我将其用作示例,但我将其置于模态中:
<v-dialog v-model="canvasVehiculo" fullscreen hide-overlay transition="dialog-bottom-transition">
<v-card>
<v-toolbar dark color="primary">
<v-btn icon dark @click="canvasVehiculo = false">
<v-icon>close</v-icon>
</v-btn>
<v-toolbar-title>Seleccionar partes del vehiculo:</v-toolbar-title>
<v-spacer></v-spacer>
<v-toolbar-items>
<v-btn dark flat @click="undo">Deshacer</v-btn>
</v-toolbar-items>
</v-toolbar>
<v-list three-line subheader>
<v-subheader></v-subheader>
<VueSignaturePad
id="signature"
width="100%"
height="450px"
ref="signaturePad"
/>
</v-list>
</v-card>
<script>
import VueSignature from 'vue-signature-pad'; //Unicamente lo importo
</script>
<style scoped>
#signature {
border: double 3px transparent;
border-radius: 5px;
background-image: url('imagen.png');
background-size: 900px 456px;
background-position: center;
background-origin: border-box;
background-clip: content-box, border-box;
}
</style>
如果我在模态之外使用它,它可以正常工作;但是在模态中,为了让它工作,我必须修改屏幕的大小
(例如,通过使用 DevTools 的 Toggle device toolbar
查看响应式表单)。
打开 DevTools 并查看 canvas
元素。首先你会看到它的宽度和高度(不是宽度和高度样式)设置为 0
然后调整 window 的大小你会看到宽度和高度更改为一些值并且它有效。
在 VueSignaturePad.js。查看 resizeCanvas
方法
canvas.width = canvas.offsetWidth * ratio;
canvas.height = canvas.offsetHeight * ratio;
当挂载v-dialog
,然后挂载VueSignaturePad
。 resizeCanvas
在 mounted
处被调用一次,此时 canvas 不知何故没有宽度和高度(由于其父级),因此它将这些值设置为 0
。调整 window 的大小后,它将再次调用并更新这些值。
解决此问题的一种方法是在其父项完成渲染后调用 resizeCanvas
。
this.$nextTick(() => {
this.$refs.signaturePad.resizeCanvas();
})
参见 codesandbox。
注:resizeCanvas
不是官方方法
这是由于对话框在canvas初始化时还没有宽高,要解决这个问题,你可以将resizeCanvas事件调用传递给组件的选项:
<VueSignaturePad
id="signature"
width="100%"
height="200px"
ref="signaturePad"
:options="{onBegin: () => {$refs.signaturePad.resizeCanvas()}}"
/>
我目前正在使用以下库:https://www.npmjs.com/package/vue-signature-pad which has the following example: https://codesandbox.io/s/n5qjp3oqv4
我将其用作示例,但我将其置于模态中:
<v-dialog v-model="canvasVehiculo" fullscreen hide-overlay transition="dialog-bottom-transition">
<v-card>
<v-toolbar dark color="primary">
<v-btn icon dark @click="canvasVehiculo = false">
<v-icon>close</v-icon>
</v-btn>
<v-toolbar-title>Seleccionar partes del vehiculo:</v-toolbar-title>
<v-spacer></v-spacer>
<v-toolbar-items>
<v-btn dark flat @click="undo">Deshacer</v-btn>
</v-toolbar-items>
</v-toolbar>
<v-list three-line subheader>
<v-subheader></v-subheader>
<VueSignaturePad
id="signature"
width="100%"
height="450px"
ref="signaturePad"
/>
</v-list>
</v-card>
<script>
import VueSignature from 'vue-signature-pad'; //Unicamente lo importo
</script>
<style scoped>
#signature {
border: double 3px transparent;
border-radius: 5px;
background-image: url('imagen.png');
background-size: 900px 456px;
background-position: center;
background-origin: border-box;
background-clip: content-box, border-box;
}
</style>
如果我在模态之外使用它,它可以正常工作;但是在模态中,为了让它工作,我必须修改屏幕的大小
(例如,通过使用 DevTools 的 Toggle device toolbar
查看响应式表单)。
打开 DevTools 并查看 canvas
元素。首先你会看到它的宽度和高度(不是宽度和高度样式)设置为 0
然后调整 window 的大小你会看到宽度和高度更改为一些值并且它有效。
在 VueSignaturePad.js。查看 resizeCanvas
方法
canvas.width = canvas.offsetWidth * ratio;
canvas.height = canvas.offsetHeight * ratio;
当挂载v-dialog
,然后挂载VueSignaturePad
。 resizeCanvas
在 mounted
处被调用一次,此时 canvas 不知何故没有宽度和高度(由于其父级),因此它将这些值设置为 0
。调整 window 的大小后,它将再次调用并更新这些值。
解决此问题的一种方法是在其父项完成渲染后调用 resizeCanvas
。
this.$nextTick(() => {
this.$refs.signaturePad.resizeCanvas();
})
参见 codesandbox。
注:resizeCanvas
不是官方方法
这是由于对话框在canvas初始化时还没有宽高,要解决这个问题,你可以将resizeCanvas事件调用传递给组件的选项:
<VueSignaturePad
id="signature"
width="100%"
height="200px"
ref="signaturePad"
:options="{onBegin: () => {$refs.signaturePad.resizeCanvas()}}"
/>