弹出层的特性
1 如果初始v-modle 绑定的的值是false,则组件不会渲染
2 当v-modle绑定的值转变为true时,组件会被渲染出来
3 之后再改吧v-model的值只是用CSS进行显示和隐藏罢了
造成的问题
当在弹出层内使用其他组件时,一般绑定的属性值不会进行改变,即使传进去的值发生改变了,相关代码如下:
<van-popup v-model="showReplyComment" position="bottom" style="height: 95%">
<comment-reply
:comment="comment"
:art_id="thearticle.art_id || {}"
@click-close="showReplyComment = false"
></comment-reply>
</van-popup>
props: {
comment: {
type: Object,
required: true
},
art_id: {
type: [Number, String, Object],
required: true
}
},
data() {
return {
// 获取回复评论的请求参数
getReplyParams: {
type: 'c',
source: this.comment.art_id,
offset: undefined,
limit: undefined
},
结论,当使用props接受父组件的传值时,如果直接在data() {return {}} 内直接将值赋值给里面的属性时 source: this.comment.art_id, 只会赋值一次,当props在次改变时就不会再次赋值了,导致了页的刷新错误。
一劳永逸的解决办法
在给popup绑定v-model时直接在绑定上v-if 如下:
<van-popup v-model="showReplyComment" v-if="showReplyComment" position="bottom" style="height: 95%">
<comment-reply
:comment="comment"
:art_id="thearticle.art_id || {}"
@click-close="showReplyComment = false"
></comment-reply>
</van-popup>
或者:
<van-popup v-model="showReplyComment" position="bottom" style="height: 95%">
<comment-reply
:comment="comment"
:art_id="thearticle.art_id || {}"
@click-close="showReplyComment = false"
v-if="showReplyComment"
></comment-reply>
</van-popup>
两着在此处没有本质区别: 本质上就是展示弹出层时进行组件的重新渲染,但是如果有其他的内容的情况下,推荐第二种,不用全部重新渲染,渲染一部分就行
缺点 :
如果该组件非常的大多重组件嵌套,多种请求的情况下,该方法在网络慢的情况下会导致渲染页面巨慢,用户体验及其不好,第二种要较第一种好一些,但也是不可以接受的
麻烦一点的解决方法
利用vue的watch侦听器,进行监听,传入的comment值改变时,进行对数据的再赋值,代码:
props: {
comment: {
type: Object,
required: true
},
art_id: {
type: [Number, String, Object],
required: true
}
},
data() {
return {
// 获取回复评论的请求参数
getReplyParams: {
type: 'c',
source: '',
offset: undefined,
limit: undefined
},
// 列表配置项
list: [],
loading: false,
finished: false,
// 评论弹出层
showComment: true
}
},
computed: {},
watch: {
comment(val) {
this.list = []
this.finished = false
this.source = this.comment.art_id
}
},
可以看到这里面逃离很多的其他组件,列表list,又一层弹出层,如果在watch中不重置list,会导致新值直接push到老值后面,不重置this.finished,则导致列表一直出去无法加载的状态
优点
解决了页面加载慢的问题,大大的节省了资源
缺点
写的很麻烦,要慢慢的调试,很容易出现一些意想不到的bug
总结:
如果组件简单直接使用第一种方法,如果组件复杂考虑使用第二种,看需求