实例切换属性覆盖

实例切换时的属性覆盖保留指南及组件集最佳实践

使用组件(实例)时,我们往往会对实例图层的属性做一些调整,以满足不同设计场景的需要,包括修改填充色、添加阴影特效、修改文本内容、以及通过实例切换替换图标等,我们统称这些调整为属性覆盖。

覆盖产生后,如果再进行实例切换,会发现属性覆盖有时会传递到新的实例上,有时却不会,并且反复切换时,属性覆盖还可能会丢失。

此篇文档能够帮助你了解,符合什么样的条件时,属性覆盖会在实例切换后被保留下来,以及什么时候不会。

除此之外,你还将了解到,使用组件集功能时,如何定义简洁、有效的组件状态,以确保属性覆盖在不同状态之间被正确的保留下来。

核心机制说明

属性覆盖是指实例内具体图层的属性被人为修改,当进行实例切换时,理解属性覆盖的保留逻辑的关键在于:什么情况下,实例 a 的图层 a-m 的属性修改,要在实例 b 的图层 b-n 上保留下来。

我们用以下两个条件,把实例切换的场景划分为四个子场景:

  • 是否是在同一组件集内切换不同的组件状态;

  • 是实例(容器)层,还是实例的子图层。

非组件集内状态切换
- 组件 A 的实例 a 切换到组件 B 的实例 b
- 组件集 A 的状态实例 a1 切换到组件 B 的实例 b
组件集内状态切换
- 组件集 A 的状态实例 a1 切换到组件集 A 的状态实例 a2
实例层无条件保留覆盖,即:
对实例(容器)层所做的任何修改,在实例切换后,都会被保留在新的实例(容器)层上,不论实例(容器)的图层名称是否一致。
例如:实例层无条件保留覆盖.PNG
不同状态定义一致时保留覆盖,即:
当从组件集 A 的状态实例 a1 切换到组件集 A 的状态实例 a2 时,如果在组件集中,两个状态 A1 和 A2 的顶层(容器)层对应的属性定义是一致的,那么实例 a1 的对应属性覆盖会被保留在实例 a2 上,不论实例(容器)的图层名称是否一致。
例如:
组件集 BTN 的状态 color=white 和 color=green 的顶层(容器)层的填充都是黑色,把实例 color=white 的顶层填充修改为蓝色,当切换到状态 color=green 时,蓝色填充覆盖会保留下来。
实例层不同状态保持覆盖.PNG 相应的,如果不同状态对应的属性定义不一致,覆盖便不会保留。
这一点对使用组件集尤为重要,那些用于区分不同状态的属性定义会被保护起来,避免在使用实例时,对其中一个状态的属性修改在切换状态时污染其他状态的属性。
例如:
这个例子中,描边色用来区分两个状态,即使对其中一个状态的描边色进行覆盖,也不会影响其他状态的定义。实例层状态无法覆盖.PNG
实例子图层1、同名且同序时保留覆盖,即,需要同时满足:
- 图层名称相同,区分大小写
- 且在所有同名图层中的图层索引顺序相同
图层索引顺序指,在图层树上,从外到内、从下到上,逐层遍历时图层的编号。
例如:
实例 btn 中有一个名为 text 的子图层,实例 menu 中有多个名为 text 的子图层,实例切换时,btn-text 的文本内容属性覆盖会保留在图层树上从外到内、从下到上索引到的第一个 menu-text 图层上,其他同名图层上则不会保留。子图层同名同序保持覆盖.PNG
- 文本特例:当两个组件都只有一个文本图层时,不需要同名同序,也会保留覆盖。
2、绑定了同类型(显示状态、文本内容、实例切换、插槽)且名称相同的组件属性时保留覆盖。
例如:
组件 A 的子图层 layer123 绑定了名为“显示图层”的显示状态属性,组件 B 的子图层 layer456 也绑定了名为“显示图层”的显示状态属性,用户隐藏实例 a 的 layer123,此时从实例 a 切换到实例 b 时,layer456 也会被隐藏。
组件 A 的子图层 buttonText 绑定了名为“按钮文案”的文本内容属性,组件 B 的子图层 ctaText 也绑定了名为“按钮文案”的文本内容属性。
当用户将实例 a 中的 buttonText 修改为“立即购买”后,从实例 a 切换到实例 b 时,ctaText 的文案也会保持为“立即购买”。
1、同名同序且不同状态定义一致时保留覆盖,即,需要同时满足:
- 图层名称相同,区分大小写
- 且在所有同名图层中的图层索引顺序相同
- 且不同状态的同名图层对应的属性定义一致
例如:
组件集 BTN 的状态 color=white 和 color=green 均包含一个名为 text 的黑色填充的文本图层,把实例 color=white 的图层 text 填充修改为蓝色,当实例切换到状态 color=green 时,蓝色文本填充会保留下来。 子图层同名同序不同状态时保持覆盖.PNG
相应的,如果不同状态对应的属性定义不一致,覆盖便不会保留。

