# AAA-vueCesiumCustomMessageBox **Repository Path**: wwwKit/aaa-vue-cesium-custom-message-box ## Basic Information - **Project Name**: AAA-vueCesiumCustomMessageBox - **Description**: 在vue里使用cesium,并自定义弹框样式 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-25 - **Last Updated**: 2021-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AAA-vueCesiumCustomMessageBox > ## 弹框组件 ```html
``` ```JavaScript props:{ //你传入的要展示的东西 info:Object, //双向绑定中间值,因为子组件不能直接修改props值 middleShow:{ type:Boolean, default:false } } setup(){ const show = ref(false); //这里很奇怪,我用watcheEffect自己写的时候,没有问题.项目里用watchEffect就监听不到props的改变 watch( () => props.middleShow, (newVal, oldVal) => { show.value = props.middleShow; //在监听到父组件要求显示,要去重新计算窗口值 showBox(); } ); //卡片自己控制的关闭 function closeClick() { show.value = false; //同时通知父组件更新 emit("update:middleShow", false); } //css绑定绝对定位用 let bottom = ref(0); let left = ref(0); let viewer = null let canvasHeight=0 let windowPosition={} function showBox() { viewer = store.state.viewer; //这里的事件是实时更新的 viewer.scene.postRender.addEventListener(() => { canvasHeight = viewer.scene.canvas.height; windowPosition = new Cesium.Cartesian2(); Cesium.SceneTransforms.wgs84ToWindowCoordinates( viewer.scene, props.position, windowPosition ); bottom.value = canvasHeight - windowPosition.y + 250; left.value = windowPosition.x - 175; }); } return { closeClick, bottom, left, show }; } ``` > ## 父组件 ```html ``` ```JavaScript setup() { const monitors = ref([ { id: "1111", show: false, name: "北京西路与北京路交叉口", ip: "42.23.33.23", type: "固定枪机", state: "在线", position: { x: -1573842.0351617213, y: 5327906.719968858, z: 3122733.541764769, }, }, { id: "2222", show: false, name: "阿化修理店门口", ip: "42.23.33.22", type: "固定枪机", state: "在线", position: { x: -1573743.4786981696, y: 5327995.971373521, z: 3122666.986937621, }, }, ]); //一般业务是,点击实体,弹出弹框的 function initWindow() { //先根据数据生成cesium实体 monitors.value.forEach((item) => { store.state.viewer.entities.add({ position: item.position, info: item,//在cesium实体对象上绑定info信息 billboard: { image: "static/img/icon_jiankong.png", scaleByDistance: new Cesium.NearFarScalar(500, 1, 1200, 0.8), distanceDisplayCondition: new Cesium.DistanceDisplayCondition( 0, 10000 ), verticalOrigin: Cesium.VerticalOrigin.BOTTOM, }, }); }); //监听实体点击事件 store.state.viewer.selectedEntityChanged.addEventListener((e) => { //获取实体绑定的id let id = e.info.id; //对应找到数组中的响应式对象,修改双向绑定的显示属性值 monitors.value.forEach((element) => { if (element.id == id) { element.show = true; } }); }); } return { monitors, initWindow }; }, ```