E3.13.1cascade child depends on parent设计
级联选择的下一级选项依赖上一级的选择结果
别名: 级联选择 · cascading select · 省市区
概念解释
级联选择(cascading select)把一次选择拆成先后几级,每一级的候选项由上一级已经选定的值决定:先省后市,先类目后型号,先部门后成员。下一级在上一级未决时是空的、禁用的、或根本不出现。它不是把一棵树摊成多列同时多选,也不是普通下拉碰巧排在一起。依赖是单向的:子级的合法集合是父级值的函数。
没有依赖就没有级联。两个独立下拉并排放,只是两个字段。
机制
完整路径上的合法组合往往是稀疏的:不是每个省都有每个市名,不是每个类目都有每个型号。一级级收紧集合,避免在一张扁平名单里列出大量非法组合。用户用上一级当过滤器,下一级的认知负担从「全世界」降到「这个父节点下面」。
依赖也规定了时间顺序。人必须先给出父值,子级才存在。把子级先打开,里面要么是过期的全集,要么是空白,两种都会让人以为控件坏了。父级的标签要先于子级被理解,否则顺序本身会变成谜题。
边界
兄弟节点之间需要互相比较时(几个市的政策差异),级联把比较对象锁在不同父级下,不合适。多选树允许在不同分支上同时勾选,级联通常每级只留一个值,一条路径。若子级其实不依赖父级(型号与颜色独立),做成级联会伪造约束,让人以为某些颜色在某些型号下不存在。异步加载子级时,依赖仍然成立,但要有加载中状态,不能在请求回来之前展示上一父级留下的子项。
怎么落地
- 只有子集合真是父值的函数时才用级联;独立维度并排,不要串成假依赖。
- 父级未选时禁用或隐藏子级,并让标签看出先后(「先选省」)。
- 子级选项必须在父值变化后换成新集合,不要留下上一父级的名单。
- 验证:改父级,看子级名单是否换成新父节点下的合法项。出现不属于新父级的项,依赖就断了。