uniapp 的 renderjs 使用详解,结合arcgis api

目录

什么renderjs

与一般vue使用上的区别

组件传值: 通过使用逻辑层方法,传递数据,涉及到数据赋值和生命周期等问题

HTML

逻辑层:

test组件

    关于调试问题

 关于各层数据传递问题:


什么renderjs

  • 在renderjs下, 可以引用jquery,esri-loader等web api(在uniapp项目下,若不使用renderjs,这种api以及document,window是方法是不支持的)。
  • 可以直接操作dom,例:document.getElementbyId().οnclick=()=>{ }。
  • 动画更流畅,性能更高。

与一般vue使用上的区别

  • renderjs 分为 视图层 与 逻辑层
    • 视图层即使用lang="renderjs"的<script>,
    • 逻辑层就是普通的<script>标签。
  • 页面渲染、使用props传值只能用逻辑层的数据,就是组件 view 传值要用下面的逻辑层。
  • 按钮的监听分两种:
    • 逻辑层:通过html标签,定义点击事件
    • 视图层:通过document操纵dom元素

组件传值: 通过使用逻辑层方法,传递数据,涉及到数据赋值和生命周期等问题

HTML

<template>
	<view class="content">
		<!-- <button @click="sendMsg">点击</button> -->
		<view @click="onViewClick"><button>{{text}}</button></view>
		<test :view="view" :map="map" :layer="layer" v-if="begin"></test>
	</view>
</template>

视图层:

<script module="echarts" lang="renderjs">
	let myChart
	 import {loadModules} from '../../static/esri-loader.js';
	export default {
		view:null,
		map:null,
		layer:null,
		data() {
		    return {
		        ready:false,
				text:"视图层",
			
		},
		mounted() {
				this.initEcharts()
			
			
		},
		methods: {
			
			
			initEcharts() {
				let options = {
				  url: 'https://js.arcgis.com/4.20/init.js',
				  css: 'https://js.arcgis.com/4.20/esri/themes/light/main.css',
				};
				loadModules(["esri/views/MapView",
				  "esri/Map", "esri/layers/MapImageLayer","esri/tasks/support/FindParameters",
            "esri/tasks/FindTask",
				], options).then(([MapView, Map, MapImageLayer,FindParameters,FindTask]) => {
				  // console.log(sublayers)
				  const sublayers=[ ];
				  for(let i=17;i>=0;i--){
				    let sub={ }
				    sub.id=i
				    sub.visible=true
				    sublayers.push(sub);
				    i<15?sub.popupTemplate=this.popupPoint:sub.popupTemplate=this.popupLine;
				  }
				  this.layer = new MapImageLayer({
				    url: "https://47.97.192.155:6443/arcgis/rest/services/XSTestDemo/MapServer",
				     sublayers: sublayers
				
				  });
				  this.map = new Map({
				    layers: [this.layer],
				    basemap: "streets",
				  });
				  this.view = new MapView({
				    container: "viewDiv",
				    map: this.map,
				    zoom:5,
				    center:[120,0]
				  }); //显示地图
					
					//关键,类似监听的作用
					//通过使用逻辑层方法,传递数据
				  this.$ownerInstance.callMethod('sendMsg')
			
				});
			
			}
		}
	}
</script>

逻辑层:

<script>
	export default {
		data() {
			return {
				begin:false
			}
		},
		onLoad() {
			
		},
		watch:{
			
		},
		mounted() {
		},
		methods: {
			sendMsg(){
				//开始渲染
				this.begin=true
			}
		},
		
	}
</script>

test组件

<template>
	<view>
		
	</view>
</template>

<script>
	export default {
		props:['view','map','layer'],
		name:"test",
		data() {
			return {
				
			};
		},
		mounted() {
			console.log('---这是view')
			console.log(this.view)
			console.log(this.layer)
			console.log(this.map)
		}
	}
</script>

<style>

</style>

 关于调试问题

        不一定都要用真机模拟器,只要了解并按照renderjs的语法规则,可直接使用浏览器调试。

 关于各层数据传递问题:

        原则上两层的数据都是渲染在一个this里面的,只是涉及到生命周期问题,可通过点击事件等拿到值

  • 视图层可以通过this.xxx拿到逻辑层的数据
  • 逻辑层不能直接通过thiis.xxx拿到视图层数据(就是要绕弯拿)。
<template>
  <view>
    <text>renderjs区域</text>
        <view @click="renderScript.emitData" :msg="msg" :change:msg="renderScript.receiveMsg" class="renderjs" id="renderjs-view">
        </view>
        <button @click="changeMsg" class="app-view">app-view</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        msg: ''
      };
    },
    methods: {
      // 触发逻辑层出入renderjs数据改变
      changeMsg() {
        this.msg = 'hello renderjs' + Math.random() * 10;
      },
      // 接收renderjs发回的数据
      receiveRenderData(val) {
        console.log('receiveRenderData-->', val);
      }
    }
  };
</script>

<script module="renderScript" lang="renderjs">
    export default {
      data() {
        return {
          name: 'render-vm'
        }
      },
      mounted() {
        const view = document.getElementById('renderjs-view')
        const button = document.createElement('button')
        button.innerText = '一个按钮'
        view.appendChild(button)
      },
      methods: {
        // 接收逻辑层发送的数据
        receiveMsg(newValue, oldValue, ownerVm, vm) {
          console.log('newValue', newValue)
          console.log('oldValue', oldValue)
          console.log('ownerVm', ownerVm)
          console.log('vm', vm)
        },
        // 发送数据到逻辑层
        emitData(e, ownerVm) {
          ownerVm.callMethod('receiveRenderData', this.name)
        }
      }
    };
</script>

参考:uni-app renderjs通信_辛巴德2018的博客-CSDN博客_renderjs

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要在UniApp项目中通过npm引入ArcGIS API,可以按照以下步骤进行操作: 1. 确保你的UniApp项目已经初始化并且具有npm的支持。如果还没有,可以在命令行中进入项目目录,执行以下命令进行初始化: ``` uni init ``` 2. 在命令行中,进入你的UniApp项目目录,执行以下命令来安装ArcGIS API的npm包: ``` npm install @arcgis/core ``` 3. 在你的UniApp项目中,找到 `main.js` 文件,这是整个应用的入口文件。 4. 在 `main.js` 文件中,添加以下代码来全局引入ArcGIS API: ```javascript import { loadModules } from '@esri/react-arcgis'; // 在Vue的全局配置中加载ArcGIS API模块 Vue.prototype.$loadModules = loadModules; ``` 5. 现在你可以在你的UniApp项目中的任何页面或组件中使用ArcGIS API了。例如,在一个页面的 `onLoad` 生命周期中加载地图: ```javascript export default { data() { return { map: null }; }, onLoad() { this.$loadModules(['esri/Map', 'esri/views/MapView']).then(([Map, MapView]) => { this.map = new Map({ basemap: 'streets' }); const view = new MapView({ container: this.$refs.mapContainer, map: this.map }); }); } }; ``` 6. 在你的页面模板中,添加一个容器元素来显示地图。例如,在页面的 `template` 中添加以下代码: ```html <view ref="mapContainer" style="width: 100%; height: 100vh;"></view> ``` 7. 运行你的UniApp项目,即可看到引入的ArcGIS API在页面中显示地图。 请注意,具体的代码可能会因为你使用ArcGIS API版本而略有不同。此外,还需要确保你的UniApp项目的配置和依赖正确设置,并且ArcGIS API的npm包已经成功安装。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值