Token导航 LogoToken导航

Agent Skill · 研究检索

complex-interaction(复杂的相互作用)

complex-interaction 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

complex-interaction 是研究检索类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为需要联网;许可证为 MIT-0,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 25,598。

总安装 3,733周安装 154GitHub Stars 公开资料未说明下载 1,220核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.0.0

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:complex-interaction(复杂的相互作用)
来源仓库:https://github.com/wangzhiming1999/complex-interaction
安装命令:
openclaw skills install complex-interaction
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install complex-interaction

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

实现拖放、虚拟滚动等高级前端交互功能。complex-interaction 属于研究检索类 Skill,可作为该场景下的辅助能力补充。支持富文本编辑和 Canvas/WebGL 渲染。适用于复杂 UI 组件开发和实时协作应用。

安装命令:openclaw skills install complex-interaction。需配合具体框架文档使用,避免与现有事件冲突。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install complex-interaction;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

complex-interaction 怎么安装?

在终端执行 openclaw skills install complex-interaction。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

complex-interaction 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

complex-interaction 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

complex-interaction 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

complex-interaction 用的人多吗?

公开数据是累计安装 3,733 次,近一周安装 154 次,下载 1,220 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

complex-interaction 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
complex-interaction

复杂的相互作用 · 本页

3,733—需要联网MIT-0通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
complex-interaction
description
Implements complex frontend interactions: drag-and-drop, virtual scrolling, rich text editors, real-time collaboration, canvas/WebGL, and gesture handling. Use when 拖拽, 虚拟滚动, 富文本, 实时协作, Canvas, WebGL, 手势, or complex UI interactions.
model
opus

复杂交互实现(Complex Interaction)

实现拖拽排序、虚拟滚动、富文本编辑器、实时协作、Canvas/WebGL 等高难度交互,给出可落地的方案和关键代码。

触发场景

  • 「拖拽排序怎么做」「拖拽上传」「看板拖拽」
  • 「列表有几万条,怎么不卡」「虚拟滚动」
  • 「富文本编辑器」「表格编辑器」「低代码画布」
  • 「多人实时协作」「冲突解决」
  • 「Canvas 性能优化」「WebGL 入门」「手势识别」

执行流程

1. 先判断复杂度,选对方案

不要上来就自己实现,先评估:

场景推荐方案自己实现的条件
简单拖拽排序(同列表)@dnd-kit/sortable几乎不需要
复杂拖拽(跨容器、看板、树形)@dnd-kit/core 自定义有特殊约束时
长列表虚拟滚动@tanstack/react-virtual几乎不需要
富文本编辑器Tiptap / Slate.js极度定制化需求
实时协作Yjs + 对应绑定几乎不需要
Canvas 2D 交互Konva.js / Fabric.js性能极限场景
3D / WebGLThree.js / React Three Fiber几乎不需要

自己实现的成本远超预期——拖拽涉及触摸事件、键盘无障碍、滚动容器、嵌套列表,富文本涉及光标、选区、撤销栈,这些库已经踩过所有坑。

2. 拖拽排序

标准实现(@dnd-kit):

import { DndContext, closestCenter } from '@dnd-kit/core'
import { SortableContext, useSortable, verticalListSortingStrategy, arrayMove } from '@dnd-kit/sortable'
import { CSS } from '@dnd-kit/utilities'

function SortableItem({ id, children }) {
  const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id })
  return (
    <div
      ref={setNodeRef}
      style={{
        transform: CSS.Transform.toString(transform),
        transition,
        opacity: isDragging ? 0.5 : 1,
      }}
      {...attributes}
      {...listeners}
    >
      {children}
    </div>
  )
}

function SortableList({ items, onReorder }) {
  return (
    <DndContext
      collisionDetection={closestCenter}
      onDragEnd={({ active, over }) => {
        if (over && active.id !== over.id) {
          const oldIndex = items.findIndex(i => i.id === active.id)
          const newIndex = items.findIndex(i => i.id === over.id)
          onReorder(arrayMove(items, oldIndex, newIndex))
        }
      }}
    >
      <SortableContext items={items.map(i => i.id)} strategy={verticalListSortingStrategy}>
        {items.map(item => (
          <SortableItem key={item.id} id={item.id}>{item.name}</SortableItem>
        ))}
      </SortableContext>
    </DndContext>
  )
}

跨容器拖拽(看板)的关键点:

  • 用 DragOverlay 渲染拖拽中的预览,避免原位置闪烁
  • 用 over.data.current 判断拖到了哪个容器
  • 状态更新要在 onDragEnd 里做,onDragOver 只做视觉反馈

拖拽上传的关键点:

  • 用原生 dragover + drop 事件,不需要 dnd-kit
  • dragover 必须 preventDefault() 才能触发 drop
  • 用 DataTransfer.items 处理文件夹递归上传

3. 虚拟滚动

何时需要虚拟滚动: 列表超过 500 条且有明显卡顿,或超过 2000 条无论是否卡顿。

标准实现(@tanstack/react-virtual):

import { useVirtualizer } from '@tanstack/react-virtual'

