スクリプトのお勉強 技術

(小ネタ) Reflex (Python) にてタブ形式のlinkを設定する

投稿日:

小ネタですが書いておきます。

Reflex とは、は割愛

前回に書いたので割愛します。

使い始めてみた

感想は後日、ということで

本題、タブ形式のlinkメニュー

たいていのUIコンポーネントにはタブ形式があるので、あっさりできるかなーと思ったらできませんでした。

以下のようなコンポーネントです。

実装

pages/index.py

以下は、先頭ページのトップ部分にtabs_link_menu()を置いた場合です。

@reflex_local_auth.require_login
@template(route="/", title="Overview", on_load=index_onload())
def index() -> rx.Component:
    return rx.vstack(
        tabs_link_menu(),
        rx.flex(
            rx.input(
                rx.input.slot(rx.icon("search"), padding_left="0"),
                placeholder="Search here...",
                size="3",

components(tabs_link_menu())

以下がtabs_link_menu()です。ほとんどがtemplateのパクリですが、こんな感じで書けるんですー、ということで。

def tabbar_item(text: str, url: str) -> rx.Component:
    """tabbar item.

    Args:
        text: The text of the item.
        url: The URL of the item.

    Returns:
        rx.Component: The sidebar item component.
    """
    # Whether the item is active.
    active = (rx.State.router.page.path == url.lower()) | (
        (rx.State.router.page.path == "/") & text == "Overview"
    )

    return rx.link(
        rx.hstack(
            rx.text(text, size="6", weight="regular"),
            color=rx.cond(
                active,
                styles.accent_text_color,
                styles.text_color,
            ),
            style={
                "opacity": rx.cond(
                    active,
                    "1",
                    "0.95",
                ),
                "bg": "#808080",
            },
            align="center",
            border_radius="10px 10px 0 0",
            width="100%",
            spacing="2",
            padding="0.35em",
        ),
        underline="none",
        href=url,
        width="100%",
    )


def tabs_link_menu():
    from reflex.page import get_decorated_pages

    # The ordered page routes.
    ordered_page_routes = [
        "/",
        "/table",
        "/about",
        "/profile",
        "/settings",
    ]

    # Get the decorated pages.
    pages = get_decorated_pages()

    # Include all pages even if they are not in the ordered_page_routes.
    ordered_pages = sorted(
        pages,
        key=lambda page: (
            ordered_page_routes.index(page["route"])
            if page["route"] in ordered_page_routes
            else len(ordered_page_routes)
        ),
    )

    return rx.tabs.root(
        rx.tabs.list(
            *[
                tabbar_item(
                    text=page.get("title", page["route"].strip("/").capitalize()),
                    url=page["route"],
                )
                for page in ordered_pages
            ],
            size="2",
        ),
    )

実装してみた

以下が実際に実装してみた画面です。

実装してみてなんですが

Radix UI にある通り、Tab NavコンポーネントがReflexに実装されてれば上記の実装は別のものになるでしょう。

終わりに

Reflexはまだ慣れないので、どこに何を書けばいいかよく分かっていません。手探りの日々です。

参考

  • https://reflex.dev/docs/library/

-スクリプトのお勉強, 技術

執筆者:

関連記事

svelteのUIライブラリを使用してみる(TreeView)

前回の続きで、まずは、TreeViewを実現してみます。 Carbon Components Svelte svelteのUIライブラリにCarbon Components Svelteを使用してみま …

Mojolicious XML-RPC Pluginの開発(1)

はじめに 最近、お仕事関連で、perlとWebアプリケーションを触っています。 両方一度にお勉強、ということで、perlのWAF(Webアプリケーションフレームワーク)を調べてみようと思いました。 こ …

新規プロジェクト参入時に考えること

派遣における労働条件 就業予定時間(変形労働時間やフレックスタイム制の適用を含む)残業の有無と量就業場所(交通ルート、オフィスの配置等)業務の継続予定期間 制服の有無 (背広かどうか)福利厚生施設の有 …

PyWebIOでform 入力+ REST API呼び出しを作ってみる

仕事柄、簡単なWebアプリを作りたいと思うことはよくあり、その場合はその場で直せるスクリプトで書きたいとよく思うものです。 すごーく簡単なフォームを非常に簡単に使いたいので、まずは簡単に作れるフレーム …

Pipenv vs Poetry

1. はじめに Pythonでお仕事していると、どうしても、環境設定を行う必要があります。 本番環境で動作するように、設定しなければいけないからです。 いろんな状況はあるでしょうが、私がかかわるプロジ …

google オプトアウト Click here to opt-out.