//父组件使用
<right-menu :visible.sync="visible" :list="list"></right-menu>
.sync修饰符
在vue中说到数据绑定的时候第一时间想到的就是v-model,但是因为每个组件只能绑定一个v-model,如果其他props也要实现双向绑定的效果该怎么办呢? 简单的方法是子组件向父组件发送一个事件,父组件监听该事件,然后更新props,.sync就是这种方法的简化。
sync修饰符的作用
1.当我们需要在子组件中改变props接收的值并且需要同步到父组件中的时候需要用到.sync修饰符。
2.如果一个组件的多个props都要实现双向绑定,只需要每个props加sync修饰符。
//子组件right-menu
<template>
<div v-if="visible">
<el-menu class="contextmenu" :style="style" @click="handleClick">
<el-menu-item v-for="item in list" :key="item.key">
<span>{{ item.text }}</span>
</el-menu-item>
</el-menu>
</div>
</template>
<script>
export default {
name: "ContextMenu",
props: {
visible: {
type: Boolean,
default: false,
},
list: {
type: Array,
required: true,
default: () => [],
},
},
data() {
return {
left: 0,
top: 0,
target: null,
};
},
computed: {
style() {
return {
left: this.left + "px",
top: this.top + "px",
};
},
},
created() {
const clickHandler = () => this.closeMenu();
const contextMenuHandler = (e) => {
e.preventDefault();
this.setPosition(e);
};
window.addEventListener("click", clickHandler);
window.addEventListener("contextmenu", contextMenuHandler);
this.$emit("hook:beforeDestroy", () => {
window.removeEventListener("click", clickHandler);
window.removeEventListener("contextmenu", contextMenuHandler);
});
},
methods: {
closeMenu() {
this.$emit("update:visible", false);
},
setPosition(e) {
const menu = document.querySelector(".contextmenu");
const menuHeight = menu.offsetHeight;
const windowHeight = window.innerHeight;
this.left = e.clientX;
if (e.clientY + menuHeight > windowHeight) {
const top = e.clientY - menuHeight;
if (top < 0) {
this.top = 0;
} else {
this.top = top;
}
} else {
this.top = e.clientY;
}
this.target = e.target;
},
handleClick({ key }) {
const _component = this.list.filter((item) => item.key === key)[0]
.component;
if (_component) {
this.$emit("contextMenuClick", _component, key);
}
this.closeMenu();
},
},
};
</script>
<style lang="scss" scoped>
.contextmenu {
position: fixed;
z-index: 1000;
border-radius: 4px;
border: 1px lightgrey solid;
box-shadow: 4px 4px 10px lightgrey !important;
}
</style>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通