Мы начнем наше знакомство с solid с создания простейшего компонента со счетчиком.
В итоге мы получим интерактивный компонент,который можно вставить в любую страницу.
Как это будет работать, можно увидеть ниже:
Создайте отдельную директорию, после этого внутри нее создайте 2 файла:
Пример кода можно увидеть тут
Начнем по порядку
Первым делом нужно создать файл component.tsx и сделать импорт необходимых модулей:
// @shared
import {createSignal, createSolidComponent, jsx} from '@app/solid-js'
Обратите внимание, на строчку // @shared
в начале файла. Она обязательна.
Дальше, нам нужно импортировать следующие методы из пакета @app/solid-js:
и компонент Button
из (ui-библиотеки) solid
import {Button} from "@solid/ui"
export const Counter = createSolidComponent(function (props: { ctx: app.Ctx }) {})
В этом же файле создадим компонент Counter
, который будем передавать на страницу index.tsx для отрисовки. Он принимает объект props, в котором есть контекст (ctx).
Функция createSignal
в Solid.js используется для создания состояния, похожего на useState
в React. Она возвращает пару функций: одну для получения значения getter
, а другую для его обновления setter
.
В нашем случае это выглядит следующим образом :
const [count, setCount] = createSignal(0)
count()
— функция, которая возвращает текущее значение, а setCount()
- функция, которая устанавливает новое значение.
Когда вы вызываете getter (например, count()
), компонент отслеживает это значение, чтобы автоматически обновляться при его изменении.
При вызове setter (например, setCount(newValue)
), значение обновляется и вызывает повторный рендеринг всех зависимых компонентов, если значение действительно изменилось.
Внутри Counter
определим состояние count с начальным значением 0
.
Добавим пару кнопок одна будет прибавлять счет, а другая уменьшать на 1.
За это как раз отвечает функция setCount
, которая вызывается при нажатии на кнопку.
return (
<div>
<h1>Счетчик: {count()}</h1>
<Button onClick={() => setCount(count() + 1)}>Увеличить</Button>
<Button onClick={() => setCount(count() - 1)}>Уменьшить</Button>
</div>
)
Компонент возвращает разметку, отображающую текущее значение счетчика и две кнопки.
Теперь перейдем к файлу index.tsx.
import { jsx } from '@app/html-jsx'
import { UiHtmlLayout } from '@html/layout'
import { Counter } from './component'
Нам нужно отрисовать Counter на странице, а для этого нужно воспользоваться следующими модулями:
Counter
из component.tsxДалее создадим маршрут к component.tsx странице с асинхронной функцией-обработчиком:
app.html('/', async ctx => {
return(
<UiHtmlLayout>
<Counter ctx={ctx} />
</UiHtmlLayout>)
})
и вернем Counter ctx={ctx}, который отрисовывается внутри макета UiHtmlLayout. Он принимает ctx
в качестве пропа, чтобы иметь доступ к контексту.
index.tsx
import { jsx } from '@app/html-jsx'
import { UiHtmlLayout } from '@html/layout'
import { Counter } from './component'
app.html('/', async ctx => {
return (
<UiHtmlLayout title="Пример счетчика">
<div style={"padding: 20px; border: 1px solid #ccc;"}>
<Counter ctx={ctx} />
</div>
</UiHtmlLayout>
)
})