在基于nuxt的移动端页面中引用mint UI的popup组件之父子组件传值
最近在做移动端的wap页面,考虑到要做SEO,所以选定了nuxt+vue+mint ui。
有一个需求是这样的,点击头部菜单栏,出现一个气泡,点击返回首页。

1 <template>
2 <div>
3 <mt-header :title="title">
4 <a @click="$router.go(-1)" slot="left">
5 <mt-button icon="back" v-if="headerType == 'back'">返回</mt-button>
6 <mt-button @click="handleClose" v-if="headerType == 'close'">关闭</mt-button>
7 </a>
8 <mt-button icon="more" slot="right" v-if="headerType == 'more'" @click="TogglePopupMore"></mt-button>
9 <mt-button slot="right" v-if="headerType == 'mRight'">{{stringRight}}</mt-button>
10 <mt-button slot="right" v-if="headerType == 'setting'">
11 <div>
12 <i class="icon iconfont icon-31shezhi"></i>
13 </div>
14 </mt-button>
15 </mt-header>
16 <v-indexPopup v-model="tab"></v-indexPopup>
17 </div>
18 </template>
第8行TogglePopupMore这个方法会切换popupMoreTrigger的true和false,进而控制popup的显示和隐藏,第16行就是引入的气泡这个组件。组件代码如下:
<template>
<div class="main">
<mt-popup
class="show-more-popup"
v-model="popupMoreTrigger"
popup-transition="popup-fade">
<div class="show-more-popup-item">
<nuxt-link to="/">首页</nuxt-link>
</div>
</mt-popup>
</div>
</template>
关于popup的官方文档截图如下:

划重点:popupVisible是通过v-model绑定的,这个神操作直接导致了后面的一系列事故,当然也促成了这篇博客的诞生...插一句,新版API已经不再使用这种方式了,而是通过:visible.sync="popupVisible"绑定,也许作者大大也意识到这么做的不妥了吧。新版中文文档地址:http://mint-ui.github.io/docs/#/zh-cn2。于是乎问题如约而至:

这里在beforeMount这个钩子函数中分别打印了popupMoreTrigger和popupMoreTrigger2,但是发现这两个值并不像等。我又监听popupMoreTrigger的值,发现点击菜单栏的右侧按钮时,popupMoreTrigger的值已经改变了,并且也正确地传到了子组件中,只是popupMoreTrigger2没有跟着一起变,所以气泡不能显示出来。既然在data中重新声明不可以,我就放在计算属性中在试试呗~

