0

So in Vue with the Options API I have the following Code:

<script lang="ts">
import * as THREE from 'three';

export default {
    mounted() {
        console.assert(this.$refs.container instanceof HTMLCanvasElement, this.$refs.container);
        const renderer = new THREE.WebGLRenderer({
            canvas: this.$refs.container as HTMLCanvasElement,
            antialias: true,
            alpha: true
        });
        
    }
};
</script>

<template>
    <canvas ref="container" id="earthCanvas"></canvas>
</template>

Now if I want to port that to the Composition API, the call to "this" does not work anymore, because it is "possibly undefined" (why, btw?). So I want to use 'ref' and 'container.value' instead:

<script lang="ts">
import * as THREE from 'three';
import { onMounted, ref } from 'vue';

let container = ref(null)
onMounted(() => {
    console.assert(container.value instanceof HTMLCanvasElement, container.value);
    const renderer = new THREE.WebGLRenderer({
        canvas: container.value as HTMLCanvasElement,
        antialias: true,
        alpha: true
    });

});
</script>

<template>
    <canvas ref="container" id="earthCanvas"></canvas>
</template>

However, Vue is not happy with what I made: When I call 'container.value', it says: "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter".

Now how do I convert a ref to the element? I'm just a beginner so sorry for posting such a simple question...

chatGPT can not show me what I'm doing wrong, If I'm using it's code I get other Errors...

2 Answers 2

1

Your container value has this type: Ref<null>. So it's a reference to the null value, and Typescript infer this to be always the type null.

To specify which type your ref should be, you have to use the generic parameter:

const container = ref<HTMLCanvasElement | null>(null);

When properly typed, your instanceof will work.

Sign up to request clarification or add additional context in comments.

Comments

1

Instead of assert, you might just want to do a branch check to see if ref is null:

let container = ref<HTMLCanvasElement | null>(null)
onMounted(() => {
  if (container.value) {
    const renderer = new THREE.WebGLRenderer({
        canvas: container.value,
        antialias: true,
        alpha: true
    });
  }
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.