vue实现多级弹窗
webpack + vue 实现 弹窗功能
对于刚入门webpack + vue 不久的新人来说,这技术,确实有些不太友好,相比较于直接操纵dom元素的jQuery,直接操纵数据的 vue 在webpack框架下实现多级弹窗的效果,要麻烦很多。
需求背景:点击地图撒点,会有一个回调函数返回数据,然后需要根据返回的数据打开弹窗,显示详细内容。
一开始我是设置了一些全局的变量和方法,通过全局方法获得回调函数返回的数据,然后再将此数据赋值给全局变量,以供所有页面使用。
但是这里有两个问题:
1.全局变量无法在Mustache(双花括号)和 vue指令 里面使用,即:
v-if="popCon.show" //控制弹窗显示和隐藏 popCon为popupController的缩写,此变量用来控制弹窗的显示隐藏
{{globalResult.name}} //使用回调函数返回的数据在弹窗中显示 globalResult为回调函数返回的数据,在页面中展示
2.即使通过在data中使用 中间变量 来赋值使用,但是当全局变量的更新时,本地变量无法同步
data: {
localCon: popCon,
localResult: globalResult
}
v-if="localCon.show"
{{localCon.name}} //这种情况,当 popCon 和 globalResult 发生变化时,localCon 和 localResult 无法同步
在无法绕开这两个问题的情况下,使用全局变量这种方式已经无法实现当前的需求。
所以,这里推荐使用 vuex 的全局变量来实现效果。
========================================
解决方案:
首先,在 vuex 的state中设置两个全局变量
const state = {
popCon: {
controller1: false, //第一个弹窗显示控制,可以通过给弹窗的 X ,添加点击事件,赋值,来关闭窗口
controller2: false //第二个弹窗显示控制
},
globalResult: { //此变量为回调函数返回的数据
name: "名称"
}
}
然后,在相应的弹窗组件中使用这两个全局变量来达到效果
v-if="$store.state.popCon.controller1" //显示效果,控制组件的显示效果,这里就不写组件的代码了
{{$store.state.globalResult.name}} //数据效果
现在这里都是默认的数据,然后需要在回调函数中给全局变量赋值
一般来说,我们都是直接给变量赋值,也就是 $store.state.globalResult = result
但是 vue 官方不推荐直接修改state的属性
推荐我们使用mutations来修改state的属性
function callback (result) {
vueObj.$store.commit('globalResult',result) //这里就不解释 vuex 的 mutations的写法了
vueObj.$store.commit('popCon',true) //设置弹窗显示为 true,打开弹窗 这里的 popCon 是 mutations里面的一个方法名为 popCon 的函数,上一行 globalResult 同理
}
到这里,就已经实现了 通过vuex 来达到打开弹窗详情界面的功能。
通过点击某个地方,获取数据,然后打开详情页面,显示数据内容,点击关闭按钮关闭弹窗
如果需要实现多级详情弹窗,可以在弹窗界面中嵌套使用。
vue实现多级弹窗的更多相关文章
- 从零开始徒手撸一个vue的toast弹窗组件
相信普通的vue组件大家都会写,定义 -> 引入 -> 注册 -> 使用,行云流水,一气呵成,但是如果我们今天是要自定义一个弹窗组件呢? 首先,我们来分析一下弹窗组件的特性(需求): ...
- vue 阻止冒泡弹窗小案例( 知识点:@click.stop=''")
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue中前端弹窗队列展示
在前端写一个弹窗可能很简单,那如果同时有多个弹窗呢 这样的话就要考虑弹窗的展示问题,肯定是不能叠加在一起的,这时候就要通过队列(先进先出)来展示 思路就是根据队列来实现,至于具体的实现方式,可以在项目 ...
- Vue自定义Popup弹窗组件|vue仿ios、微信弹窗|vue右键弹层
基于vue.js构建的轻量级Vue移动端弹出框组件Vpopup vpopup 汇聚了有赞Vant.京东NutUI等Vue组件库的Msg消息框.Popup弹层.Dialog对话框.Toast弱提示.Ac ...
- vue项目|在弹窗中引入uchart图表子组件不显示
为了解决uchart作为子组件在主组件里引用但不显示的情况,(同样适用于弹窗之中)目前有三种方法. 1-解决方式 1>如果你使用的uchart子组件是从官方拿的例子:进入到uchart子组件将o ...
- vue在多级联动时,一些情况不用watch而用onchange会更好
onchange事件在内容改变且失去焦点时触发,因此在一些多级联动需要清空次级内容的时候,用onchange就非常有用了,尤其是浏览器会提前加载数据的情况下.有篇文章可以看一下,链接. PS:路漫漫其 ...
- vue使用sweetalert2弹窗插件
1). 安装 sweetalert2 npm install sweetalert2@7.15.1 --save 2). 封装 sweetalert2 在 src 新建 plugins 文件夹,然后新 ...
- vue+vue-video-player实现弹窗播放视频
将视频播放器标签放在对话框标签中,实现弹窗 template 中 <el-dialog :visible.sync="dialogVisible" width='680px' ...
- vue 点击弹窗外框关闭弹框
https://blog.csdn.net/zjw0742/article/details/77822777 ready() { document.addEventListener('click', ...
随机推荐
- ES6入门——let和const命令
let和const命令 1.let命令 用法:类似于var,用来声明一个变量,区别是所声明的变量只在let命令所在的代码块内有效. let命令很适合用在for循环的计数器中,因为let声明的变量仅在作 ...
- Netty入门4之----如何实现长连接
前面三章介绍了Netty的一些基本用法,这一章介绍怎么使用Netty来实现一个简单的长连接demo. 关于长连接的背景知识,可以参考<如何使用Socket实现长连接> 一个简单的长 ...
- lua的面向对象实现
百度搜索一下,给出出的解决方案和学习帖子很多,可是我还是有很多的问题! (1)什么是面向对象? (2)lua中怎么实现面向对象? (3)什么样的实现既简单又能完成我的功能? (4)一定要按照c++的方 ...
- Redis 优化之 tcp-backlog
默认值 511 tcp-backlog:511 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxc ...
- 035server端并发聊天
import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): # 里面是每个客户端连接执 ...
- hdu 4825 Xor Sum(trie+贪心)
hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...
- 使用ViewPager实现Tab
一.效果演示及分析 我们直接看两幅图.如下: 上两幅图实现的效果就是: (1)手指左右滑动时,中间的布局呈现不同的效果.而且下面的按钮也会做相应的改变. (2)我们 ...
- 通俗易懂的来讲讲DOM——科普性质的DOM入门教程
DOM这个东西很重要,不过初学的时候很容易蒙,什么Document.Element.Node用官方语言来解释根本就不是人话,只能在实践中硬着头皮一点一点尝试.今天要推荐的是一篇关于DOM的博客.说是教 ...
- 【转】Android学习系列(39)--Android主题和样式之系统篇(上)
[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...
- 【CSS单位】px、em、rem
1.PX为单位 在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,他改变了浏览器的字体大小,这时 ...