Простой вопрос. Как я могу реагировать на изменение размера окна в solid-js? Мне нужно сделать некоторые вычисления с document.body.clientWidth
, но я не могу заставить что-либо повторно выполнить, когда это изменится. Я пытался использовать on()
, заметки, функции, которые не являются заметками, и значение напрямую. Ничего не работает. Должно быть что-то простое, чего мне не хватает.
Вот быстрая игровая площадка (Обязательно очистите свой слушатель!)
Твердые компоненты могут реагировать только на изменения сигнала, а реакция ограничена областью отслеживания, что означает, что вы не можете обнаружить изменения за пределами createComputed
или одного из его вариантов.
Теперь, чтобы ответить на ваш вопрос, вы пытаетесь реагировать на изменения, которые происходят за пределами твердого тела, внешнего объекта, который существует и изменяется сам по себе. Поэтому вам нужно установить прослушиватель для этого объекта, в вашем случае событие resize
для объекта окна, и обновлять свой сигнал всякий раз, когда вы получаете событие изменения размера:
import { createSignal, onCleanup, onMount } from 'solid-js';
import { render } from 'solid-js/web';
export const App = () => {
const [rect, setRect] = createSignal({
height: window.innerHeight,
width: window.innerWidth
});
const handler = (event: Event) => {
setRect({ height: window.innerHeight, width: window.innerWidth });
};
onMount(() => {
window.addEventListener('resize', handler);
});
onCleanup(() => {
window.removeEventListener('resize', handler);
})
return (
<div>Window Dimensions: {JSON.stringify(rect())}</div>
);
};
render(() => <App />, document.body);
Здесь мы установили прослушиватель при монтировании компонента и очистили его при размонтировании.
Здесь вы можете найти живую демонстрацию. Попробуйте изменить размер выходного кадра: https://playground.solidjs.com/anonymous/66ab1288-732e-4847-a0a4-86b8d24af55e
Спасибо! Да, оказалось, было что-то простое, чего мне не хватало, ха-ха.
Отличный ответ. Технически вы можете переместить контент внутри onMount
на один уровень вверх и удалить вызов onMount
. Однако onCleanup
должен остаться.
window.addEventListener("resize", () => ...)
? Я что-то пропустил?