Plan Ui Change

作者 dotnet0608d8924cd3MIT5.5K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库今天更新

Plan complex Blazor UI features by decomposing them into focused components. USE FOR: building a complex Blazor page with multiple sections, planning component decomposition, designing a multi-section dashboard or layout, breaking down a large UI feature into composable components, pages with sidebars and content panels, any page with 3+ distinct visual sections or multiple interacting sub-features, identifying parent-child relationships and data flow. DO NOT USE FOR: creating new Blazor projects or apps from scratch (use create-blazor-project), implementing a single individual component (use author-component), writing component code with parameters and EventCallback (use author-component), or simple single-component pages.

AI 生成的概览

通过将复杂的 Blazor UI 功能拆解为专注的可组合组件,先规划再实现。

功能
引导智能体按五步规划流程处理复杂的 Blazor UI 功能:把视觉区域映射为组件树,按操作、渲染模式、所拥有的状态和预估规模对每个组件分类,设计数据流(参数向下、EventCallback 向上),识别复用机会,并按自底向上的顺序安排实现。它会产出一份简短的组件计划(组件树、表格、数据流、实现顺序),随后立即编写 .razor 组件。它还列出了应避免的反模式,例如单体页面组件和参数逐层传递。
适用场景
适用于构建包含三个或更多明显视觉区域的复杂 Blazor 页面、多区域仪表盘或布局,或任何需要拆分为可组合组件的大型 UI 功能。不适用于从零创建新的 Blazor 项目、实现单个组件,或简单的单组件页面。
运行要求
仅为说明性指令,不附带脚本。它假定处于 Blazor 项目环境,且智能体能够创建 .razor 文件,但未指明具体工具、软件包、运行时、凭据或网络访问需求。

Plan a Blazor UI Change

When asked to build a complex UI feature, plan the component decomposition first, then immediately implement it. A single monolithic page component is almost never the right answer — break the UI into focused, composable components.

Planning Workflow

Step 1 — Map the Visual Regions

Read the request and identify every distinct visual region. Each region that has its own data, behavior, or layout responsibility is a candidate component.

Draw the component tree:

InventoryDashboard          (page — owns data, orchestrates layout)├── StockSummaryBar         (read-only stats: total items, low-stock count, value)├── InventoryFilters        (search box, category dropdown, stock-level toggle)├── InventoryTable          (sortable table of products)│   └── InventoryRow        (single product row with inline edit/delete)└── AddProductForm          (slide-out form for new products)

Rules for identifying components:

  • Distinct responsibility — a region owns its own state or behavior → separate component
  • Repeated structure — items in a list, cards in a grid → extract the item template
  • Independent interactivity — a section that handles user input separately from its siblings → separate component
  • Size — any section that would exceed ~150 lines of markup on its own → split it

Step 2 — Classify Each Component

For every component in the tree, determine:

ComponentActionRender ModeState OwnedLines (est.)
InventoryDashboardCreateInteractiveServerproduct list, filter state~80
StockSummaryBarCreate(inherits)none — receives data~30
InventoryFiltersCreate(inherits)search text, selected category~60
InventoryTableCreate(inherits)sort column, sort direction~50
InventoryRowCreate(inherits)inline-edit mode flag~60
AddProductFormCreate(inherits)form model~80

A page component that exceeds ~200 lines of combined markup + code is too large. If your estimate puts a single component above that, split further.

Step 3 — Design Data Flow

Identify the state owner for each piece of data, then map how it flows:

InventoryDashboard (owns: products[], filters)  │  ├─ [Parameter] products ──→ StockSummaryBar (reads aggregate stats)  │  ├─ [Parameter] filters ──→ InventoryFilters  │   └─ EventCallback<Filters> OnFiltersChanged ──→ InventoryDashboard  │  ├─ [Parameter] filteredProducts ──→ InventoryTable  │   └─ [Parameter] product ──→ InventoryRow  │       ├─ EventCallback<Product> OnSave ──→ InventoryTable ──→ InventoryDashboard  │       └─ EventCallback<Product> OnDelete ──→ InventoryTable ──→ InventoryDashboard  │  └─ EventCallback<Product> OnProductAdded ←── AddProductForm

Rules:

  • Data always flows down through [Parameter]
  • Events always flow up through EventCallback<T>
  • The page/parent owns the data and passes filtered/transformed views to children
  • Children never mutate parameters — they notify the parent via callbacks
  • If data must cross more than 2 levels without intermediate components needing it, use a cascading value or a scoped service

Step 4 — Identify Reuse Opportunities

Before creating a new component, check if an existing component in the project can serve the purpose. Look for:

  • Existing list-item components that match the structure
  • Shared filter/search components already in the project
  • Generic components (e.g., DataTable<T>, Pagination) that accept templates

If a component will be used in more than one page, place it in a Shared/ or Components/ folder.

Step 5 — Order the Implementation

Build bottom-up — leaf components first, then parents that compose them:

  1. Models/DTOs — define the data shapes
  2. Services — data access, business logic (interface + implementation)
  3. Leaf components — components with no children (InventoryRow, StockSummaryBar)
  4. Container components — components that compose leaves (InventoryTable, InventoryFilters)
  5. Page component — wires everything together, registers routes
  6. Configuration — DI registration, render mode setup

Each component should be independently compilable. Never reference a component that doesn't exist yet.

Output Format

Present the plan briefly, then immediately proceed to implement — never stop at just the plan or ask for confirmation before writing code. The plan is a thinking tool, not a deliverable.

markdown
## Component Plan: [Feature Name]
### Component Tree[ASCII tree showing parent-child relationships]
### Component Table| Component | Action | Render Mode | Purpose | Est. Lines ||-----------|--------|-------------|---------|------------|| ... | ... | ... | ... | ... |
### Data Flow[State owner] → [Parameters down] → [EventCallbacks up]
### Implementation Order1. [First file to create — why]2. [Second file — why]...

After outputting the plan, immediately begin implementing the components in the order listed. Do not wait for approval or ask "shall I proceed?" — the plan is a guide for you to follow, not a proposal for the user to approve.

Anti-Patterns to Avoid

Anti-PatternWhy It's WrongCorrect Approach
One page component with 500+ linesImpossible to test, reuse, or maintainDecompose into focused components
Passing 10+ parameters through intermediate componentsParameter drilling obscures intentUse cascading values or a scoped state service
Child component fetching its own data from an APIMultiple components making redundant callsParent owns data, passes via parameters
Inline rendering of list items with complex markupDuplicated logic, no reuse, hard to testExtract item template into its own component
Building everything in one file then "refactoring later"Refactoring rarely happens; the monolith shipsPlan the decomposition upfront
Generic components for one-off usageOver-engineering adds complexityOnly extract generics when reuse is proven

Guidelines

  • Plan briefly, then implement. Write a concise component table and data flow map, then immediately create the .razor files — never stop at just the plan.
  • Prefer many small components over one large one. A component with a single clear purpose is easier to understand, test, and reuse.
  • State ownership is the first decision. Before writing fetch logic, decide which component owns the data.
  • Build bottom-up. Create leaf components first so parent components can reference them immediately.
  • Name components after what they render, not what they do internally: ProductCard not ProductRenderer, OrderFilters not FilterHandler.

来源与署名

来源:dotnet/skills位于plugins/dotnet-blazor/skills/plan-ui-change提交0608d89

许可证: MIT

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架