Skip to content

通用组件-2021-08-21

统计信息:字数 2979 阅读6分钟

设计原则

  • 单一职责:选择合适的粒度(例如输入框,选择框)
  • 通用性:选择器是否支持筛选,是否支持输入;下拉菜单中是否支持子菜单,是否支持不能点的项目等
  • 低耦合高内聚:避免依赖外部结构
  • 行为明确:组件的形态(DOM结构)永远是千变万化的,但是其行为(逻辑)是固定的,因此通用组件的秘诀之一就是将 DOM 结构的控制权交给开发者,组件只负责行为和最基本的 DOM 结构
  • 稳定性可扩展:没有传参或者参数不合法,可以正常显示;功能可以扩展,可以在特定的场景更改一部分功能

props

  • 样式:样式基本固定,然后外部传递 style 对象,可以覆盖当前的样式
  • 类名:外部类名覆盖内部类名
  • 回调函数:点击不同按钮,内部的鼠标键盘事件,需要执行对应的回调函数(不传值,不执行)只是UI层的组件,直接把对应的数据通过回调函数返回外部组件中。
  • 列表渲染:需要判断传入列表是否正确;没有列表如何渲染空界面
  • 数据交互:尽量避免和其他组件通信,可以使用 redux 的思路,全局发出 actions 然后处理对应的逻辑,或者在业务组件中处理。

具体案例

ant-design 的组件

<SelectTrigger
  // 事件回调函数
  onPopupFocus={this.onPopupFocus}
  onMouseEnter={this.props.onMouseEnter}
  onMouseLeave={this.props.onMouseLeave}
  onDropdownVisibleChange={this.onDropdownVisibleChange}
  onMenuSelect={this.onMenuSelect}
  onMenuDeselect={this.onMenuDeselect}
  onPopupScroll={props.onPopupScroll}

  // 样式类名
  dropdownAlign={props.dropdownAlign}
  dropdownClassName={props.dropdownClassName}
  dropdownMatchSelectWidth={props.dropdownMatchSelectWidth}
  defaultActiveFirstOption={props.defaultActiveFirstOption}
  dropdownMenuStyle={props.dropdownMenuStyle}
  transitionName={props.transitionName}
  animation={props.animation}
  prefixCls={props.prefixCls}
  dropdownStyle={props.dropdownStyle}

  // 列表渲染
  options={options}
  inputValue={state.inputValue}
  value={state.value}
  backfillValue={state.backfillValue}

  // 功能支持
  combobox={props.combobox}
  showSearch={props.showSearch}
  multiple={multiple}
  disabled={disabled}
  visible={realOpen}
  firstActiveValue={props.firstActiveValue}
  getPopupContainer={props.getPopupContainer}
  showAction={props.showAction}
  menuItemSelectedIcon={props.menuItemSelectedIcon}
  dropdownRender={props.dropdownRender}
  ariaId={this.ariaId}

  // 外部可以获取内部DOM进一步获取内部的属性尽量不使用
  ref={this.saveSelectTriggerRef}
/>

参考链接:

https://juejin.cn/post/6844903847874265101

https://blog.csdn.net/weixin_44160385/article/details/95770380

https://blog.csdn.net/weixin_44160385/article/details/95770380

https://www.cnblogs.com/duxinyi/p/11676908.html


Last update: November 9, 2024