function VirtualList({ items }) {
  const parentRef = useRef(null)

  const virtualizer = useVirtualizer({
    count: items.length,
    getScrollElement: () => parentRef.current,
    estimateSize: () => 56,          // 预估行高,影响滚动条比例
    overscan: 5,                      // 视口外额外渲染的行数
  })

  return (
    <div ref={parentRef} style={{ height: '600px', overflow: 'auto' }}>
      <div style={{ height: virtualizer.getTotalSize() }}>  {/* 撑开滚动高度 */}
        {virtualizer.getVirtualItems().map(virtualRow => (
          <div
            key={virtualRow.key}
            style={{
              position: 'absolute',
              top: 0,
              transform: `translateY(${virtualRow.start}px)`,
              height: `${virtualRow.size}px`,
            }}
          >
            {items[virtualRow.index].name}
          </div>
        ))}
      </div>
    </div>
  )
}

动态行高的处理:

const virtualizer = useVirtualizer({
  count: items.length,
  getScrollElement: () => parentRef.current,
  estimateSize: () => 56,
  // 测量实际渲染高度,自动修正
  measureElement: (el) => el.getBoundingClientRect().height,
})

// 在每个 item 上加 ref
<div ref={virtualizer.measureElement} data-index={virtualRow.index}>

虚拟滚动 + 无限加载:

// 监听最后一个 item 进入视口
useEffect(() => {
  const lastItem = virtualItems[virtualItems.length - 1]
  if (!lastItem) return
  if (lastItem.index >= items.length - 1 && hasNextPage && !isFetchingNextPage) {
    fetchNextPage()
  }
}, [virtualItems, items.length, hasNextPage, isFetchingNextPage])

4. 富文本编辑器

选型决策:

  • 需要协作编辑 → Tiptap(基于 ProseMirror,有 Yjs 扩展)
  • 需要高度定制数据结构 → Slate.js(数据模型完全可控)
  • 简单格式化(加粗/斜体/链接)→ Tiptap 基础版,5 分钟搭起来
  • 类 Notion 块编辑器 → Tiptap + 自定义 Node

Tiptap 快速上手:

import { useEditor, EditorContent } from '@tiptap/react'
import StarterKit from '@tiptap/starter-kit'
import Placeholder from '@tiptap/extension-placeholder'

function RichTextEditor({ value, onChange }) {
  const editor = useEditor({
    extensions: [
      StarterKit,
      Placeholder.configure({ placeholder: '开始输入...' }),
    ],
    content: value,
    onUpdate: ({ editor }) => onChange(editor.getHTML()),
  })

  return (
    <div className="editor-wrapper">
      <Toolbar editor={editor} />
      <EditorContent editor={editor} />
    </div>
  )
}

function Toolbar({ editor }) {
  if (!editor) return null
  return (
    <div>
      <button onClick={() => editor.chain().focus().toggleBold().run()}
        className={editor.isActive('bold') ? 'active' : ''}>B</button>
      <button onClick={() => editor.chain().focus().toggleItalic().run()}>I</button>
    </div>
  )
}

5. 实时协作(Yjs)

Yjs 的核心概念:

  • Y.Doc:共享文档,所有协作数据的容器
  • CRDT:冲突自动合并,不需要手写冲突解决逻辑
  • Provider:传输层(WebSocket、WebRTC、IndexedDB 本地持久化)

与 Tiptap 集成:

import * as Y from 'yjs'
import { WebsocketProvider } from 'y-websocket'
import { Collaboration } from '@tiptap/extension-collaboration'
import { CollaborationCursor } from '@tiptap/extension-collaboration-cursor'

const ydoc = new Y.Doc()
const provider = new WebsocketProvider('wss://your-server.com', 'room-name', ydoc)

const editor = useEditor({
  extensions: [
    StarterKit.configure({ history: false }),  // 禁用内置 history,用 Yjs 的
    Collaboration.configure({ document: ydoc }),
    CollaborationCursor.configure({
      provider,
      user: { name: '张三', color: '#f783ac' },
    }),
  ],
})

后端 WebSocket 服务器(y-websocket):

# 最简单的方式:直接用官方服务器
HOST=localhost PORT=1234 npx y-websocket

6. Canvas 性能优化

Canvas 卡顿的常见原因:

原因解法
每帧重绘整个画布分层 Canvas(静态背景一层,动态元素一层)
在主线程做大量计算用 OffscreenCanvas + Web Worker
频繁创建/销毁对象对象池(Object Pool)
没有用 requestAnimationFrame用 rAF 驱动动画循环
高 DPI 屏幕模糊canvas.width = width * devicePixelRatio

高 DPI 修复:

function setupCanvas(canvas: HTMLCanvasElement) {
  const dpr = window.devicePixelRatio || 1
  const rect = canvas.getBoundingClientRect()
  canvas.width = rect.width * dpr
  canvas.height = rect.height * dpr
  const ctx = canvas.getContext('2d')!
  ctx.scale(dpr, dpr)
  return ctx
}

分层 Canvas(低代码画布场景):

// 背景网格层(静态,只在 resize 时重绘)
<canvas ref={bgRef} style={{ position: 'absolute' }} />
// 元素层(拖拽时重绘)
<canvas ref={elementsRef} style={{ position: 'absolute' }} />
// 交互层(hover/选中高亮,频繁重绘)
<canvas ref={interactionRef} style={{ position: 'absolute' }} />

常见坑

场景坑解法
拖拽触摸设备不触发 mouse 事件dnd-kit 已处理,自己实现要加 touch 事件
虚拟滚动滚动到底部时跳动用 measureElement 测量实际高度
富文本粘贴时带入外部样式配置 transformPastedHTML 清理
实时协作断线重连后数据不一致y-websocket 自动处理,确保 provider 有重连逻辑
Canvas事件坐标偏移用 canvas.getBoundingClientRect() 转换坐标

平台分布

OpenClaw

84.83%
按下载量换算1,035

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills