Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

NutUI React 安全区组件的实现


NutUI 是一款京东风格的移动端组件库。NutUI 目前支持 Vue 和 React技术栈,支持Taro多端适配。

期待您早日成为我们共建大军中的一员!

咚咚群号:1025679314微信群:hanyuxinting(暗号:NutUI-React)

官网GitHub: 点击进入

欢迎共建、使用!

NutUI React 2.x 版本新增了 SafeArea(安全区)组件。本文主要介绍 SafeArea 组件的实现思路。

背景

开发者在使用 Cascader 或 Picker 组件的时候,由于各个组件自己实现安全区域,导致代码重复,而且有些带有弹出交互的组件并没有添加安全区域的逻辑,导致展示问题。所以针对这样的问题,NutUI React 在 2.x 的版本中增加 SafreArea 组件,并统一应用于需要安全区域的组件上。

实现逻辑

安全区域组件需要考虑安全区域出现的位置,所以这里给安全区域暴露了 position 属性,用来控制安全区域的生效位置。除了对外暴露控制属性外,还需要考虑组件的使用。

声明式的组件使用主要包括两种类型:父子节点和兄弟节点。

<SafeArea>
   <DemoComponent />
</SafeArea>

<DemoComponent />
<SafeArea />

在实现上我们采用了兄弟节点的方式。SafeArea 组件通常情况下和其他组件不会有状态或逻辑上的耦合,而且降低嵌套层级,不但可降低组件的实现复杂度,还能提高性能。除此之外,兄弟节点的方式可以更自然的映射到 UI 结构。

确定了使用方式之后,就到了具体组件的逻辑开发。对于 SafeArea 组件来说,逻辑非常简单,只需在 div 上设置一些 css 样式即可。

export interface SafeAreaProps extends BasicComponent {
    position: 'top' | 'bottom'
}
const classPrefix = 'nut-safe-area'
export const SafeArea: FC<SafeAreaProps> = (props) => {
    return (
        <div
            className={classNames(
                classPrefix,
                `${classPrefix}-position-${props.position}`
            )}
        />
    )
}

在样式中我们提供了 css 变量,可以通过 css 变量来调整安全区域的高度。

.nut-safe-area {
  display: block;
  width: 100%;
  &-position-top {
    padding-top: calc(
      env(safe-area-inset-top) * var(--nutui-safe-area-multiple, 1)
    );
  }
  &-position-bottom {
    padding-bottom: calc(
      env(safe-area-inset-bottom) * var(--nutui-safe-area-multiple, 1)
    );
  }
}

到这里 SafeArea 组件的实现思路就讲述完了。总的来说我们拿了一个简单的组件,阐述了 React 中声明式组件两种使用方式的差别,以及选择何种使用方式来实现组件的考量点。希望能抛砖引玉,得到大家对于组件设计的一些思路和独门诀窍。

加入我们

再次期待您早日成为我们共建大军中的一员!

一起共建,一起使用!

做站内最优秀的开源组件库!

咚咚群号:1025679314赶紧加入我们吧!!