npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

card-drag-component

v1.0.1

Published

基于vue的卡片拖拽排列组件

Downloads

10

Readme

一个用vue实现的拖拽排列卡片组件

这是vue实现的拖动卡片组件,主要实现了

  • 拖动卡片与其他卡片的位置更换,并且其他卡片根据拖动的位置自动顺移,位置数据实时更新
  • 拖动的时候可使用鼠标滚动
  • 卡片根据数据生成,所有参数和内容都是可以自定义的,方便应用于不同场景
  • 不同操作的事件都可获取到,拖动后的位置数据会实时更新
  • 可以全局安装和按需加载

如何使用?

npm install card-drag-component

全局安装

在你vue项目的入口js文件中使用,vue-cli生成的项目一般为main.js文件

import {installCardDragComponent} from 'card-drag-component'
Vue.use(installCardDragComponent)

按需加载

在组件中直接import

import { CardDragComponent } from 'card-drag-component'

export default {
  components:{
    CardDragComponent ,
  }
}

使用示例

1.基础使用:

<template>
  <CardDragComponent :data="cardList">
  </CardDragComponent >
</template>
<script>
export default {
  data() {
    return {
      cardList: [{
        positionNum: i,
        name: "演示卡片"+i,
        id: "card"+i,
      }],
    }
  }
}
</script>

2.完整示例: 参照源码仓库中的examples 将整个项目clone下来,npm install+npm run serve即可看到完整示例

Props(参数)

| 属性 | 说明 | 类型 | 默认值 | | ------------- | --------------------------------------------------------------- | ------ | ------ | | data | 必填,需要传入的卡片数据,具体格式请看下方解释 | Array | - | | colNum | 卡片排列的列数 | Number | 2 | | outsideWidth | 卡片外部需要占据的宽度(包括无内容部分) | Number | 590 | | outsideHeight | 卡片外部需要占据的高度(包括无内容部分) | Number | 380 | | insideWidth | 卡片的宽度 | Number | 560 | | insideHeight | 卡片的高度 | Number | 320 | | fontSize | 默认根节点font-size,浏览器根节点fongSize发送改变,重新计算宽高 | Number | 16 |

data格式示例:

卡片的内容根据data数据生成或自定义

<template>
    <div>
        <CardDragComponent  
        :data="cardList"
        :colNum="4"
        :cardOutsideWidth="300"
        :cardInsideWidth="260"
        :cardOutsideHeight="310"
        :cardInsideHeight="240"
        />
        <!-- 上面的属性都可自定义 -->
    </div>
</template>

<script>
export default {
    data(){
        return{
            cardList: [
                {
                    positionNum: 2,
                    name: "测试卡片2",
                    id: "card2",
                }
            ]
        }
    }
}
</script>

| 属性 | 说明 | 类型 | 默认值 | | ------------- | ---------------------------------------------------------------------------- | ------ | ---------- | | id | 必填,设置卡片的id作为唯一识别 | String | - | | positionNum | 必填,设置卡片位置,从1开始依次递增 | Number | - | | name | 选填,设置卡片的标题名称 | String | '默认标题' | | componentData | 选填,设置卡片的内容为组件数据,如果此参数具有数据的话,则slot传入的数据失效 | 组件 | - |

Slot(插槽)

首先先介绍一下,卡片内容分为上下两部分:

  • 上部分为卡片的标题栏,并且拖拽事件只有点击上部分才触发
  • 下部分为卡片的内容

两个部分都是可以进行自定义内容及样式的。若不添加的自定义内容的话,标题栏和内容都是默认背景为白色,显示data中的name。若添加了自定义内容则背景需要自己设置。

标题栏插槽

<CardDragComponent :data="cardList" >
  <!-- 在组件中间插入template并设置 v-slot:header="slotProps"
       header为标题栏的插槽名字,在里面的内容会渲染到你每一个卡片标题栏上
       slotProps为从子组件返回的数据,及data数组里面的每一个对象数据-->
  <template v-slot:header="slotProps">
    <!-- 自定义内容 -->
    <div class="topMenuBox" >
      <div class="menuTitle" v-if="slotProps.item.name">{{slotProps.item.name}}</div>
      <div class="menuTitle" v-else> 默认标题 </div>
    </div>
  </template>
</CardDragComponent>

内容插槽

<CardDragComponent :data="cardList">
  <!-- 与标题栏插槽一致,但需要注意v-slot:content-->
  <template v-slot:content="slotProps">
    <div class="insideData">
      {{slotProps.item.name}}
    </div>
  </template>
</CardDragComponent>

你也可以

<CardDragComponent :data="cardList">
  <!-- 与标题栏插槽一致,但需要注意v-slot:content-->
  <template v-slot:content="slotProps">
     <component :is="slotProps.item.OtherData"></component>
     <!--这里用到的是vue的动态组件功能动态渲染组件,可传入更多属性至子组件 -->
  </template>
</CardDragComponent>

//省略部分代码,加载你的组件
import exampleChild1 from "./childComponent/exampleChild1"

cardList: [
    {
      positionNum: 1,
      name: "演示卡片1",
      id: "card1",
      OtherData:exampleChild1  
      //OtherData这个是你自己定义的属性,注意不可与componentData属性名字重复 
    }
]

关于内容我做了另外一个判断,你可以将需要的组件放在data的componentData属性里面,内容会自动读取componentData的数据。当然你直接都使用slot就可以忽略这个属性。

import exampleChild1 from "./childComponent/exampleChild1"
//省略部分代码
cardList: [
    {
      positionNum: 1,
      name: "演示卡片1",
      id: "card1",
      componentData:exampleChild1   //直接设置即可使用 
    }
]
//使用componnetData属性传入的组件,可使用Props获取到单个卡片数据
//在子组件中使用props即可使用
props:{
    itemData:{
      type:Object
    }
}

渲染优先级:data的componentData > slot > 默认内容

Events(事件)

startDrag

作用: 在点击卡片顶部标题栏的时候,触发此函数

参数: startDrag(event,id)

第一个参数event,是点击事件的原生event 第二个参数id,是选中的卡片的id

swicthPosition

作用: 在拖动一个卡片到另外一个卡片的位置的时候,触发此事件

参数: swicthPosition(oldPositon,newPositon,originItem)

第一个参数oldPositon,是卡片原来的位置号码 第二个参数newPositon,是卡片需要交换的位置号码 第三个参数originItem,是卡片交换完成后的数据

finishDrag

作用: 拖拽完成松开鼠标后,触发此事件

参数: swicthPosition(oldPositon,newPositon,originItem)

第一个参数oldPositon,是卡片原来的位置号码 第二个参数newPositon,是卡片需要交换的位置号码 第三个参数originItem,是卡片交换完成后的数据

考虑修复的问题

1.data的positionNum出现空缺则会报错,必须从1依次递增。但好像这种场景也不常用,考虑修复ing。

未来计划

  • [ ] 如果有需要的话我再封装个react版本
  • [ ] 修改其他需要的参数和进行扩展

觉得这个系列有点意思的话,点个星星支持一下呗!