Шаблоны ClientStateVar

Общие шаблоны реализации для адаптивных и производительных компонентов пользовательского интерфейса.

Переключить шаблон

Используйте логическое значение ClientStateVar для мгновенного управления видимостью пользовательского интерфейса или изменениями стиля.

is_expanded = ClientStateVar.create("is_expanded", False)

def toggle_component():
    return rx.vstack(
        rx.button(
            "Toggle Content",
            on_click=is_expanded.set_value(not is_expanded.value)
        ),
        rx.cond(
            is_expanded.value,
            rx.text("Hidden content is now visible!"),
            rx.text("Content is hidden.")
        )
    )

Образец состояния формы

Управляйте черновым состоянием ввода или проверкой в реальном времени локально, прежде чем отправлять окончательную проверенную полезную нагрузку на серверную часть.

draft_input = ClientStateVar.create("draft_input", "")

def form_component():
    return rx.vstack(
        rx.input(
            value=draft_input.value,
            on_change=draft_input.set_value
        ),
        rx.button(
            "Submit",
            # Send the client-side draft to the backend for processing
            on_click=draft_input.retrieve(BackendState.process_input)
        )
    )

Условный рендеринг

Управляйте потоком состояний пользовательского интерфейса, не запуская повторную отрисовку серверной части, что идеально подходит для навигации с вкладками или пошаговых интерфейсов.

active_tab = ClientStateVar.create("active_tab", "home")

def tab_system():
    return rx.vstack(
        rx.hstack(
            rx.button("Home", on_click=active_tab.set_value("home")),
            rx.button("Profile", on_click=active_tab.set_value("profile")),
        ),
        rx.match(
            active_tab.value,
            ("home", rx.text("Welcome to the home page.")),
            ("profile", rx.text("User profile settings.")),
            rx.text("404 - Unknown Tab")
        )
    )

Управление сеансами

Этот расширенный шаблон показывает, как обрабатывать редактируемые состояния пользовательского интерфейса во внешнем интерфейсе при синхронизации изменений с серверной частью.

EditSessionName = ClientStateVar.create("EditSessionName", False)

class SessionState(rx.State):
    def save_name(self, session_id: str, new_name: str):
        # Backend logic to persist the change
        print(f"Session {session_id} renamed to {new_name}")

    def trigger_save(self, session_id: str):
        # Retrieve client-side text content via JS and pass to backend
        return rx.call_script(
            f'document.getElementById("{session_id}").innerText',
            callback=lambda val: self.save_name(session_id, val)
        )

def session_editor(session_id: str, name: str):
    return rx.text(
        name,
        id=session_id,
        content_editable=EditSessionName.value,
        on_double_click=EditSessionName.set_value(True),
        on_blur=[
            EditSessionName.set_value(False),
            SessionState.trigger_save(session_id),
        ],
    )

Справочник по API

В этом разделе описаны доступные методы взаимодействия с состоянием внешнего и внутреннего интерфейса.

Метод Контекст Описание
.значение Интерфейсный компонент Доступ к текущему значению состояния для рендеринга.
.set_value(v) Фронтэнд-мероприятие Обновите значение состояния из обработчика событий.
.сет Фронтэнд-мероприятие Псевдоним свойства для .set_value(), возвращающий цепочку событий.
.получить(cb) Серверный обработчик Извлеките текущее значение на стороне клиента в обратный вызов обработчика событий серверной части.
.push(в) Серверный обработчик Отправьте значение из серверной части, чтобы обновить состояние на стороне клиента.