Предполагая, что под позицией вы подразумеваете Монтирование HTML элемента, например body
, div
или некоторого селектора CSS, например '#mountElm'
, тогда вы можете экспортировать функцию рендеринга, например:
import { render, h } from 'preact';
// WidgetA is a Preact component.
// It could be functional or class component.
export function WidgetA(props) {
// Use props here
return (
<div>WidgetA</div>
);
}
// Render function for WidgetA
export function renderWidgetA(position, props) {
const renderElm = position instanceof HTMLElement
? position
: document.querySelector(position);
render(h(Component, props), renderElm);
}
Когда этот файл связан, его можно просто использовать следующим образом:
import { renderWidgetA } from './my-bundle.js';
renderWidgetA('body', { title: 'Hello world' });
Вы можете использовать аналогичный шаблон для создания нескольких компонентов. Кроме того, вы можете просто извлечь функцию рендеринга в более общий c вариант.
Вопрос 1: Как сделать функцию доступной для глобального window
объекта?
Чтобы добиться этого, вы должны Опции:
- Используйте Webpack и укажите
libraryTarget
для вывода. Это может быть umd
или подобное. Подробнее здесь . - Если вы не можете использовать Webpack или запрещено изменять его, то в конце файла вы можете явно связать его с глобальным объектом.
Пример:
window.myLib = { renderWidgetA };
// Usage
myLib.renderWidgetA('body', { /* some props */});
Вопрос 2: Что делать при смене реквизита для определенного виджета.
Вам необходимо изменить функцию render
. Он принимает необязательный третий параметр , который можно установить на true
. Таким образом, ваша функция становится:
export function renderWidgetA(position, props) {
const renderElm = position instanceof HTMLElement
? position
: document.querySelector(position);
// NOTE THE THIRD PARAM
render(h(Component, props), renderElm, true);
}
Однажды, вы делаете это, просто вызывая функцию renderWidgetA
всякий раз, когда меняется ваш реквизит. Это абсолютно безвредно. Просто убедитесь, что ваш узел позиции остается неизменным при повторном рендеринге. Также всегда помните, что пользовательский интерфейс как функция состояния . ВДОМ возьмет на себя все остальное.