uniapp原生子窗体subNvue的使用超容易理解的总结,解决覆盖不了视频或者地图等层级问题

subNvue 自1.9.10 起支持 ,仅支持 app 平台

subNVues 是 vue 页面的原生子窗体。用于解决App中 vue 页面中的层级覆盖和原生界面灵活自定义用的。

它是一个 nvue 页面,使用 weex 引擎渲染,方便自定义原生导航或覆盖原生地图、视频等

虽然有cover-view来覆盖原生组件,但是在app-vue中不支持嵌套,且只能在map、video组件使用,这个时候用原生子窗体是比较适合的

1.首先配置pages.json(我这里引用官方的一个配置案例)

{ 
 "pages": [{
        "path": "pages/index/index", //首页
        "style": {
                "subNVues":[{//侧滑菜单
                    "id": "drawer", //subNVue 的 id,可通过 uni.getSubNVueById('drawer') 获取
                    "path": "pages/index/drawer.nvue", // nvue 路径
                    "style": { //webview style 子集,文档可暂时开放出来位置,大小相关配置
                        "position": "popup", //除 popup 外,其他值域参考 5+ webview position 文档
                        "width": "50%"
                    }

                }, {//弹出层
                    "id": "popup",
                    "path": "pages/index/popup",
                    "style": {
                        "position": "popup",
                        "margin":"auto",
                        "width": "150px",
                        "height": "150px"
                    }
                }]
            }
    }]
}

注意:

  • subNVues 的 id 是全局唯一的,不能重复
  • 可以通过 uni.getSubNVueById('id') 获取 subNVues 的实例
  • subNVues 的 path 属性只能是 nvue 文件路径

更多配置请看 官方文档

 2.创建完毕之后使用原生子窗体

在一个项目文件夹下建一个,专门存放subNvue原生子窗体的文件夹

3.在vue页面引用原生子窗体

loadfun(e){
			let drawer = uni.getSubNVueById('drawer');//通过 ID 获取 subNVues 原生子窗体的实例
			uni.$emit('senddata',this.swiperlist[e])
           //我下面用的等同于uni.getSubNVueById('drawer').show,show是显示
			drawer.show('zoom-fade-out', 200,()=>{//第一个参数指定动画,我这里设置的是新窗体逐渐放大
             //第二个参数执行时间,第三个参数是执行完的回调
			})
		},

4.在窗体页面设置隐藏窗体的函数

mounted() {
			let _this = this;
			uni.$on('senddata', (e) => {
				_this.infos = e;
			})
		},
		methods: {
			toSecondPage() {
				// 先关掉drawer再进行跳转,因为subNVue会在其它页面也存在
				uni.getCurrentSubNVue().hide('slide-out-left');
              //slide-out-left新窗体从左侧进入隐藏
			}
		}

更多动画类型也可参考动画类型

补充:

subNvue.postMessage()可以发送消息

subNvue.onMessage()可以监听消息,这种通讯方式已过时

所以我在这里传参用的是uni.$emit和uni.$on

虽然subNVue 比cover-view和plus.nativeObj.view更强大,也占用更多内存,为了保证更好的性能体验,一个vue页面不要加载太多 subNVue 子窗体,建议控制在三个以内

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在React中使用高德地图自定义信息窗体的方法如下: 1. 首先,确保您已经在项目中引入了高德地图的JavaScript SDK。可以通过在index.html中添加以下代码来引入: ```html <script src="https://webapi.amap.com/maps?v=1.4.15&key=your_api_key"></script> ``` 请将 `your_api_key` 替换为您在高德地图开放平台申请的 API Key。 2. 创建一个React组件来包含地图和信息窗体。在该组件的构造函数中初始化地图,并在组件挂载后创建信息窗体。以下是一个简单的示例: ```javascript import React, { Component } from 'react'; class MapWithInfoWindow extends Component { constructor(props) { super(props); this.map = null; this.infoWindow = null; } componentDidMount() { this.initMap(); } initMap() { // 初始化地图 this.map = new window.AMap.Map('map-container', { center: [lng, lat], // 设置地图中心点坐标 zoom: 13, // 设置地图缩放级别 }); // 创建信息窗体 this.infoWindow = new window.AMap.InfoWindow({ isCustom: true, // 使用自定义窗体 content: this.renderInfoWindowContent(), // 自定义窗体内容 offset: new window.AMap.Pixel(0, -30), // 设置信息窗体偏移量 }); } renderInfoWindowContent() { // 自定义窗体内容 return ( <div> <h3>视频标题</h3> <p>视频描述</p> <video src="video_url" controls width="200" height="150" /> </div> ); } openInfoWindow() { // 打开信息窗体 this.infoWindow.open(this.map, [lng, lat]); // 设置信息窗体的位置坐标 } render() { return <div id="map-container" style={{ width: '100%', height: '400px' }} />; } } export default MapWithInfoWindow; ``` 在上面的示例中,`lng`和`lat`是地图的中心点坐标,您可以根据实际需要进行调整。`video_url`是视频的URL,您可以将其替换为您自己的视频URL。 3. 在需要显示地图的组件中使用`MapWithInfoWindow`组件: ```javascript import React from 'react'; import MapWithInfoWindow from './MapWithInfoWindow'; function App() { return ( <div> {/* 其他组件 */} <MapWithInfoWindow /> </div> ); } export default App; ``` 通过在所需位置调用`openInfoWindow`方法,您可以在需要的时候打开信息窗体。 请注意,上述代码只是一个简单的示例,您可能需要根据实际需求进行更多的定制和调整。希望对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端老实人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值