首页 >web前端 >js教程 >使用 ObservableTypes 在没有 CSS 类的情况下拖放

使用 ObservableTypes 在没有 CSS 类的情况下拖放

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-09 07:07:02364浏览

Drag

许多 UI 库和 CSS 框架用于通过求助于 CSS 类来启用特殊功能。这在 jQuery 插件时代尤其流行。

尽管是一个非常受欢迎的选择,但它绝对是一种编程反模式。

今天我们有几种替代方法。功能反应领域的一种方法使得将功能“合并”到现有元素中成为可能。没有 CSS 类,没有 id 属性滥用。

假设我们想通过一个单独的可重用模块在 HTML 列表中启用拖放功能,我们可以随意添加或删除。

  <ul ...${Sortable({onOrderChange: todoList.move})}>
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
    <li>item 4</li>
    <li>item 5</li>
  </ul>

Sortable 将在所谓的 Mixin 中实现。它的作用是在所谓的“DOM 对象”中导出属性、样式、类、事件处理程序:它包含的任何内容都将合并到目标元素中。

// sortable.ts
import { Subject, map, withLatestFrom } from 'rxjs';

export const Sortable = ({ onOrderChange }) => {
  const dragStart = new Subject<HTMLLIElement>();
  const drop = new Subject<HTMLLIElement>();

  drop.pipe(
    withLatestFrom(dragStart),
    map(([dropEvt, dragEvt]) => {
      const list = [...dragEvt.target.closest('ol,ul').children];
      return [ list.indexOf(dragEvt.target), list.indexOf(dropEvt.target.closest('li')) ]
    }),
  ).subscribe(([src, dst])=>onOrderChange(src, dst));

  // Export a DOM Object for a framework or UI library
  // to take care of and merge into the target element
  return {
    ondragstart: dragStart,
    ondragover: e=>e.preventDefault(),
    ondrop: drop,
  };
};

因此,最终的应用程序代码将如下所示:

import { rml } from 'rimmel';

const List = () => {

  return rml`
      <ul ...${Sortable({onOrderChange: todoList.move})}>
        <li>item 1</li>
        <li>item 2</li>
        <li>item 3</li>
        <li>item 4</li>
        <li>item 5</li>
      </ul>
  `;
}

在这里玩一个完整的工作示例:

以上是使用 ObservableTypes 在没有 CSS 类的情况下拖放的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn