Computed свойства в Atomico позволяют вычислять
значения на основе текущего состояния компонента или его свойств
(props) и автоматически обновляться при изменении
зависимостей. Они служат инструментом реактивного программирования,
упрощая управление производными данными без необходимости вручную
отслеживать их обновления.
Для определения computed свойства используется функция
computed, которая принимает два аргумента:
props, state или других computed свойств, от
которых зависит вычисляемое значение.Пример:
import { c, useState, computed } from "atomico";
function Counter() {
const [count, setCount] = useState(0);
const double = computed(() => count.value * 2, [count]);
return c("div", null,
c("p", null, `Count: ${count.value}`),
c("p", null, `Double: ${double.value}`),
c("button", { onclick: () => setCount(count.value + 1) }, "Increment")
);
}
В этом примере double автоматически пересчитывается при
каждом изменении count. Доступ к значению осуществляется
через свойство .value.
Computed свойства в Atomico обладают реактивной привязкой к зависимостям. Если одна из зависимостей изменяется, computed автоматически пересчитывается. Это позволяет избегать дублирования логики и гарантирует актуальность вычисляемых значений.
const sum = computed(() => a.value + b.value, [a, b]);
Здесь sum обновится при изменении любого из состояний
a или b.
Важно учитывать, что зависимости должны быть реактивными
объектами (useState или другие computed). Если в
массиве зависимостей указать обычные значения, реактивности не
произойдет.
Computed свойства можно использовать внутри других computed. Это создаёт цепочку реактивных вычислений:
const base = useState(10);
const squared = computed(() => base.value ** 2, [base]);
const doubledSquared = computed(() => squared.value * 2, [squared]);
Здесь doubledSquared пересчитается автоматически при
изменении base, благодаря цепочке зависимостей.
Computed свойства можно применять напрямую в JSX-шаблонах или
возвращаемом дереве компонентов. При рендере computed.value
гарантированно содержит актуальное значение:
return c("div", null,
c("p", null, `Squared: ${squared.value}`),
c("p", null, `Doubled Squared: ${doubledSquared.value}`)
);
Такой подход позволяет избегать лишнего состояния, храня производные значения исключительно в computed.
useState управляет изменяемым состоянием, которое можно
изменять через setter.computed вычисляет значение на основе других
состояний или props и не имеет собственного setter.Computed свойства — это чистые функции от текущих данных. Любые
попытки напрямую изменять .value не имеют смысла и не
поддерживаются.
const [items, setItems] = useState([]);
const [query, setQuery] = useState("");
const filteredItems = computed(() =>
items.value.filter(item => item.includes(query.value)),
[items, query]
);
const [price, setPrice] = useState(100);
const [taxRate, setTaxRate] = useState(0.2);
const total = computed(() => price.value * (1 + taxRate.value), [price, taxRate]);
function Greeting({ name }) {
const [count, setCount] = useState(0);
const message = computed(() => `Hello, ${name}! Count: ${count.value}`, [name, count]);
return c("p", null, message.value);
}
Computed свойства являются ключевым инструментом в Atomico для управления реактивными вычислениями, сокращения дублирующего кода и упрощения работы с производными данными. Они обеспечивают чистую, декларативную и эффективную реактивность компонентов.