钻石葫芦 發表於 2022-8-25 10:21:00

uni-app renderjs通信 与具体例子

<p><strong>一、renderjs使用</strong></p>
<p>renderjs是一个运行在视图层的js。它只支持app-vue和h5。</p>
<p>renderjs的主要作用有2个:</p>
<p>&nbsp;</p>
<p>1.大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力</p>
<p>2.在视图层操作dom,运行for web的js库</p>
<p>&nbsp;</p>
<p>使用时的注意事项</p>
<p>1.目前仅支持内联使用。</p>
<p>2.不要直接引用大型类库,推荐通过动态创建 script 方式引用。</p>
<p>3.可以使用 vue 组件的生命周期不可以使用 App、Page 的生命周期</p>
<p>4.视图层和逻辑层通讯方式与 WXS 一致,另外可以通过 this.$ownerInstance 获取当前组件的 ComponentDescriptor 实例。</p>
<p>5.观测更新的数据在视图层可以直接访问到。</p>
<p>6.APP 端视图层的页面引用资源的路径相对于根目录计算,例如:./static/test.js。</p>
<p>7.APP 端可以使用 dom、bom API,不可直接访问逻辑层数据,不可以使用 uni 相关接口(如:uni.request)</p>
<p>8.H5 端逻辑层和视图层实际运行在同一个环境中,相当于使用 mixin 方式,可以直接访问逻辑层数据。&nbsp;</p>
<h2 id="uni-apprenderjs通信与具体例子-二、renderjs与逻辑层通信示例"><strong>二、renderjs与逻辑层通信示例</strong></h2>
<p>&lt;template&gt;</p>
<p>&nbsp;&nbsp;&lt;view&gt;</p>
<p>&lt;text&gt;renderjs区域&lt;/text&gt;</p>
<p>页面 view 中监听变量msg</p>
<p>&lt;!-- 监听变量msg 调用renderScript的receiveMsg方法--&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;view @click="renderScript.emitData" :msg="msg" :change:msg="renderScript.receiveMsg" class="renderjs" id="renderjs-view"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/view&gt;</p>
<p>&lt;!-- 调用renderScript的click方法--&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button @click="changeMsg" class="app-view"&gt;app-view&lt;/button&gt;</p>
<p>&nbsp;&nbsp;&lt;/view&gt;</p>
<p>&lt;/template&gt;</p>
<p>&nbsp;</p>
<p>&lt;script&gt;</p>
<p>&nbsp;&nbsp;export default {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;data() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg: ''</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;methods: {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 触发逻辑层出入renderjs数据改变</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeMsg() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.msg = 'hello renderjs' + Math.random() * 10;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 接收renderjs发回的数据</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiveRenderData(val) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('receiveRenderData--&gt;', val);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;};</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&lt;script module="renderScript" lang="renderjs"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;export default {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: 'render-vm'</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mounted() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const view = document.getElementById('renderjs-view')</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const button = document.createElement('button')</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.innerText = '一个按钮'</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.appendChild(button)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methods: {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 接收逻辑层发送的数据</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiveMsg(newValue, oldValue, ownerVm, vm) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据变化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('newValue', newValue)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('oldValue', oldValue)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('ownerVm', ownerVm)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('vm', vm)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 发送数据到逻辑层</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emitData(e, ownerVm) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ownerVm.callMethod('receiveRenderData',&nbsp;this.name)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>下面是uniapp 使用 renderjs 的两个例子(具体使用方法)</p>
<h2 id="uni-apprenderjs通信与具体例子-三、利用renderjs引入echarts"><strong>三、利用renderjs &nbsp;</strong><strong>&nbsp;</strong><strong>引</strong><strong>入</strong><strong>echarts</strong></h2>
<p>&nbsp;echarts</p>
<p>&lt;template&gt;</p>
<p>&lt;view class="content"&gt;</p>
<p>&lt;!-- #ifdef APP-PLUS || H5 --&gt;</p>
<p>&lt;view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" id="echarts" class="echarts"&gt;&lt;/view&gt;</p>
<p>&lt;button @click="changeOption"&gt;更新数据&lt;/button&gt;</p>
<p>&lt;!-- #endif --&gt;</p>
<p>&lt;!-- #ifndef APP-PLUS || H5 --&gt;</p>
<p>&lt;view&gt;非 APP、H5 环境不支持&lt;/view&gt;</p>
<p>&lt;!-- #endif --&gt;</p>
<p>&lt;/view&gt;</p>
<p>&lt;/template&gt;</p>
<p>&nbsp;</p>
<p>&lt;script&gt;</p>
<p>export default {</p>
<p>data() {</p>
<p>return {</p>
<p>option: {</p>
<p>title: {</p>
<p>text: 'ECharts 示例'</p>
<p>},</p>
<p>tooltip: {},</p>
<p>legend: {</p>
<p>data: ['数据']</p>
<p>},</p>
<p>xAxis: {</p>
<p>data: ["一类", "二类", "三类", "四类", "五类", "六类"]</p>
<p>},</p>
<p>yAxis: {},</p>
<p>series: [{</p>
<p>name: '销量',</p>
<p>type: 'bar',</p>
<p>data: </p>
<p>}]</p>
<p>}</p>
<p>}</p>
<p>},</p>
<p>onLoad() {</p>
<p>&nbsp;</p>
<p>},</p>
<p>methods: {</p>
<p>changeOption() {</p>
<p>const data = this.option.series.data</p>
<p>// 随机更新示例数据</p>
<p>data.forEach((item, index) =&gt; {</p>
<p>data.splice(index, 1, Math.random() * 40)</p>
<p>})</p>
<p>},</p>
<p>onViewClick(options) {</p>
<p>console.log(options)</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&lt;script module="echarts" lang="renderjs"&gt;</p>
<p>let myChart</p>
<p>export default {</p>
<p>mounted() {</p>
<p>if (typeof window.echarts === 'function') {</p>
<p>this.initEcharts()</p>
<p>} else {</p>
<p>// 动态引入较大类库避免影响页面展示</p>
<p>const script = document.createElement('script')</p>
<p>// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算</p>
<p>script.src = 'static/echarts.js'</p>
<p>script.onload = this.initEcharts.bind(this)</p>
<p>document.head.appendChild(script)</p>
<p>}</p>
<p>},</p>
<p>methods: {</p>
<p>initEcharts() {</p>
<p>myChart = echarts.init(document.getElementById('echarts'))</p>
<p>// 观测更新的数据在 view 层可以直接访问到</p>
<p>myChart.setOption(this.option)</p>
<p>},</p>
<p>updateEcharts(newValue, oldValue, ownerInstance, instance) {</p>
<p>console.log(newValue,'newvalue')</p>
<p>// 监听 service 层数据变更</p>
<p>myChart.setOption(newValue)</p>
<p>},</p>
<p>onClick(event, ownerInstance) {</p>
<p>// 调用 service 层的方法</p>
<p>ownerInstance.callMethod('onViewClick', {</p>
<p>test: 'test'</p>
<p>})</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&lt;style&gt;</p>
<p>.content {</p>
<p>display: flex;</p>
<p>flex-direction: column;</p>
<p>align-items: center;</p>
<p>justify-content: center;</p>
<p>}</p>
<p>&nbsp;</p>
<p>.echarts {</p>
<p>margin-top: 100px;</p>
<p>width: 100%;</p>
<p>height: 300px;</p>
<p>}</p>
<p>&lt;/style&gt;</p>
<p>&nbsp;</p>
<h2 id="uni-apprenderjs通信与具体例子-四、利用renderjs引入高德地图"><strong>四、利用renderjs &nbsp;</strong><strong>&nbsp;</strong><strong>引入高德地图</strong></h2>
<p>&nbsp;</p>
<p>&lt;template&gt;</p>
<p>&lt;view&gt;</p>
<p>&lt;view class="message"&gt;{{message}}&lt;/view&gt;</p>
<p>&lt;!-- :message="message" :change:message="renderTest.messageChanged"</p>
<p>&nbsp;service层一旦message发生改变,会调用 renderjs中的messageChanged的方法</p>
<p>&nbsp;--&gt;</p>
<p>&nbsp;&lt;!-- service层data中数据的改变操作放在service层 --&gt;</p>
<p>&lt;view @click="renderTest.onClick" :message="message" :change:message="renderTest.messageChanged" :prop="message" :change:prop="renderTest.changeWatch" id="renderId"&gt;&lt;/view&gt;</p>
<p>&lt;/view&gt;</p>
<p>&lt;/template&gt;</p>
<p>&nbsp;</p>
<p>&lt;script&gt;</p>
<p>// service 层</p>
<p>export default {</p>
<p>data() {</p>
<p>return {</p>
<p>message: "这是service的测试message"</p>
<p>}</p>
<p>},</p>
<p>onLoad() {</p>
<p>plus.navigator.closeSplashscreen()</p>
<p>},</p>
<p>methods: {</p>
<p>onViewClick(options) {</p>
<p>console.log(options)</p>
<p>this.message = options.test</p>
<p>uni.showModal({</p>
<p>title: "数据传递",</p>
<p>content: options.test</p>
<p>})</p>
<p>},</p>
<p>getMessage(options){</p>
<p>console.log("测试renderjs调用此方法:"+JSON.stringify(options))</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&lt;style&gt;</p>
<p>.message {</p>
<p>font-size: 22px;</p>
<p>margin-top: 80px;</p>
<p>}</p>
<p>&lt;/style&gt;</p>
<p>&nbsp;</p>
<p>&lt;script module="renderTest" lang="renderjs"&gt;</p>
<p>export default {</p>
<p>data() {</p>
<p>return {</p>
<p>map:null</p>
<p>}</p>
<p>},</p>
<p>mounted() {</p>
<p>// console.log(this.message,"renderjs中可以使用service层传递来的数据")</p>
<p>// 引入高德地图</p>
<p>if (typeof window.AMap === 'function') {</p>
<p>this.initAmap()</p>
<p>} else {</p>
<p>// 动态引入较大类库避免影响页面展示</p>
<p>const script = document.createElement('script')</p>
<p>script.src = 'https://webapi.amap.com/maps?v=1.4.15&amp;key=yourkey'</p>
<p>script.onload = this.initAmap.bind(this)</p>
<p>document.head.appendChild(script)</p>
<p>}</p>
<p>},</p>
<p>methods: {</p>
<p>initAmap() {</p>
<p>// 初始化</p>
<p>this.map = new AMap.Map('amap', {</p>
<p>resizeEnable: true,</p>
<p>center: ,</p>
<p>zoom: 11</p>
<p>})</p>
<p>let marker = new AMap.Marker({</p>
<p>position: this.map.getCenter()</p>
<p>})</p>
<p>markers.push(marker)</p>
<p>this.map.add(marker)</p>
<p>},</p>
<p>// id 为 renderId的区域,点击触发的事件</p>
<p>onClick(event, ownerInstance) {</p>
<p>// 调用 service层的onViewClick方法,传值</p>
<p>console.log(this.message,"************************")</p>
<p>ownerInstance.callMethod('onViewClick', {</p>
<p>test: '这是点击renderjs的区域,向service层传递变量'</p>
<p>})</p>
<p>},</p>
<p>messageChanged(newValue, oldValue, ownerVm, vm){</p>
<p>console.log("newValue*********"+newValue)</p>
<p>console.log("oldValue*********"+oldValue)</p>
<p>ownerVm.callMethod('getMessage',{</p>
<p>test: '123'</p>
<p>})</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>&lt;/script&gt;</p>
<p>&lt;style lang="scss" scoped&gt;</p>
<p>#renderId {</p>
<p>width: 100%;</p>
<p>height: 2rem;</p>
<p>&nbsp;</p>
<p>}</p>
<p>&lt;/style&gt;</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/fqs123456/p/16623389.html
頁: [1]
查看完整版本: uni-app renderjs通信 与具体例子