首页 > 其他分享 >uniapp renderjs "只能行内调用, 不能通过方法调用" 学习

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

时间:2024-05-06 20:35:33浏览次数:14  
标签:uniapp 调用 return renderjs img js attrs event

故障代码

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

<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编译器会这样编译

<button @click="get"></button>

// render
with(this){return _c('button', {on: {click: get}})}

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

image

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

具体生成的render代码

// 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)}

标签:uniapp,调用,return,renderjs,img,js,attrs,event
From: https://www.cnblogs.com/re-is-good/p/18125699

相关文章

  • *uniapp-vue3-ts项目配置eslint+prettier+husky
    代码检查工具:Eslint代码格式化工具:prettierhusky:Git客户端增加了钩子(hooks)功能,使得在特定阶段执行一系列流程,以保证每一个commit的正确性vscode安装插件:    安装eslint+prettier:npmi-Deslintprettiereslint-plugin-vue@vue/eslint-config-prettier@vu......
  • C语言转写成MIPS指令集汇编以及MIPS指令集汇编中函数调用时栈的变化
    一、问候语欢迎你来到我的博客!二、C语言代码分析  这段C语言代码共有3个函数组成。set_array函数传入1个int类型的变量num,并创建了1个int类型临时变量i和1个临时int类型数组array,里面含有10个单位,此函数主要目的是调用compare函数,并将num和i传入该函数中,得到其函数返回值......
  • 函数调用过程分析
    参考:轩辕之风——从0开始学逆向第7天函数调用约定定义在计算机科学中,调用约定是一种定义子过程从调用处接受参数以及返回结果的方法的约定。不同调用约定的区别在于:参数和返回值放置的位置、参数传递的顺序、调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配,被......
  • Teamcenter AWC 调用存储过程输出报表
    1.前端:1.1增加导出报表命令:{  "commands":{   ...,    "ExportBOMCommand":{      "iconId":"cmdZoomToSelected",      "title":"{{i18n.ExportBOMCommandTitle}}",      &quo......
  • im即时通讯源码/仿微信app源码+php即时通讯源码带红包+客服+禁言等系统php+uniapp开发
    即时通讯(IM)系统是现代互联网应用中不可或缺的一部分,它允许用户进行实时的文本、语音、视频交流。随着技术的发展,IM系统的功能越来越丰富,如红包、客服、禁言等。本文将探讨如何使用PHP语言开发一个功能完备的即时通讯系统,包括源码解析、系统架构、关键功能实现等。仓库源码:ym.fz......
  • ai网页详情页-测试-api调用成功返图+左侧界面及时显示
    PYTHONfromflaskimportFlask,render_template,request,jsonify,send_from_directoryimportosimportrequestsimportbase64fromPILimportImageimportioimportrandomapp=Flask(__name__)app.config['UPLOAD_FOLDER']='uploads/......
  • ai网页详情页-测试-api调用成功返图!
    "C:\Users\wujie1\Desktop\程序测试\templates\upload.html""C:\Users\wujie1\Desktop\程序测试\python.py"C:\Users\wujie1\Desktop\程序测试\uploads pythonfromflaskimportFlask,render_template,request,jsonify,send_from_director......
  • 增加调用链来获取chown的调用方
    #重命名/usr/bin/chown二进制文件为real_chownmv/usr/bin/chown/usr/bin/real_chown#编写脚本来调用real_chownvim/usr/bin/chownchown_log="/var/log/chown.log"date>>$chown_logecho"PPIDis$PPID,chown$*">>$chown_logps-ef|grep......
  • webapi创建和调用WebService
    首先需要引入soapcore包这个包提供了所需的类和soap终结点中间件。引入这个这个包之后,我们需要定义提供的服务。这里我写了一个用于查询省份面积的服务。省份信息服务///<summary>///省份信息服务接口///</summary>[ServiceContract]publicinterfaceIProvinceInfo......
  • uniapp 清除缓存
    //清除所有数据clearAppUserData(){plus.android.importClass("android.app.ActivityManager");varContext=plus.android.importClass("android.content.Context");varam=plus.android......