Я пытаюсь настроить сборник рассказов, чтобы он извлекал все из внешних файлов, но проблема, с которой я столкнулся, связана с файлом javascript, поскольку он загружает файл перед сборкой компонента и не может найти элементы на страница для привязки к javascript. Моя текущая настройка выглядит следующим образом ...
У меня есть истории. js файл, который загружает компонент, который я пытаюсь добавить
import React from 'react';
import { storiesOf } from '@storybook/react';
import Accordion from './Accordion.js';
storiesOf('Accordion', module)
.add('Accordion Component', () => (
<Accordion></Accordion>
));
Аккордеон. js извлекает все внешние файлы и данные, которые мне нужны для компонента.
import React, { Component } from 'react';
import Wrapper from '../Wrapper';
import accordionContent from 'html-loader!Apps/accordion/accordion.html';
import 'Frontend/components/content/accordion/scss/accordion.scss';
import 'Frontend/components/content/accordion/js/accordion.js';
class Accordion extends Component {
render() {
return (
<Wrapper
file={ accordionContent }
useModels={{
'accordionComponent': {
title: 'accordion'
}
}}
/>
);
}
}
export default Accordion;
Файл Wrapper - это компилятор, который берет разметку HTL для файла HTML и преобразует ее в HTML, поэтому Мне не нужно запускать AEM.
import React, { useState } from 'react';
import Compiler from 'htl-compiler/dist/compiler-esm';
import 'Frontend/base/sass/base.scss';
async function compileHtlToHtml(htl, resourceData, useModels,
resourceTypes) {
const c = new Compiler(htl, resourceData, useModels,
resourceTypes);
return c.compile();
}
function createMarkupForReact(prop) {
return {
__html: prop
};
}
const Wrapper = ({ file, options, resourceData, resourceTypes,
useModels }) => {
const [html, setHtml] = useState('<div>Loading...</div>');
const [rendered, setRendered] = useState(false);
if (!rendered) {
const component = compileHtlToHtml(
file,
resourceData,
useModels,
resourceTypes
);
component
.then(res => {
if (res) {
setHtml(res);
setRendered(true);
}
})
.catch(err => {
if (err) {
setRendered(false);
console.error(err);
}
});
}
return (
<div
className="storybook-wrapper"
dangerouslySetInnerHTML={createMarkupForReact(html)}
/>
);
};
export default Wrapper;
Проблема в том, что файл оболочки. js перерисовывает компонент после компиляции HTL, поэтому на странице ничего не связывается с компонентом javascript файл.
Что я пытаюсь выяснить, так это то, что если я могу либо лениво загрузить файл js, я попробовал React.lazy, но все еще имел ту же проблему, или каким-то образом включить скрипт js в реактивный компонент. Кто-нибудь пытался сделать что-то подобное или есть предложения, как это можно сделать? Чего я пытаюсь избежать, так это использования сборника рассказов для javascript, поскольку идея состоит в том, что все компоненты будут работать именно так, как они нужны, после того как он будет скомпилирован в AEM, и все, что я делаю, - это загружаю файлы в сборник рассказов.