Open fangmd opened 3 years ago
官方文档解释:当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。 这种方式只适用于列表渲染不依赖子组件状态,或临时 DOM 状态变化。
如何避免: 添加 key
this.$forceUpdate()
使用场景:
<div :key="mKey">
mKey++
//遮罩层,绑定关闭方法
<div class="shade" v-show="submenu.show" @touchstart="closeSubmenu($event)"></div>
//绿色块,zindex:1
<div class="submenu" :style="submenu.style" v-show="submenu.show" ref="submenu" >
<span v-for="item in submenu.list" >{{item}}</span>
</div>
用一个遮罩层完美的解决了这个问题,并且不需要判断是否点击自身。遮罩层和绿色块不需要嵌套。 遮罩层,fixed定位,宽高100%。绿色块根据父元素position定位,设置一个z-index为1就好。
层级关系:绿色块>遮罩层>列表页面.
相对视图窗口:this.$refs.goodItem.$el.getBoundingClientRect().top
window.innerHeight
import { ref, onMounted, onUnmounted } from '@vue/composition-api'
/**
* 页面刷新/退出拦截
*/
export const quitBlock = () => {
const block = ref(false)
const setBlock = value => {
block.value = value
}
const beforeunload = e => {
if (!block.value) {
return
}
const confirmationMessage = '你确定离开此页面吗?'
;(e || window.event).returnValue = confirmationMessage
return confirmationMessage
}
// lifecycle hooks
onMounted(() => {
window.addEventListener('beforeunload', beforeunload)
})
onUnmounted(() => {
window.removeEventListener('beforeunload', beforeunload)
})
return {
setBlock
}
}
import { Loading } from 'element-ui'
let loading = null
/**
* 显示 loading
*/
export const showLoading = () => {
if (loading) {
loading.close()
}
loading = Loading.service({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.2)'
})
}
/**
* 隐藏loading
*/
export const hideLoading = () => {
loading.close()
}
/* 全局黑白 */
html {
filter: grayscale(100%);
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
-webkit-filter: grayscale(1);
}
// 隐藏 gutter 占位 start
::v-deep .el-table__body-wrapper {
&::-webkit-scrollbar {
// 整个滚动条
width: 0; // 纵向滚动条的宽度
background: rgba(213, 215, 220, 0.3);
border: none;
}
&::-webkit-scrollbar-track {
// 滚动条轨道
border: none;
}
}
::v-deep .el-table th.gutter {
display: none;
width: 0;
}
::v-deep .el-table colgroup col[name='gutter'] {
display: none;
width: 0;
}
::v-deep .el-table__body {
width: 100% !important;
}
// 隐藏 gutter 占位 end
获取子元素高度
contentWrapper.value.firstChild.clientHeight
修改 style:
contentWrapper.value.style.height
Vue 样式绑定
Vue 动态样式
函数返回样式
变量
绑定对象