首页 > 其他分享 >VUE3 + Three.js 坑

VUE3 + Three.js 坑

时间:2024-01-04 10:06:54浏览次数:39  
标签:get Three value js 报错 proxy VUE3 Proxy

VUE3 + Three.js 坑

1. 问题描述

将scene、camera、renderer、controls等变量用reactive变成响应式时,页面渲染会报错:

three.module.js?5a89:24471 Uncaught TypeError: 
'get' on proxy: property 'modelViewMatrix' is a read-only and 
non-configurable data property on the proxy target but the proxy did not 
return its actual value (expected '#<Matrix4>' but got '[object Object]')
at renderObject (three.module.js?5a89:24471)
at renderObjects (three.module.js?5a89:24458)
at Proxy.WebGLRenderer.render (three.module.js?5a89:24258)
at animate (HelloWorld.vue?fdab:192)

2. 问题原因

Vue3的响应式原理是通过Proxy实现的,Proxy的get方法会拦截对象的读取操作,而three.js的源码中有很多属性是只读的,比如modelViewMatrix、normalMatrix等,这些属性在three.js的源码中是通过Object.defineProperty定义的,所以Proxy的get方法会拦截这些属性的读取操作,导致页面渲染报错。
在使用Proxy时,当属性存在属性特性configurable: false, value: undefined,时,则取其属性值时会报错

例如:

const handle = {
  get() {
    return 1;
  },
};

const obj = Object.create(null);
Object.defineProperty(obj, 'a', {
  configurable: false,
});
Object.defineProperty(obj, 'b', {
  value: undefined,
});
Object.defineProperty(obj, 'c', {
  configurable: true,
  value: 'c',
});

const proxy = new Proxy(obj, handle);
console.log(proxy.a); // 报错TypeError: 'get' on proxy: property 'a' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected 'undefined' but got '1')
console.log(proxy.b); // 报错Uncaught TypeError: 'get' on proxy: property 'b' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected 'undefined' but got '1')
console.log(proxy.c); // 1

3. 解决方案

  • 将scene、camera、renderer、controls等对象用全局var声明,不要reactive,这样就不会触发Proxy的get方法,也就不会报错了。
  • 在添加一些场景的时候,场景可以用ref定义。添加的时候用toRaw转一下,例如:
scene.add(toRaw(mesh.value))
renderer.value.render(toRaw(scene.value), camera.value);

如果没有了响应式,用Vue3还有什么意义呢?

长风破浪会有时,直挂云帆济沧海



标签:get,Three,value,js,报错,proxy,VUE3,Proxy
From: https://blog.51cto.com/u_15961676/9095432

相关文章

  • 无涯教程-jsoup - 设置属性
    下面的示例将HTML解析为Document对象后,使用addClass或removeClass方法来增加或删除class类方法。Documentdocument=Jsoup.parse(html);Elementlink=document.select("a").first();link.attr("href","www.yahoo.com");link.addClass("header"......
  • 无涯教程-jsoup - 提取属性
    以下示例将HTML解析为Document对象后,使用Elements方法来获取dom元素的属性。Documentdocument=Jsoup.parse(html);Elementlink=document.select("a").first();System.out.println("Href:"+link.attr("href"));元素对象代表dom元素,并提供了各种获取dom元素属性的方法。......
  • Node-js用FlexSearch给Hexo添加极速全站搜索
    title:Node.js用FlexSearch给Hexo添加极速全站搜索tags:[Node.js,node,Javascript,Debian,Linux,FlexSearch,搜索]新版原文:https://www.carlzeng.top/search?q=Node.js用FlexSearch给Hexo添加极速全站搜索版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA许可协议。......
  • 无涯教程-jsoup - 使用选择器语法
    以下示例将HTML解析为Document对象之后使用Selector方法操作元素,jsoup支持类似于CSSSelector选择器。Documentdocument=Jsoup.parse(html);//awithhrefElementslinks=document.select("a[href]");document.select(expression)方法解析给定的CSSSelector表达式,以选择ht......
  • js 操作 clipboard
     文章目录Document.execCommand()方法复制操作粘贴操作优缺点Clipboard对象介绍Clipboard对象方法Clipboard.readText(https://www.chinaobd2.com/upload/support/smartpro-5000u-plus-chips-support-list.html)粘贴文本Clipboard.read()粘贴数据Clipb......
  • 无涯教程-jsoup - 加载文件
    以下示例将从本地文件加载HTML文件,返回一个Document文档,然后查找其数据。Fileinput=newFile(xxxxx);Documentdocument=Jsoup.parse(input,"UTF-8");Jsoup.parse示例使用您选择的任何编辑器在C:/>jsoup中创建以下Java程序。JsoupTester.javaimportjava.io.File;impo......
  • Three光源Target位置改变光照方向不变的问题及解决方法
    0x00楔子在Three.js中,光源的目标(target)是一种用于指定光源方向的重要元素。在聚光灯中和定向光(DirectionalLight)中都有用到。有时我们可能会遇到光源目标位置更新后,但光照方向未正确更新的问题。这个问题并不复杂,但是有时候出现了,往往会想不到原因。0x01原因出现这个问题的原......
  • #星计划#【坚果派】JS开源库适配OpenHarmony系列——第一期实操
    (目录)JS开源库适配OpenHarmony系列第一期实操1.为什么适配JS开源库由于OpenHarmony应用是基于ArkTS开发,而ArkTS是在保持TypeScript(简称TS)基础语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。因此在开发OpenHarmony三方库时,建议首选在成熟的JS/TS开源三方......
  • 前端VUE JS if (!this.form.typeId)什么意思,包括数字0吗
    这行代码是在检查this.form对象的typeId属性是否为假值。如果typeId是假值(比如null、undefined、false、0、NaN或空字符串""),那么条件将被视为true。这通常用于检查对象属性是否存在或是否被设置为一个真实的值。数字0也包括吗?是的,数字0也被视为假值。在JavaScript中,条......
  • 【JS逆向】某建筑市场监督管理平台企业数据加密逆向分析探索!
    一个很典型的加密数据反爬网站,目的就是反爬,不让你拿到企业相关数据,有着很典型的特征,在查找数据的时候看不到任何内容数据,都是加密的内容数据。网站网页返回数据信息内容,很典型的加密数据内容:网址:aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55分析网页接口数据信息2.通过翻......