NutUI-React Checkbox 组件的设计与实现

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

功能预览

为什么封装组件

在日常的项目开发过程中,会遇到很多相似的功能,在管理不同代码库的时候,也会面临重复代码的问题,组件的提炼可以解决代码粘贴复制的问题,同时通过对代码的封装复用,降低了同一功能的维护成本。

实现思路及原理

功能梳理

Checkbox 组件的使用场景主要分为:单独使用、多个独立使用、组合使用。而且在组合使用的场景中需要考虑 Checkbox 嵌套在其他 HTML 标签中的场景。

核心原理

单独使用 Checkbox 的实现相对简单,主要根据设计的 props 来实现对应的功能,例如:checked 的对应功能是通过设置一个 state 来实现。

在组合使用的场景中,我们又封装了另外一个 CheckboxGroup 组件,通过 CheckboxGroup 组件来对 Checkbox 组件进行分组。同时为了方便的实现全选、反选等功能,需要在 CheckboxGroup 组件是上暴露 Ref,并在 Ref 挂载上处理此功能的方法。例如 CheckboxGroup 的 Ref 可以对外暴露 toggleAll、reverse 方法。

Ref 提供的方法主要借助 useImperativeHandle 实现, 代码示例如下:

js 复制代码
useImperativeHandle(res, ()=> ({
  toggleAll(state) {
    
  },
  reverse() {
    const labelsForChildren = []
    React.children.map(childern, child =>{
      labelsForChildren.push(child.props.label)
    })
    const nextState = labelsForChildren.filter((childLabel) => stateForCheckboxGroup.findIndex(value) => value == childlabel) === -1
    setStateForCheckboxGroup(nextState)
  }
}))

Checkbox 的组合使用以及支持 HTML 标签嵌套主要借助 React 的 Context 来传递 props。在设计 Context 的时候,要主要只提供必需的,而不要过多的提供 props 下传。

在 CheckboxGroup 组件的 Context 中,主要提供了用于操控 state 的 check() uncheck() 方法,组合的选中状态 checkedValues,限制最大选中数量的 max

js 复制代码
const CheckboxGroupContext =
  createContext<{
    checkedValues: string[]
    max: number | undefined
    check: (value: string) => void
    uncheck: (value: string) => void
  } | null>(null)

在调用 createContext 的时候,我们提供了 null 作为默认值,这一点比较重要。因为在 Checkbox 组件中,要同时支持 context 和 非 context 的情况。这种情况的判断,主要根据 context 的值来处理。

js 复制代码
// checkbox.tsx
const ctx = useContext(CheckboxGroupContext)
if(ctx) {
  // 存在 ctx 的情况处理
}

在未实现 Context 支持的 Checkbox 组件的实现中,我们设计了一些内部的状态,来控制 Checkbox 的选中,禁用等功能。那在支持 Context 的情况里,我们怎么处理之前设置过的 State 呢?我们可以通过覆盖的方式来处理。

js 复制代码
let [checked, setChecked] = useState(props.checked)

if(ctx) {
  setChecked = (checked) => {
    if(checked) ctx.check()
    else ctx.uncheck()
  }
}

上面主要介绍了 Checkbox 的几个关键的处理点,如果大家在使用 NutUI-React 过程中,发现此组件的问题可以直接通过 Issues 提问或者直接 PR 给我们。

加入我们

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

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

官网GitHub: 点击进入

欢迎共建、使用!

更多文章

NutUI-React 适配 Taro 的实现

基于 Leo+NutUI 的移动端项目模板实践

NutUI-React Input输入框的使用指南

NUTUI-React 数字滚动组件的设计与实现

NutUI-React 组件库的动态主题探索

NutUI 4.0 正式发布!

2022 倒带-NutUI

京东 React 组件库支持小程序开发了

NutUI 京东小程序发布了!

相关推荐
前端大卫3 分钟前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘18 分钟前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare19 分钟前
浅浅看一下设计模式
前端
Lee川23 分钟前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix1 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人1 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl1 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅1 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人1 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼1 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端