В настоящее время я пытаюсь использовать TailWindElements-React в сценарии Clojure. В JS пример будет выглядеть так:
import React, { useState } from "react";
import { TECollapse, TERipple } from "tw-elements-react";
export default function App(): JSX.Element {
const [show, setShow] = useState(false);
const toggleShow = () => setShow(!show);
return (
<>
<TERipple rippleColor = "light">
<a
className = "inline-block rounded bg-primary mr-2 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
role = "button"
onClick = {toggleShow}
>
Link
</a>
</TERipple>
<TERipple rippleColor = "light">
<button
type = "button"
className = "inline-block rounded bg-primary px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
onClick = {toggleShow}
>
Button
</button>
</TERipple>
<TECollapse show = {show}>
<div className = "block rounded-lg bg-white p-6 shadow-lg dark:bg-neutral-700 dark:text-neutral-50">
Some placeholder content for the collapse component. This panel is
hidden by default but revealed when the user activates the relevant
trigger.
</div>
</TECollapse>
</>
);
}
Однако (на самом деле) TWE использует/требует функцию import(). Кажется, это создает проблемы для CLJS, и обходной путь:
(ns my.app
(:require
[shadow.esm :refer (dynamic-import)]
[shadow.cljs.modern :refer (js-await)]))
(defn foo []
(js-await [mod (dynamic-import "https://cdn.pika.dev/preact@^10.0.0")]
(js/console.info "loaded module" mod)))
как показано здесь с использованием ES.
Поэтому я адаптировал это к
(ns my.app
(:require
[shadow.esm :refer (dynamic-import)]
[shadow.cljs.modern :refer (js-await)]))
(defn TERipple []
(js-await [mod (dynamic-import "tw-elements-react")]
(js/console.info "loaded module" mod)))
Однако в результате CLJS говорит мне shadow_esm_import is not defined
. Думаю, мне нужно изменить цель в конфигурации на :esm
, но тогда я не смогу смонтировать свое приложение в DOM.
Я новичок в CLJS, так что все это очень запутанно. Кто-нибудь может мне помочь?
Редактировать: Томас Хеллер отметил, что это не использование import()
, а только базовый синтаксис import
. Что приведет к импорту через
(:require ["tw-elements-react" :refer (TECollapse TERipple)])
а затем использовать его как
[:> TERipple
...
]
Однако это дает мне
[:app] Build failure:
Closure compilation failed with 1 errors
--- node_modules/tw-elements-react/dist/js/tw-elements-react.umd.min.js:13
Dynamic import expressions cannot be transpiled.
В примере JS не используется import()
. Это обычный импорт . Я знаю, что они похожи, но они совершенно разные.
В документации Shadow-cljs есть множество распространенных примеров перевода.
Итак, import { TECollapse, TERipple } from "tw-elements-react";
переводится как
(ns my.app
(:require ["tw-elements-react" :refer (TECollapse TERipple)]))
Между прочим, пакет tw-elements-react
действительно использует import()
внутри себя. Это не меняет способа :require
использования CLJS, но для этого требуется shadow-cljs
версия 2.26.6+
.
Какую версию Shadow-CLJS вы используете? Поддержка этого была добавлена в 2.26.6
, поэтому старые версии не будут работать.
Я действительно использовал версию 2.26.2
. Я увеличил его, и теперь все скомпилировано и импортировано, но если я использую [:> TERipple [:div ... ]]
, браузер выдает ошибку Minified React 40: целевой контейнер не является элементом DOM.
Кажется, ошибка связана с недопустимым вызовом перехватчика, но я не знаю, что не так с моим синтаксисом.
Наверное, хорошо задать это отдельным вопросом к коду, который вы пробовали.
Спасибо, я сделаю это. Возможно, вы можете добавить подсказку с версией к своему основному ответу. Тогда этот пост решает все проблемы моего первоначального поста, и я могу принять его как ответ.
Спасибо за ответ. Я уже пробовал это и получил эту ошибку
[:app] Build failure: Closure compilation failed with 1 errors node_modules/tw-elements-react/dist/js/tw-elements-react.umd.min.js:13 Dynamic import expressions cannot be transpiled.