回调式用法

读者来稿 · admin与 batype 的 AI 分身对话整理

·0 字 · 约 1 分钟#React
const onDropNodeUpdateCallback = (
    dragNode,
    dropNode,
    callback: callbackType
  ) => {
    const name =
      dragNode.type === 'blob'
        ? dragNode?.name || dragNode?.title
        : String(dragNode?.path).split('/').pop()
    return callback(
      dragNode?.hasId,
      dropNode?.path,
      name,
      dragNode.type === 'blob'
    )
  }

  const onDropNodeCallback = (dragNode, dropNode, callback: callbackType) => {
    if (isEmpty(dragNode?.children)) {
      return onDropNodeUpdateCallback(dragNode, dropNode, callback)
    } else {
      onDropNodeUpdateCallback(dragNode, dropNode, callback)?.then(res => {
        if (res?.success) {
          return dragNode?.children?.map(node => {
            return onDropNodeCallback(
              node,
              {
                ...dropNode,
                path: `${dropNode?.path}/${String(dragNode?.path).split('/').pop()}`
              },
              callback
            )
          })
        }
      })
    }
  }

  const onDropNode = (
    info,
    treeDataClone,
    dragKey,
    dropKey,
    dropPosition,
    callback: callbackType
  ) => {
    let dragNode
    let dropNode
    loop(treeDataClone, dragKey, (node, key, data) => {
      data?.splice(key as number, 1)
      dragNode = node
    })

    if (!info.dropToGap) {
      loop(treeDataClone, dropKey, (node, key, data) => {
        node.children = node.children || []
        dropNode = node
        node.children.unshift(dragNode)
      })
    } else {
      let ar: FileNode[] = []
      let i: number
      loop(treeDataClone, dropKey, (node, key, data) => {
        ar = data as FileNode[]
        i = key as number
        dropNode = node
      })
      if (dropPosition === -1) {
        ar.splice(i!, 0, dragNode!)
      } else {
        ar.splice(i! + 1, 0, dragNode!)
      }
    }

    onDropNodeCallback(dragNode, dropNode, callback)?.finally(() =>
      mutateTreeFun()
    )
  }

相关文章

  • 我对 React Server Components 的看法:方向对了,代价被低估了

    RSC 解决的是真问题,但它给心智模型和生态带来的撕裂,比宣传里说的大得多。

  • 如何监听 div 是否渲染完成

    本文介绍了在Next.js中使用NextMarkdownPreview组件时,如何通过MutationObserver监听div的ref对象来解决按需加载导致的加载慢问题。通过监听childList变化,可以及时获取容器内容变化,优化用户体验。

  • react-monaco-markdown 操作手册

    react-monaco-markdown是一个React组件,集成了Monaco编辑器和Markdown解析,支持实时预览和编辑Markdown文档。支持npm、pnpm、yarn安装。提供多种配置选项,如主题、只读模式、自定义渲染等。适用于Next.js等SSR环境。MIT许可。