当前位置: 首页 > news >正文

Vue弹窗用也可以直接调用Js方法了

问题描述

在前端开发中,弹窗开发是一个不可避免的场景。然而,按照正常的逻辑,通过在template模板中先引用组件,然后通过v-if指令控制显隐,进而达到弹窗的效果。然而,这种方法却有一个严重的缺陷,即有较强的代码入侵。如果当前组件存在多个不同的弹框,那么会定义相等数量的显隐变量,给代码维护增加了心智负担。
细心的人会发现,在使用element-ui等前端框架中,我们可以直接调用方法,弹框就会出现,接下来执行不同的逻辑。那么我们的弹框能否可以借鉴一下呢?

解决思路

我们知道,vue的component的本质是js对象,我们可以通过javascript创建组将实例,并渲染到页面上。下面我就基于vue2vue3两种版本实现一个地图选点的弹窗式组件。

vue2的封装方式

封装地图组件

<template><div class="main"><div id="container" class="map"></div><div class="tools"><div class="ok-button" @click="submit">确定</div><div class="ok-button" @click="exits">取消</div></div><div class="info"><span>经度:{{ resultPoint[0] }};维度:{{ resultPoint[1] }}</span></div></div>
</template><script>
import "ol/ol.css";
import { Map, View, control } from "ol";
import TileLayer from "ol/layer/Tile";
import XYZ from "ol/source/XYZ";
import TileGrid from "ol/tilegrid/TileGrid";
import { defaults as defaultControls } from "ol/control";
import Position from "@/assets/position.png";
import Style from "ol/style/Style";
import Icon from "ol/style/Icon";
import VectorSource from "ol/source/Vector";
import VectorLayer from "ol/layer/Vector";
import Feature from "ol/Feature";
import Point from "ol/geom/Point";
import { tranMktTo84, trans84ToMkt } from "@/utils/protransform";export default {props: {lon: {type: Number,default: 119.407428,},lat: {type: Number,default: 33.904198,},},data() {return {resultPoint:[this.lon,this.lat],vectorFeature: null,};},mounted() {let initMkt = trans84ToMkt(this.resultPoint)let map = new Map({target: "container",layers: [],controls: defaultControls({ attribution: false, zoom: false }), // 禁用默认的控件view: new View({center: initMkt, zoom: 16,projection: "EPSG:3857",}),});const iconStyle = new Style({image: new Icon({anchor: [0.55, 1.1],src: Position,}),});let vectorFeature = new VectorSource({ features: [] });let vector = new VectorLayer({source: vectorFeature,style: iconStyle,id: "point",});this.loadGdLayer(map)let that = this;map.on("click", function (event) {// 获取点击位置的坐标,并推入 points 数组let coord = event.coordinate;that.resultPoint = tranMktTo84(coord)that.renderPoint(coord,vectorFeature)});map.addLayer(vector);this.renderPoint(initMkt,vectorFeature)this.map = map;},methods: {loadGdLayer(map){//影像map.addLayer(this.createGdLayer("6", true));//影像路网注记`map.addLayer(this.createGdLayer("8", true));},//创建高德地图图层createGdLayer(layer,visible){return new TileLayer({title: "高德地图",source: new XYZ({url: `https://webst0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=${layer}`,wrapX: false}),projection: "EPSG:3857",visible});},submit() {this.$emit("click", this.resultPoint[0], this.resultPoint[1]);},exits() {this.$emit("close");},createPointFeature(point) {return new Feature({geometry: new Point(point),name: "position",});},renderPoint(point,vectorFeature){vectorFeature.clear();vectorFeature.addFeature(this.createPointFeature(point));}},
};
</script><style lang="less" scoped>
.main {position: fixed;width: 100vw;height: 100vh;left: 0;bottom: 0;background-color: #ffffff;
}
#container {width: 100%;height: 100%;
}
.ok-button {text-align: center;line-height: 0.36rem;height: 0.36rem;width: 0.7rem;background: #4b74ff;border-radius: 15%;font-size: 0.2rem;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #ffffff;&:hover {cursor: pointer;}
}
.info {position: absolute;left: 0.1rem;bottom: 0.2rem;background-color: rgba(150, 150, 150, 0.1);font-size: 0.2rem;
}
.tools {position: absolute;right: 0.1rem;top: 0.1rem;display: flex;justify-content: space-evenly;width: 1.5rem;
}
</style>

这个组件有两个地方需要注意以下:

  • 定义了属性,便于被调用着传递。这里主要传递显示坐标,如果不传递,则显示默认坐标。
  • 对于submitclose方法,通过this.$emit调用父类的方法,这里的方法名分别为clickclose。记主这两个方法名。

封装组件方法

这也是封装的核心

import GetPosition from "@/components/GetPosition.vue";
import { getPoint } from "@/utils/calDistance";
import Vue from "vue";
function createDiv(uuid) {const div = document.createElement("div");div.style.position = "absolute";div.style.zIndex = "1000";div.style.backgroundColor = "rbg(255,255,255)"div.id = uuid;document.body.appendChild(div);const childDiv = document.createElement("div");div.appendChild(childDiv);return childDiv;
}export const selectPoint= (lon,lat,onClick)=>{let uuid = Math.random().toString(36).substring(2);const div = createDiv(uuid);const app = new Vue({render: (h) =>h(GetPosition, {props: { lon: lon, lat: lat },on: {click(lon, lat) {app.$destroy();let div = document.getElementById(uuid);div.remove();onClick(lon, lat);},close() {app.$destroy();let div = document.getElementById(uuid);div.remove();},},}),}).$mount(div);
}
  • createDiv创建一个渲染的组件,这个组件要作为body的子组件,至于样式要根据设计情况而定。此组件要设置id,这里使用随机ID,便于document.getElementById(uuid)查询。
  • selectPoint是其他组件调用的核心方法。此方面有传入参数和一个回调函数onClick
    • 通过createDiv方法创建vue过载的节点。
    • 创建vue实例,并定义render函数。
    • 回调父组件的emit方法要定义到on中。
    • 在点击确认或者取消按钮,弹窗消失的时候,需要将vue实例销毁app.$destroy(),并将div移除。

调用方式

 clickMap(item) {let lon = this.longitude || 117.633757let lat = this.latitude || 29.558668selectPointInfo(lon,lat,(lon,lat)=>{this.longitude = lonthis.latitude = latitem.model = `${lon},${lat}`})
}

vue3的封装方式

vue3vue2的不同之处在于创建vue实例上。所以这里只展示调用方法的实例:

export function selectPointInfo(pointInfo:PointInfo,onClick:(item:PointInfo)=>void){const div = createDiv()const app = createApp(SelectPointVue,{pointInfo,onClick(item:PointInfo){app.unmount();div.remove()onClick(item)},onClose(){app.unmount();div.remove()}})app.mount(div)
}

这里需要注意的地方如下:

  • props直接传递一个对象即可。
  • emit的方法名前要追加on,方法名首字母要大写。例如,在vue组件中有代码this.$emit("click", lon,lat);,那么此处方法应该定义为onClick

vue2和vue3的这两段代码出于不同的项目,所以vue3的核心代码不能直接使用上面的组件。核心逻辑已经列处,需要按需调整。

相关文章:

Vue弹窗用也可以直接调用Js方法了

问题描述 在前端开发中&#xff0c;弹窗开发是一个不可避免的场景。然而&#xff0c;按照正常的逻辑&#xff0c;通过在template模板中先引用组件&#xff0c;然后通过v-if指令控制显隐&#xff0c;进而达到弹窗的效果。然而&#xff0c;这种方法却有一个严重的缺陷&#xff0…...

【c语言测试】

1. C语言中&#xff0c;逻辑“真”等价于&#xff08; &#xff09; 题目分析&#xff1a; “逻辑真”在C语言中通常指的是非零数。 A. 大于零的数B. 大于零的整数C. 非零的数 (正确答案)D. 非零的整数 正确答案&#xff1a;C 2. 若定义了数组 int a[3][4];&#xff0c;则对…...

一种将树莓派打造为游戏机的方法——Lakka

什么是Lakka&#xff1f; Lakka是一款Linux发行版&#xff0c;轻量级的&#xff0c;可将小型计算机转变为一台复古游戏机。 图1-Lakka官网&#xff0c;见参考链接[1] Lakka是RetroArch和libretro生态系统下的官方操作系统&#xff0c;前者RetroArch是模拟器、游戏引擎和媒体播…...

如何在 MySQL 中创建一个完整的数据库备份?

在MySQL数据库中创建一个完整的数据库备份通常不是通过编程语言直接实现的&#xff0c;而是借助MySQL提供的命令行工具mysqldump来完成。 作为Java开发者&#xff0c;我们可以编写脚本来调用这些工具&#xff0c;从而实现自动化备份。 下面我们将详细介绍如何使用Java来调度m…...

京准电钟HR-901GB双GPS北斗卫星时钟服务器

京准电钟HR-901GB双GPS北斗卫星时钟服务器 京准电钟HR-901GB双GPS北斗卫星时钟服务器 作为国家电力系统最重要的设备之一,卫星时间同步装置随着电力行业的发展不断有了新的要求,从单纯的具备时间数据输出能力,发展到装置状态信息上送、对用时设备的对时质量进行监测,确保站点内…...

uniapp使用websocket

后端java websoket中的 onOpen 中。依赖注入为null 引用&#xff1a;https://blog.csdn.net/qq_63431773/article/details/132389555 https://blog.csdn.net/weixin_43961117/article/details/123989515 https://cloud.tencent.com/developer/article/2107954 https://blog.c…...

基于Pycharm和Django模型技术的数据迁移

1.配置数据库 在trip_server/settings.py中修改配置&#xff1a; 其格式可访问官网&#xff1a;Settings | Django documentation | Django 1.1 配置数据库 文件地址&#xff1a;trip_server/settings.py 配置前需要创建&#xff08;NaviCat&#xff09;个人数据库 "…...

乐尚代驾-----Day10(订单三)

hi UU 们&#xff01;&#xff01;&#xff01;我又来跟辛辣&#xff01;感谢你们的观看&#xff0c;话不多说&#xff01;~ 司机到达代驾终点&#xff0c;代驾结束了。结束代驾之后&#xff0c; – 获取额外费用&#xff08;高速费、停车费等&#xff09; – 计算订单实际里程…...

105. 聚光源SpotLight

入门部分给大家介绍过平行光DirectionalLight、点光源PointLight、环境光AmbientLight,下面给大家介绍一个新的光源对象&#xff0c;也就是聚光源SpotLight。 创建聚光源SpotLight 聚光源可以认为是一个沿着特定方会逐渐发散的光源&#xff0c;照射范围在三维空间中构成一个圆…...

系统接口权限拦截器,获取用户信息存储

UserInfo 类 这是一个表示用户信息的 Java 类&#xff0c;使用了 Lombok 注解来简化代码编写。 import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;import java.io.Serializable; import java.util.List;Data ToString EqualsAndHashCode public…...

Chromium HTML5 新的 Input 类型color 对应c++

一、Input 类型: color color 类型用在input字段主要用于选取颜色&#xff0c;如下所示&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body&…...

问:SQL中的通用函数及用法?

SQL函数是在SQL语句中使用的预定义的计算工具&#xff0c;可以对一列数据进行操作并返回一个单一的结果。这些函数大致可以分为两类&#xff1a;Aggregate函数和Scalar函数。Aggregate函数对一组值执行计算&#xff0c;并返回单个值&#xff0c;如求和、平均值、最大值和最小值…...

.NET Core WebApi第6讲:WebApi的前端怎么派人去拿数据?(区别MVC)

一、前端界面小基础 head&#xff1a;引入CSS, 引入JS是写在head里面。 body&#xff1a;眼睛肉眼能看到的用户展示的界面是写在body里面。 二、前端怎么派人去拿数据&#xff1f; 1、MVC&#xff1a;前后端不分离&#xff0c;MVC相比WebApi只是多了一个views的文件夹 &am…...

Chromium HTML5 新的 Input 类型date 对应c++

一、Input 类型: date date 类型允许你从一个日期选择器选择一个日期。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…...

ZooKeeper的应用场景:深入探讨分布式系统中的多样化应用

Apache ZooKeeper 是一个开源的分布式协调服务&#xff0c;专为确保分布式系统中的高可用性和一致性而设计。在现代分布式应用程序中&#xff0c;协调、同步和管理是实现高效和可靠服务的关键部分&#xff0c;而 ZooKeeper 通过提供这些基础功能而成为许多分布式系统不可或缺的…...

【Vue3】第四篇

Vue3学习第四篇 01. 插槽Slots02. 插槽Slots&#xff08;续集&#xff09;03. 插槽Slots&#xff08;再续集&#xff09;04. 组件生命周期05. 生命周期应用06. 动态组件07. 组件保持存活08. 异步组件09. 依赖注入10. Vue应用 01. 插槽Slots 模板内容&#xff1a;html结构&#…...

Chromium HTML5 新的 Input 类型tel对应c++

一、Input 类型: tel <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php">电话号码: <input type"tel" name…...

JVM—类加载器、双亲委派机制

目录 什么是类加载器 类加载器的分类 Bootstrap启动类加载器 通过启动类加载器加载用户jar包 Extension扩展类加载器和Application应用程序类加载器 通过扩展类加载器加载用户jar包 双亲委派机制 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加…...

笔试题 求空格分割的英文句子中,最大单词长度。

求空格分割的英文句子中&#xff0c;最大单词长度。例如:“this is a word”&#xff0c;最大单词长度为4。要求:不能用 split 函数对字符串进行切分&#xff0c;算法复杂度为o(n) public class MaxWordLength { public static int maxWordLength(String sentence) { if (se…...

【笔记】大模型长度外推技术 NTK-Aware Scaled RoPE

NTK-Aware Scaled RoPE 正弦编码(Sinusoidal)旋转位置编码RoPE编码步骤&#xff1a;旋转位置编码的优势 NTK-Aware Scaled RoPE直接外推线性内插进制转换高频外推、低频内插的理解位置编码 总结参考&#xff1a; 长度外推技术是自然语言处理&#xff08;NLP&#xff09;领域中&…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...