【问题标题】:Why doesn't vue-signature-pad work in a modal?为什么 vue-signature-pad 不能在模态中工作?
【发布时间】:2019-04-17 00:32:11
【问题描述】:

我目前正在使用以下库:https://www.npmjs.com/package/vue-signature-pad,其中包含以下示例: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 来查看响应式表单)。

【问题讨论】:

    标签: vue.js vuejs2 signaturepad


    【解决方案1】:

    这是由于对话框在画布初始化时还没有宽度和高度,为了解决这个问题,您可以将 resizeCanvas 事件调用传递给组件的选项:

    <VueSignaturePad
        id="signature"
        width="100%"
        height="200px"
        ref="signaturePad"
        :options="{onBegin: () => {$refs.signaturePad.resizeCanvas()}}"
    />
    

    【讨论】:

    • IMO 这应该被标记为答案,更好的做法
    • 这个应该标注的是正确答案!谢谢@eselskas
    【解决方案2】:

    打开 DevTools 并查看 canvas 元素。首先你会看到它的宽度和高度(不是宽度和高度样式)设置为0 然后调整窗口大小你会看到宽度和高度更改为一些值并且它可以工作。

    VueSignaturePad.js。看resizeCanvas方法

    canvas.width = canvas.offsetWidth * ratio;
    canvas.height = canvas.offsetHeight * ratio;
    

    v-dialog 被挂载,然后VueSignaturePad 被挂载。 resizeCanvasmounted 被调用一次,此时画布没有宽度和高度(由于其父级),因此它将这些值设置为0。调整窗口大小后,它将再次调用并更新这些值。

    解决此问题的一种方法是在其父级完成渲染后调用resizeCanvas

    this.$nextTick(() => {
      this.$refs.signaturePad.resizeCanvas();
    })
    

    codesandbox

    注意:resizeCanvas 不是官方的方法。

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 2021-10-24
      相关资源
      最近更新 更多