<template>
<view>
<!-- 设置 script 节点的 lang 为 renderjs
script的module的名称可以随便取,module=(值任意,相当于命名空间,之后会根据这个名字调用其中的方法),但是change:参数名称必须和module保持一致,虽然不会阻断renderjs的运行,但是会报错,也会导致无法捕获数据的变化 -->
<!-- prop是个名字,可以随意改,注意:change:[name]这两个名字需要相同就行了 -->
<!-- 从service层到renderjs:首先在template中绑定一个service中定义的值,然后在同样的位置增加:change:(属性名)=(renderjs的module名.触发的方法)来实现通信。
简单来说就是service负责数据的更改,通过template监听数据的变化来通知renderjs
this.$ownerInstance.callMethod方法必须通过点击事件执行-->
<!-- msg是要向renderjs发送的数据,testRenderjs 为renderjs模块名称,onChange是renderjs中的监听方法 -->
<view :prop="msg" :change:prop="testRenderjs.onChange" id="renderjs-view">{{msg}}</view>
<button @tap="changeMsgFn">点击修改options旧版版</button>
<button @tap="testRenderjs.emitData">直接调用renderjs中的emitData方法</button>
<button @click="update">更新版本</button>
</view>
</template>
<script>
// 原先的script,这里被称为service层
export default {
data() {
return {
//这里存放准备传递给renderjs的数据
msg: "我是service层原来的msg"
}
},
methods: {
// 触发service层 出入renderjs数据改变
changeMsgFn() {
// 修改msg 触发change
this.msg = "msg的值变了"
},
// 接收renderjs发回的数据
acceptDataFromRenderjs(data) {
console.log('从renderjs中接收到的数据', data)
this.msg = data.content
},
update() {
console.log("更新版本")
uni.downloadFile({
url: "https://mp-def56af1-b497-4158-bdaa-adb4eb12820e.cdn.bspapp.com/cloudstorage/__UNI__9FEA80B.wgt",
success: res => {
console.log("res:", res)
// 下载好直接安装,下次启动生效
plus.runtime.install(res.tempFilePath, {
force: true
}, (success) => {
console.log(success)
plus.runtime.restart();
}, (fail) => {
console.log("失败" + fail)
});
}
});
}
}
}
</script>
<!-- testRenderjs 为renderjs模块名称,lang固定写法 -->
<script module="test" lang="renderjs">
export default {
data() {
return {
content: "我是来自renderjs的数据"
}
},
created() {
console.log('renderjs初始化完毕')
},
mounted() {
const view = document.getElementById('renderjs-view')
const button = document.createElement('button')
button.innerText = '一个按钮'
view.appendChild(button)
},
methods: {
// 接收逻辑层service层发送的数据
onChange(newValue, oldValue, ownerInstance, instance) {
console.log('service层中的options发生变化')
console.log('新值newValue', newValue)
console.log('旧值oldValue', oldValue)
// ownerInstance和this.$ownerInstance一样,可用来向service层通信
// instance和ownerInstance的区别是:
// instance.$el指向的是触发事件的那个节点;ownerInstance.$el指向当前vue文件中的根节点;
// instance的作用目前尚不明确,官方没有给出用法
},
// 发送数据到service层
emitData(event, ownerInstance) {
// event是事件对象
ownerInstance.callMethod('acceptDataFromRenderjs', {
content: this.content
})
// 或者
/* this.$ownerInstance.callMethod('acceptDataFromRenderjs',{
content:this.content
}) */
// 需要注意的是:只有通过在template中用户手动操作触发renderjs的方法参数是这两个:event, ownerInstance;通过其他方法触发的函数参数不一样
}
}
}
</script>
- 发布:2024-04-11 11:02
- 更新:2024-06-24 21:32
- 阅读:358
【报Bug】renderjs报错 vue.undefined is not a function;$t.setAttribute is not a function
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: windows 10
手机系统: Android
手机系统版本号: Android 11
手机厂商: 小米
手机机型: Redmi Note 9 Pro
页面类型: vue
vue版本: vue3
打包方式: 离线
项目创建方式: CLI
CLI版本号: 3.0.0-3090620231104002
示例代码:
操作步骤:
:change加上就会报错
:change加上就会报错
预期结果:
解决报错问题
解决报错问题
实际结果:
解决报错问题
解决报错问题
bug描述:
renderjs 使用 :change 会出现
TypeError: vue.undefined is not a function
10:55:48.829 $t.setAttribute is not a function
TypeError: $t.setAttribute is not a function
at uni-jsframework.js:31:5744
at Array.forEach (<anonymous>)
at Ge (uni-jsframework.js:31:5728)
at et (uni-jsframework.js:31:5340)
at ft (uni-jsframework.js:31:1199)
at Object.Zi [as render] (uni-jsframework.js:31:12275)
at Object.Ne [as render] (uni-jsframework.js:32:22355)
at Object.mountPage (uni-jsframework.js:32:53339)
at U (uni-jsframework.js:32:226275)
at TI (uni-jsframework.js:32:226385)
异常,不使用:change则无异常
w***@163.com
请问是更新hbuilder吗
2024-04-22 10:11
3***@qq.com (作者)
我是用cli创建项目的,更新cli版本就行
2024-04-22 16:36