uniapp renderjs "只能行内调用, 不能通过方法调用" 学习

故障代码

app报错(h5正常), 说 echarts 为undefined。

copy
<view class="content"> <button @click="get" @touchend="update">update</button> <img src="" alt="我是alt" id="img"/> </view> <script> export default{ methods: { get(){ return this.echarts.uiGet(); //改为 @click="echarts.uiGet" 是正常的。 } } } </script> <script module="echarts" lang="renderjs"> export default{ methods:{ uiGet(){ const img = document.querySelector("#img"); console.log(img.getAttribute("alt")) } } } </script>

故障原因

与uniapp执行方式有关系(下面只讨论app下的模式)

ui与js分层

传统浏览器ui与js是执行在一个环境里的, 假如js任务很多,ui页面响应会变的缓慢。
而uniapp为了避免这个问题, 把ui放在了webview中,将用户执行的js放在jscore里(ios下)
jscore 是一个纯净的js执行环境, 没有浏览器的属性。
ui与jscore通过jsbridge进行通信。

uniapp编译与vue编译器行为不一致

这是因为uniapp魔改了vue的编译器, 正常vue2编译器会这样编译

copy
<button @click="get"></button> // render with(this){return _c('button', {on: {click: get}})}

uniapp 会考虑@click里的表达式是不是引用的 renderjs模块的代码。判断方式如下图所示。

image

如果是, 在真实view层会生成相应的代码。

具体生成的render代码

copy
// HBuilderX\plugins\uniapp-cli\node_modules\@dcloudio\uni-template-compiler\lib\index.js // service 逻辑层 with(this){ return _c('view', {staticClass:_$s(0,'sc',"content"), attrs:{"_i":0}},[ _c('button', {attrs:{"_i":1},on:{"touchend":update}}),_c('img',{attrs:{"id":"img","_i":2}})]) } // view 真实渲染层 with(this){ return _c('uni-view', {staticClass:_$g(0,'sc'), attrs:{"_i":0}}, [ _c('v-uni-button', {attrs:{"_i":1}, on:{ "click":function($event){$event = $handleWxsEvent($event);echarts.uiGet($event, $getComponentDescriptor())}, "touchend":function($event){return $handleViewEvent($event)}}},[_v("update")]), _c('img',{attrs:{"src":"","alt":"我是alt","id":"img","_i":2}})],1)}
posted @   re大法好  阅读(193)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起