vue3、ts 使用render函数,实现js调用、渲染组件,例:可实现全局通过js调用弹窗,request未登录拦截并弹窗显示登录等

1、首先创建一个普通的弹窗组件,放到页面中测试下是否能实现组件加载完毕后弹窗

注意: 用 transition 组件的时候,如果子元素做不同的动画,enter-active 和 leave-active 的动画时长需要与子元素动画时长最长的时间相等,不然会比较短会提前结束子元素动画,过长会导致子元素动画做完之后,蒙版产生遮挡

<script setup lang="ts">
import { onMounted, ref } from "vue";
const show = ref<boolean>(false);

const props = defineProps<{
  removeNode: Function;
}>();

onMounted(() => {
  // 页面挂在后开始做动画
  show.value = true;
});
const close = () => {
  if (show.value) {
    //加这层判断主要为了防止用户频繁点击蒙版

    //动画结束后关闭弹窗
    show.value = false;
    setTimeout(() => {
      // 动画结束后移除元素
      props.removeNode();
    }, 500);
  }
};
</script>

<template>
  <div class="">
    <transition name="pop">
      <div class="pop-wrap" v-if="show">
        <div class="mask" @click="close"></div>
        <div class="pop-content">
          <div class="title">弹窗组件</div>
          <div class="content">
            <slot></slot>
          </div>
        </div>
      </div>
    </transition>
  </div>
</template>

<style scoped>
.pop-wrap {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
}
.mask {
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.6);
  transition: all 0.5s;
}
.pop-enter-active,
.pop-leave-active {
  /* 时长需要与各个子元素(maske、pop-content)动画时长最长的相等 */
  transition: all 0.5s;
}
.pop-enter-from .mask,
.pop-leave-to .mask {
  opacity: 0;
}
.pop-enter-to .mask,
.pop-leave-from .mask {
  opacity: 1;
}
.pop-enter-from .pop-content,
.pop-leave-to .pop-content {
  opacity: 0;
  transform: translate(-50%, -70%);
}
.pop-enter-to .pop-content,
.pop-leave-from .pop-content {
  opacity: 1;
  transform: translate(-50%, -50%);
}
.pop-content {
  background: #fff;
  border-radius: 10px;
  width: 50%;
  height: 40%;
  padding: 10px;
  position: absolute;
  left: 50%;
  top: 50%;
  transition: all 0.5s;
  transform: translate(-50%, -50%);
}
.title {
  height: 50px;
  font-size: 20px;
  color: #333;
  font-weight: bold;
  line-height: 50px;
  border-bottom: 1px solid #999;
}
</style>


2.在popup同级目录下创建一个index.ts 去渲染component

import { createApp, h } from "vue"
import Popup from './popup.vue'


export default function popup(vnNode: any) {
    const parentNode = document.createElement('div')
    const popupInstance = createApp({
        render() {
            return h(
                Popup,
                {
                    //popup的属性
                    removeNode: () => {
                        // 销毁弹窗组件
                        document.body.removeChild(parentNode)

                    }
                },
                // children
                [
                    h(vnNode)
                ]
            )
        }
    })


    document.body.appendChild(parentNode)
    popupInstance.mount(parentNode)
}

3.调用

<script setup lang="ts">
import createPopup from "./components/popup";
import PopupContent from './components/popConnt.vue'// 放入插槽的弹窗内容

const createComponent = ()=>{
  createPopup(PopupContent)
}
</script>

<template>
<button @click="createComponent">创建组件</button>
</template>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uniapp 是一款跨平台的开发框架,可以同时支持多个平台,包括 iOS、Android、H5 等。而 renderjs 是一款基于 Vue.js 的可视化开发工具,可以在 Uniapp 中快速实现高德地图的集成。 以下是在 Uniapp 中使用 renderjs 实现高德地图的步骤: 1. 首先在项目中安装 renderjs: ``` npm install renderjs -D ``` 2. 在需要使用高德地图的页面中引入 renderjs: ```javascript import Renderjs from 'renderjs' ``` 3. 在页面的 data 中定义地图相关的变量: ```javascript data() { return { map: null, // 地图对象 markers: [], // 地图标记点 center: [116.397428, 39.90923], // 地图中心点坐标 zoom: 11 // 地图缩放级别 } } ``` 4. 在页面的 mounted 生命周期中初始化地图: ```javascript mounted() { // 初始化地图 this.map = Renderjs.initMap('map-container', { center: this.center, zoom: this.zoom }) } ``` 5. 在需要添加标记点的地方,调用 addMarker 方法: ```javascript // 添加标记点 this.markers.push({ position: [116.397428, 39.90923], content: '这是一个标记点' }) this.addMarker() ``` 6. 实现 addMarker 方法: ```javascript addMarker() { this.markers.forEach(marker => { Renderjs.addMarker(this.map, { position: marker.position, content: marker.content }) }) } ``` 7. 在页面中添加地图容器,并设置 id 为 map-container: ```html <template> <view> <view id="map-container"></view> </view> </template> ``` 通过以上步骤,就可以在 Uniapp 中快速实现高德地图的集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值