然而...报错提示:Property or method "showPopup" is not defined on the instance but referenced during render.直接在props中使用也是不可以的,这是由vue自身的单向数据流产生的:(防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解)
报错内容为:Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "popupMoreTrigger"。
导致这些问题的根源就在于popup的显隐性字段是通过v-model绑定的,这本身是双向绑定的,而vue.js的机制又不允许这么做。用啥不好非用个v-model,看在新版api已经改了的份上,我就原谅你吧。后来朋友说可以尝试使用对象来传值,这个可以用双向绑定。一通修改之后代码如下:
父组件data部分:
data () {
return {
tab:{
popupMoreTrigger: false,
}
};
},
父组件methods部分:
methods: {
TogglePopupMore(){
this.tab.popupMoreTrigger = !this.tab.popupMoreTrigger;
},
}
父组件调用子组件部分:(此时传过去的tab是一个对象哦)
<v-indexPopup v-model="tab"></v-indexPopup>
子组件代码如下:
<template>
<div class="main">
<mt-popup
class="show-more-popup"
v-model="value.popupMoreTrigger"
popup-transition="popup-fade">
<div class="show-more-popup-item">
<nuxt-link to="/">首页</nuxt-link>
</div>
</mt-popup>
</div>
</template> <script type='text/ecmascript-6'>
import { Loadmore } from 'mint-ui'; export default {
data () {
return { };
},
props: {
value: {
type: Object,
default: {}
} },
}
</script>
<style scoped>
.show-more-popup{
width: auto;
border-radius: 6px;
padding: 5px 15px;
top: 50px;
bottom: auto;
right: 0;
left: auto;
text-align: center;
-webkit-transform: none;
transform: none;
}
.show-more-popup:before{
display: inline-block;
width: 0;
height: 0;
border: solid transparent;
border-width: 10px;
border-bottom-color: #fff;
content: "";
position: absolute;
top: -20px;
right: 10px;
}
.show-more-popup-item{
color: #333;
}
</style>
主要区别就是把布尔值的popupMoreTrigger改成了对象。
四五月份的大事是跳槽换了工作,这是一个新的开始。
六七月份的大事是开始维护博客,这是一个好的开始。anyway,加油干吧。
在基于nuxt的移动端页面中引用mint UI的popup组件之父子组件传值的更多相关文章
- nodejs之获取客户端真实的ip地址+动态页面中引用静态路径下的文件及图片等内容
1.nodejs获取客户端真实的IP地址: 在一般的管理网站中,尝尝会需要将用户的一些操作记录下来,并记住是哪个用户进行操作的,这时需要用户的ip地址,但是往往当这些应用部署在服务器上后,都使用了ng ...
- 在一个jsp页面中引用另一个jsp文件的路径的问题
为了提高代码的重用性,经常需要在一个jsp页面中引用另一个jsp文件的代码.关于引用时的路径的问题.下面只介绍动态引用的,我觉得静态引用的应该也一样. 相对路径: 一.在同一个文件夹下,a.jsp中引 ...
- 简述在Vue脚手架中,组件以及父子组件(非父子组件)之间的传值
1.组件的定义 组成: template:包裹HTML模板片段(反映了数据与最终呈现给用户视图之间的映射关系) 只支持单个template标签: 支持lang配置多种模板语法: script:配置Vu ...
- 记 移动端页面中莫名其妙的渲染BUG
问题描述: 在一个很简单的测试页面中 简单的两块布局,上下两块均没有单独设置字体大小,都用body继承的大小,即40px.我们现在给第一个块.fl 加上浮动 float:left; 另外一个块处于正 ...
- jsp页面中引用其他页面的方法
初看这个标题....大家的感觉一定是好2啊.....博主一定要说jsp的动态引用(jsp:include)和静态引用(@include)了.介绍这两者区别的文章已经烂大街了..一搜一大把..博主竟然还 ...
- web.config中namespace的配置(针对页面中引用)
1,在页面中使用强类型时: @model GZUAboutModel @using Nop.Admin.Models//命名空间(注意以下) 2,可以将命名空间提到web.config配置文件中去,此 ...
- 九、React中的组件、父子组件、React props父组件给子组件传值、子组件给父组件传值、父组件中通过refs获取子组件属性和方法
一.概述 React中的组件: 解决html 标签构建应用的不足. 使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入. [父子组件]:组件的相互调用中,我们把调用者称为父 ...
- Vue--vue中的组件、组件绑定事件和数据、私有组件、子组件,父子组件参数互传
一.公有组件以及组件的使用和特点 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- javascript小实例,移动端页面中的拖拽
上文说到,想将移动端的拖拽说一说,那现在趁有时间,就将这个福利文带来了,哈哈! 在我还不知道怎么做移动端的手势操作的时候,我觉得这TM实在是太难了,这是多么高深的学问啊,手势操作耶,上滑下滑左滑右滑的 ...
- nuxt.js服务端渲染中less的配置和使用
第一步:npm 安装 less 和 less-loader ,文件根目录下安装,指令如下 npm install less less-loader --save-dev 第二步:直接在组件中使用 &l ...
随机推荐
- 修改百分浏览器(centbrowser)、谷歌和火狐浏览器默认字体的方法
1,百分浏览器(centbrowser) 在浏览器的安装位置D:\Program Files\Cent Browser\User Data编辑文件custome.css,如果没有此文件可新建一个,内容 ...
- You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well 错误
我打开项目报错是这样的 pom.xml jdk配置什么的都是好的 但是还是报错 解决错误 : 1.打开你eclipse的根目录,找到eclipse.ini 这个文件夹打开 2.打开是这个样子 ...
- 《MySQL是怎样运行的》第一章小结
- AI智能问答助手 AI智能批量文章生成器 网站优化SEO批量内容生成工具 原创文章生成软件
<AI智能问答助手> 软件基于当下热门的OpenAI的ChatGPT技术,导入问题列表就可以批量生成对应的内容,内容质量高.原创度高.适合对内容生成需求量大的场景,如网站优化.广告文案 ...
- 如何通过C#/VB.NET从PowerPoint文档中提取图片
PowerPoint是用于制作幻灯片(演示文稿)的应用软件,每张幻灯片中都可以包含文字.图形.图形.表格.声音和影像等多种信息.有时候我们发现在PPT里面有一些精美的图片,或者其他原因想要把PPT里面 ...
- 11.4 显示窗口(harib08d)11.5 小实验(hearib08e) 11.6 高速计数器(harib08f)
11.4 显示窗口(harib08d) 书P206 11.5 小实验(hearib08e) 书P208 11.6 高速计数器(harib08f) 书P209
- 10.4 提高叠加处理速度(2) (harib07d)
ps:能力有限,若有错误及纰漏欢迎指正.交流 sheet_refreshsub void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, ...
- 【读书笔记】组合计数-Tilings-引言部分
Tilings-引言部分 目录 一些形式化定义 各种各样的Tilings例子 Example 9.1.1 Example 9.1.2 Example 9.1.3 Thurston and Lagari ...
- java注解与反射--3
java注解与反射--3 类的加载与ClassLoader java内存 堆 存放new的对象和数组 可以被所有的线程共享,不会存放别的对象引用 栈 存放基本变量类型 引用对象的变量 方法区 可以被所 ...
- Json和对象之间的转换
JSON是一种字符: json转对象: var str = '{"name":"admin","age":16,"sex" ...