⚠️ 注意:遇到多层实例嵌套的组件时,遵循层级对应原则,例如:

  • 对实例 a 的子图层 layer123 做属性覆盖,切换到 b 时,虽然 b 的嵌套子实例中有一个名为 layer123 的图层,但覆盖不会保留下来;

  • 对于多层嵌套的组件集,选中哪一层切换状态时,就看对应层级的组件集中属性定义是否一致。

在下面这个例子中,虽然两种操作看上去都导致了 A 的状态切换,但上面操作是切换 ABC 的状态,所以要看 ABC 组件集中两个状态的 A 的填充是否一致,而下面操作是选中嵌套的 A 切换 A 的状态,所以要看 A 组件集中两个状态的 A 的填充是否一致。 例子-组件集中填充是否一致.png

暂存恢复机制说明

实例 a 切换到实例 b 时,实例 a 上未被保留到实例 b 的属性覆盖会被临时存储在内存中,切换回实例 a 时会自动恢复这些覆盖。

简单说就是,a 切到 b 再切回 a,a 还是切到 b 之前的样子,所有属性覆盖都不会丢失。

文件重新加载后,临时保存的数据会被清空。 暂存恢复机制.png

哪些操作属于实例切换

1、选中实例 A,在右侧属性面板将实例 A 切换到实例 B

  • 一般组件的实例切换

  • 在组件集内切换到不同的组件状态

  • 使用实例切换组件属性进行实例切换

2、从左侧组件列表拖出实例时,按住 opt/opt+cmd 替换画布上的实例

⚠️ 注意:使用 cmd+shift+r 粘贴替换实例不属于实例切换

设计系统维护最佳实践

  • 规范组件子图层的命名,如果希望在组件之间传递对子图层的属性覆盖,相应的图层名称须保持一致。

  • 在组件集内,那些不用来区分不同状态的属性定义应严格保持一致,否则即使图层名称一致,属性覆盖在切换状态时也不会被保留下来。

设计系统维护最佳实践.gif

在这个例子中,两个按钮的状态的只是颜色的差异,错误的做法是在两个状态中分别使用了不同的图标,正确的做法是,两个状态使用相同的图标,推荐使用部带有场景含义的占位图标符

进一步的,如果图标被封装成组件或组件集,强烈建议为 BTN 组件集的两个状态中嵌套的图标实例关联同一个实例切换组件属性,同时把这个嵌套的图标实例的属性暴露出来,这样便于在使用时切换图标,同时还可以确保切换按钮状态时图标不会被重置。 设计系统维护最佳实践2.png

常见问题排查

现象可能原因解决方案
切换实例时文本内容覆盖丢失目标实例存在多个文本图层且名称不匹配统一子文本图层命名,确保希望保留覆盖的图层的索引顺序一致
切换组件状态时,换好的图标又变回去了组件集不同状态中嵌套的图标不一致如果不期望用不同图标区分不同状态组件的使用场景,请确保所有状态组件嵌套相同的图标
反复切换实例时,之前做的修改丢失了浏览器缓存被清除,或文件被重新加载;
过程中的产生了新的覆盖且覆盖被保留了下来
尝试通过历史版本找回,避免刷新浏览器,随时复制一份关键改动出来

评价此篇文章:👍🏻 有帮助 👎🏻 无帮助

👉本篇文章对你是否有帮助?👍🏻 有帮助 👎🏻 无帮助,我们期待着你的反馈。