React
每次渲染时直接执行 filter 得到派生结果。
在线预览
- Apple$1 · 有库存
- Dragonfruit$1 · 有库存
- Passionfruit$2 · 缺货
- Spinach$2 · 有库存
组件关系与数据流
StateComponentDerivedData
差异焦点没有缓存或订阅关系,派生计算跟随每次组件 render 执行。
实线表示依赖、数据或命令传递,虚线表示事件、回调或清理路径。
flowchart TB
accTitle: React 渲染期间直接派生
accDescr: query 或 inStockOnly 更新后 ReactDemo 函数重新执行,products filter 在每次 render 中直接运行并生成普通 visibleProducts 值。
filters(["query + inStockOnly state"]) --> render["ReactDemo 再次执行"]
products[("products")] --> render
render --> derive{{"每次 render 执行 filter"}}
derive --> result[("普通 visibleProducts 值")]
result --> list["商品列表 UI"]
class filters state
class render,list component
class derive process
class products,result resource
classDef state fill:#ffffff,stroke:#149eca,color:#172033,stroke-width:1.2px
classDef component fill:#e5f6fb,stroke:#149eca,color:#172033,stroke-width:2px,font-weight:600
classDef process fill:#f4fbfd,stroke:#149eca,color:#172033,stroke-width:1.6px
classDef resource fill:#f3f5f8,stroke:#778195,color:#172033,stroke-width:1.4px组件重新执行时直接 filter;visibleProducts 是本次 render 的普通值。
实际运行源码
import { useState } from "react";
const products = [ { id: 1, name: "Apple", price: "$1", stocked: true }, { id: 2, name: "Dragonfruit", price: "$1", stocked: true }, { id: 3, name: "Passionfruit", price: "$2", stocked: false }, { id: 4, name: "Spinach", price: "$2", stocked: true },];
export function ReactDemo() { const [query, setQuery] = useState(""); const [inStockOnly, setInStockOnly] = useState(false);
const visibleProducts = products.filter((product) => { const matchesQuery = product.name .toLowerCase() .includes(query.toLowerCase()); return matchesQuery && (!inStockOnly || product.stocked); });
return ( <div className="demo-stack"> <label className="demo-field"> 搜索商品 <input className="demo-input" value={query} placeholder="例如 Apple" onChange={(event) => setQuery(event.target.value)} /> </label> <label className="demo-field"> <span> <input type="checkbox" checked={inStockOnly} onChange={(event) => setInStockOnly(event.target.checked)} />{" "} 仅显示有库存 </span> </label> <ul className="demo-list"> {visibleProducts.map((product) => ( <li key={product.id}> <span>{product.name}</span> <span className={product.stocked ? "" : "demo-muted"}> {product.price} · {product.stocked ? "有库存" : "缺货"} </span> </li> ))} </ul> </div> );}