@threlte/core
Plugins
Plugins are one of Threlte’s superpowers. Plugins allow you to globally extend Threlte’s <T>
component
functionality. This means you can not only add arbitrary props and event handlers to your <T>
components but also
override the default behavior of the <T>
component entirely.
Plugins add code to every <T>
component instance. That code acts as if it were part of the <T>
component itself.
You have full access to props, event listeners and the component instance itself. For an advanced example of what
a plugin can do, see the interactivity plugin of @threlte/extras
.
injectPlugin
The function injectPlugin
adds a plugin to all descendant <T>
components of the component that
invokes it. This means that you can add plugins to a specific part of your scene graph without
affecting the rest of the scene graph.
import { injectPlugin } from '@threlte/core'
injectPlugin('plugin-name', ({ ref, props }) => {
// We are *inside* a `<T>` component instance
// Do something with the ref and props
// e.g. return early if the plugin is not applicable
return {
// These props are reserved for this plugin, the
// `<T>` component instance will not act on them.
pluginProps: ['plugin-prop-a', 'plugin-prop-b'],
// this function is called whenever the `ref` inside the `<T>`
// component changes. You may return a cleanup function that is
// called when the ref changes again or the component unmounts.
onRefChange: (ref) => {
// Do something with the ref
return () => {
// Cleanup
}
},
// This function is called whenever the $$props of the `<T>` component
// change. These include props like "dispose", "args" and "makeDefault"
// that are part of the component itself rather than the props that are
// passed to the Three.js object.
onPropsChange: (props) => {
// Do something with the props
},
// This function is called whenever the $$restProps of the `<T>` component
// change. These are the props that are passed to the Three.js object.
onRestPropsChange: (restProps) => {
// Do something with the restProps
}
}
})
You may also override a plugin namespace further down the tree by calling injectPlugin
again with the same plugin name.
injectPlugin
is relying on a context provided by your root <Canvas>
component and can therefore only be used inside a <Canvas>
component.
createPlugin
The function createPlugin
creates a NamedPlugin
but does not add it to the global plugin list and therefore does not
make it available to all <T>
components. This is useful if you want to create a plugin at some place and inject it at another.
import { createPlugin } from '@threlte/core'
export const plugin = createPlugin('plugin-name', ({ ref, props }) => {
// Plugin Code
})
<script lang="ts">
import { injectPlugin } from '@threlte/core'
import { plugin } from './plugin'
injectPlugin(plugin)
</script>