<Element />
Defines the Node for a given User Element
Reference​
Props​
isReact.ElementTypeThe User Element to renderidStringRequired if the <Element /> is being created inside a User ComponentcanvasbooleanIf true, a Canvas Node will be created.customRecord<string, any>Sets the Node's custom propertieshiddenbooleanSets the Node's hidden property. If true, this will hide the Node...elementPropsObjectThe props of the element specified in 'is'
Usage​
Configure Nodes in <Frame />​
Since the <Frame /> component creates a Node automatically for all of its children elements, thus the <Element /> component can be used to simply configure the values of the Node that is being created.
import {Craft, Frame, Element} from "@craftjs/core";
const App = () => {
return (
<div>
<h2>My App!</h2>
<Craft resolver={{MyComp}}>
<h2>My Page Editor</h2>
<Frame>
<Element is="div" canvas> // defines the Root Node, droppable
<h2>Drag me around</h2> // Node of type h2, draggable
<MyComp text="You can drag me around too" /> // Node of type MyComp, draggable
<Element is="div" style={{background: "#333" }} canvas> // Canvas Node of type div, draggable and droppable
<p>Same here</p> // Not a Node; not draggable
</Element>
</Element>
</Frame>
</Craft>
</div>
)
}
Defining Linked Nodes​
When used inside a User Component, <Element /> works identically as used inside <Frame /> but because there isn't a Node in-place, thus it has to create a new Linked Node - which is essentially a Node that is linked to the Node of the containing User Component via an arbitary id:
const Hero = () => {
return (
<div>
<h3>I'm a Hero</h3>
<Element id="drop" is={Container} canvas>
<h3>Hi</h3>
</Element>
</div>
)
}
<Element />used inside User Component must specify anidprop
Examples​
Setting custom properties​
User Components may consume custom properties from their corresponding Node. These properties essentially act like additional props.
Let's say we have a Hero component that has a css custom property and as usual, we set its default values via the craft property.
const Hero = () => {
const { css } = useNode(node => ({
css: node.data.custom.css
}));
return (
<div style={css}>
<h3>I'm a Hero</h3>
<Element id="drop" is={Container} canvas>
<h3>Hi</h3>
</Element>
</div>
)
}
Hero.craft = {
custom: {
css: {
background: "#eee"
}
}
}
Now, if you'd like to actually set these values when you call the component, you can do it like so:
<Frame>
<Element is={Hero} custom={{
css: {
background: "#ddd"
}
}} />
</Frame>