【案例】使用Vue实现标题项元素上下移动

效果图

 效果说明

每一组数据只能在对应的二级类目中进行上下移动,当点击上移图标的时候【左边的】会将当前元素与上一个元素交换位置,当点击的元素为该组的第一个元素时,将提示已经是第一项了并且不能进行移动;当点击下移图标的时候【右边的】会将当前元素与下一个元素交换位置,当点击的元素为该组的最后一个元素时,将提示已经是最后一项了并且不能进行移动。

效果实现代码

本效果需要用到 vue、vur-router、scss、element plus

第一步:创建项目

yarn create vite demo

第二步:安装所需要的依赖

yarn
yarn add vue-router
yarn add sass sass-loader
yarn add element-plus
yarn add path

第三步:配置别名@,并设置element组件的按需导入

vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],})],resolve: {alias: {'@': path.resolve(__dirname, 'src')}},
})

main.js

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router'
import 'element-plus/es/components/message/style/css'createApp(App).use(router).mount('#app')

第四步:创建Drag组件,并书写相关的逻辑代码

src/views/Drag.vue

<template><div><div v-for="obj in showList" :key="obj.id"><div class="obj">{{ obj.title }}</div><div class="item" v-for="(item, index) in obj.children" :key="item.id"><span>{{ item.title }}</span><div><imgsrc="@/assets/imgs/上移.png"alt="上移"title="上移"@click="handleMove('up', obj, index)"/><imgsrc="@/assets/imgs/下移.png"alt="下移"title="下移"@click="handleMove('dowm', obj, index)"/></div></div></div></div>
</template><script setup>
import { ref } from "vue";const list = [{id: 1,title: "课程",children: [{ id: 2, title: "课程1" },{ id: 3, title: "课程2" },{ id: 4, title: "课程3" },],},{id: 5,title: "星期",children: [{id: 6,title: "周一",},{id: 7,title: "周二",},],},
];
const showList = ref(list);const handleMove = (type, obj, index) => {let warningMessage = "";let swapIndex = -1;if (type === "up") {if (index === 0) {warningMessage = "已经是第一项了";} else {swapIndex = index - 1;}} else {if (index === obj.children.length - 1) {warningMessage = "已经是最后一项了";} else {swapIndex = index + 1;}}if (warningMessage) {ElMessage.warning(warningMessage);return;}showList.value.forEach((element) => {if (element.id === obj.id) {const temp = element.children[swapIndex];element.children[swapIndex] = element.children[index];element.children[index] = temp;}});
};
</script><style lang="scss" scoped>
.obj {margin: 20px;padding: 20px;background: #b8b6b6;
}
.item {margin: 10px 30px;padding: 10px;display: flex;justify-content: space-between;background: #f0f0f0;img {width: 20px;height: 20px;margin-right: 20px;}
}
</style>

第五步:创建路由文件

src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
const routes = [{path: '/',component: () => import('@/views/Drag.vue')}
]
// 创建路由
const router = createRouter({history: createWebHistory(),routes
})
// 导出路由
export default router

通过以上代码即可实现图片中的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702934.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode494:目标和

题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之…

JavaScript基础(七)

isNaN //用来判断一个变量是不是一个非数字 不是来判断是不是number类型&#xff0c;而是判断当前值能不能转为number类型&#xff0c;OK&#xff1f;懂了。 还有同学不明白&#xff0c;来看实例: <script> //isNaN(非数字)→true &#xff08;数字&#xff09;→fal…

动画:3dmax

动画制作流程&#xff1a;模型 -> 骨骼&#xff08;Bone/Biped&#xff09; -> 蒙皮&#xff08;Skin/Bone Pro&#xff09; -> 动画 1.基础 1.1创建bones骨骼 骨骼分为2种&#xff0c;一种是bones另一种是biped。它们的区别是用bones需要自己创建骨骼系统&#xff0…

UV:展uv

1.3dmax 选中物体 修改器列表选中“UV展开” 打开UV编辑器 断开圆圈 同理断开瓶底 展开侧面 剥离 拉直 排列 纹理盘格 用于查看排列位置 渲染UV模板 PS图片 将不要的部分填充为黑色 复制图片 删除多余 保存图片 添加材质球和位图 按M打开材质球编辑器 重置UV 将uv变为初始…

文献检索神器分享:一键筛选顶刊论文,还能免费下载全文!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 信息爆炸的时代&#xff0c;文献是根本读不完。一个关键词能搜出来几万篇&#xff0c;而且有些结论还是完全相反的&#xff0c;到底该读哪些&#xff1f; 第一步的文献筛选很重…

基于多传感器的智能小区安防系统设计与实现-设计说明书

设计摘要&#xff1a; 本设计是基于多传感器的智能小区安防系统的设计与实现。系统主要包括烟雾和温度传感器、人体红外传感器、OLED显示屏、WiFi模块和按键控制等组件。通过这些组件的协作&#xff0c;实现了火灾检测、人员监测、数据显示和远程控制等功能。 首先&#xff0…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念&#xff0c;多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景&#xff0c;可以充分利用多核处理器和系统资源&#xff0c;提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…

MySQL数据库从入门到精通(下)

对表做了修改之后&#xff0c;记得点击对应图标按钮重新执行一下。 1.创建角色表 数据库一开始就要设计好&#xff0c;轻易不要改动。一个账号下可能有多个角色&#xff0c;所以我们单独再创建另一个表role用来存储所有的角色信息。其中idrole表示角色id&#xff0c;name表示名…

网络安全法中关于网络信息的保护和监管,有哪些规定?

网络安全法作为我们数字时代的重要法律保障&#xff0c;对于网络信息的保护和监管有着明确且详细的规定。这些规定不仅体现了国家对于网络安全的重视&#xff0c;也为我们每个人在数字世界中提供了坚实的法律屏障。 首先&#xff0c;我们来看一个关于网络运营者主体责任的案例。…

【翻译】Processing系列|(四)用 Android Studio 从 0 到 1 进行 Processing 安卓开发

原文链接&#xff1a;Processing for Android Developing with Android Studio 朋友跟我说官方教程里也写了该怎么用 Android Studio 开发&#xff0c;并且亲测可行。这种方式确实能开发出结构更加清晰、额外组件更加少的程序&#xff0c;比上一篇文章中直接克隆 Processing-An…

模电·复合管放大电路_040

复合管放大电路 一、复合管1.晶体管组成的复合管及其电流放大系数2.场效应管与晶体管组成的复合管及其跨导3.复合管的组成原则 二、复合管共射放大电路三、复合管共源放大电路四、复合管共集放大电路 一、复合管 1.晶体管组成的复合管及其电流放大系数 图1.( a )和( b )所示为…

YOLOV8从环境部署(GPU版本)

一、安装&#xff43;&#xff55;&#xff44;&#xff41;和&#xff43;&#xff55;&#xff44;&#xff4e;&#xff4e; 1、安装cuda之前先打开英伟达控制面板查看自己的显卡信息 2、“帮助”—>“系统信息”—>“组件”&#xff0c;然后看第三行的信息“Nvidia …