【问题标题】:TinyMce breaking TailwindCss animation when loaded inside a slide-over elementTinyMce 在滑动元素中加载时会破坏 TailwindCss 动画
【发布时间】:2021-09-30 17:46:00
【问题描述】:

我有一个简单的 Vue3 应用程序,它大量使用了TailwindUI 组件。我正在尝试将 TinyMce 编辑器放在幻灯片组件内,并且效果很好。问题是入口动画。

在第一次进入时,它会像预期的那样滑入。但是,如果它关闭并重新打开,则条目动画将消失。退出动画在整个过程中继续正常工作。有没有办法可以做到这一点并保持动画完好无损?

这是CodeSandBox,问题以最简单的形式重现。

以下是相关代码: 应用程序.vue

<template>
  <button @click="open = true">Open Menu</button>
  <SlideOver :open="open" @close="open = false" />
</template>

<script>
import { ref } from "vue";
import SlideOver from "./components/slide-over.vue";

export default {
  name: "App",
  components: {
    SlideOver,
  },
  setup() {
    const open = ref(false);

    return { open };
  },
};
</script>

slide-over.vue

<!-- This example requires Tailwind CSS v2.0+ -->
<template>
  <TransitionRoot as="template" :show="open">
    <Dialog
      as="div"
      static
      class="fixed inset-0 overflow-hidden"
      @close="$emit('close')"
      :open="open"
    >
      <div class="absolute inset-0 overflow-hidden">
        <DialogOverlay class="absolute inset-0" />

        <div class="fixed inset-y-0 right-0 pl-10 max-w-full flex">
          <TransitionChild
            as="template"
            enter="transform transition ease-in-out duration-500 sm:duration-700"
            enter-from="translate-x-full"
            enter-to="translate-x-0"
            leave="transform transition ease-in-out duration-500 sm:duration-700"
            leave-from="translate-x-0"
            leave-to="translate-x-full"
          >
            <div class="w-screen max-w-md">
              <div
                class="h-full flex flex-col py-6 bg-white shadow-xl overflow-y-scroll"
              >
                <div class="px-4 sm:px-6">
                  <div class="flex items-start justify-between">
                    <DialogTitle class="text-lg font-medium text-gray-900">
                      Panel title
                    </DialogTitle>
                    <div class="ml-3 h-7 flex items-center">
                      <button
                        class="bg-white rounded-md text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
                        @click="$emit('close')"
                      >
                        <span class="sr-only">Close panel</span>
                        <XIcon class="h-6 w-6" aria-hidden="true" />
                      </button>
                    </div>
                  </div>
                </div>
                <div class="mt-6 relative flex-1 px-4 sm:px-6">
                  <TinyMceEditor api-key="no-api-key" />
                </div>
              </div>
            </div>
          </TransitionChild>
        </div>
      </div>
    </Dialog>
  </TransitionRoot>
</template>

<script>
import {
  Dialog,
  DialogOverlay,
  DialogTitle,
  TransitionChild,
  TransitionRoot,
} from "@headlessui/vue";
import { XIcon } from "@heroicons/vue/outline";
import TinyMceEditor from "@tinymce/tinymce-vue";

export default {
  components: {
    Dialog,
    DialogOverlay,
    DialogTitle,
    TransitionChild,
    TransitionRoot,
    XIcon,
    TinyMceEditor,
  },
  props: {
    open: {
      type: Boolean,
      default: false,
    },
  },
  setup() {},
};
</script>

【问题讨论】:

    标签: vue.js tinymce vuejs3 tailwind-css tailwind-ui


    【解决方案1】:

    在我看来,这是加载 TinyMce 编辑器的问题(我不知道具体是什么问题)。在使用 watchEffect 打开模式后,我添加了加载编辑器的延迟,该模式基于 opensetTimeoutv-如果TinyMceEditor 标记上。这可能不是一个完美且美观的解决方案,但动画运行流畅。

    这是code in codesandbox.io

    这里的代码:slide-over.vue(App.vue 保持不变)

    <template>
      <TransitionRoot as="template" :show="open">
        <Dialog
          as="div"
          static
          class="fixed inset-0 overflow-hidden"
          @close="$emit('close')"
          :open="open"
        >
          <div class="absolute inset-0 overflow-hidden">
            <DialogOverlay class="absolute inset-0" />
    
            <div class="fixed inset-y-0 right-0 pl-10 max-w-full flex">
              <TransitionChild
                as="template"
                enter="transform transition ease-in-out duration-500 sm:duration-700"
                enter-from="translate-x-full"
                enter-to="translate-x-0"
                leave="transform transition ease-in-out duration-500 sm:duration-700"
                leave-from="translate-x-0"
                leave-to="translate-x-full"
              >
                <div class="w-screen max-w-md">
                  <div
                    class="h-full flex flex-col py-6 bg-white shadow-xl overflow-y-scroll"
                  >
                    <div class="px-4 sm:px-6">
                      <div class="flex items-start justify-between">
                        <DialogTitle class="text-lg font-medium text-gray-900">
                          Panel title
                        </DialogTitle>
                        <div class="ml-3 h-7 flex items-center">
                          <button
                            class="bg-white rounded-md text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
                            @click="$emit('close')"
                          >
                            <span class="sr-only">Close panel</span>
                            <XIcon class="h-6 w-6" aria-hidden="true" />
                          </button>
                        </div>
                      </div>
                    </div>
                    <div class="mt-6 relative flex-1 px-4 sm:px-6">
                      <TinyMceEditor v-if="loadEditor" api-key="no-api-key" />
                    </div>
                  </div>
                </div>
              </TransitionChild>
            </div>
          </div>
        </Dialog>
      </TransitionRoot>
    </template>
    <script>
    import { ref, watchEffect } from "vue";
    import {
      Dialog,
      DialogOverlay,
      DialogTitle,
      TransitionChild,
      TransitionRoot,
    } from "@headlessui/vue";
    import { XIcon } from "@heroicons/vue/outline";
    import TinyMceEditor from "@tinymce/tinymce-vue";
    
    export default {
      components: {
        Dialog,
        DialogOverlay,
        DialogTitle,
        TransitionChild,
        TransitionRoot,
        XIcon,
        TinyMceEditor,
      },
      props: {
        open: {
          type: Boolean,
          default: false,
        },
      },
      setup(props) {
        const loadEditor = ref(false);
        watchEffect(() => {
          if (props.open) {
            setTimeout(function () {
              loadEditor.value = true;
            }, 10);
          } else {
            loadEditor.value = false;
          }
        });
        return { loadEditor };
      }
    };
    </script>
    

    【讨论】:

    • 我同意 TinyMCE 是如何加载到页面中的问题。但是,轻微的延迟似乎确实解决了我遇到的问题。虽然,它并不理想,但它是我目前最好的选择。在我找到更好的解决方案之前,这就是我要做的。谢谢!
    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2011-12-11
    • 2016-12-29
    • 1970-01-01
    • 2022-08-13
    • 2013-06-06
    相关资源
    最近更新 更多