Previous:
Adding Event Handlers
{props.children}
)
}
```
Pretty simple.
See the `props.attributes` reference? Slate passes attributes that should be rendered on the top-most element of your blocks, so that you don't have to build them up yourself. You **must** mix the attributes into your component.
And see that `props.children` reference? Slate will automatically render all of the children of a block for you, and then pass them to you just like any other React component would, via `props.children`. That way you don't have to muck around with rendering the proper text nodes or anything like that. You **must** render the children as the lowest leaf in your component.
Now, let's add that renderer to our `Editor`:
```js
function CodeNode(props) {
return (
{props.children}
)
}
class App extends React.Component {
state = {
value: initialValue,
}
onChange = ({ value }) => {
this.setState({ value })
}
onKeyDown = (event, change) => {
if (event.key != '&') return
event.preventDefault()
change.insertText('and')
return true
}
render() {
return (
// Pass in the `renderNode` prop...
{props.children}
)
}
class App extends React.Component {
state = {
value: initialValue,
}
onChange = ({ value }) => {
this.setState({ value })
}
onKeyDown = (event, change) => {
// Return with no changes if it's not the "`" key with ctrl pressed.
if (event.key != '`' || !event.ctrlKey) return
// Prevent the "`" from being inserted by default.
event.preventDefault()
// Otherwise, set the currently selected blocks type to "code".
change.setBlocks('code')
return true
}
render() {
return (
{props.children}
)
}
class App extends React.Component {
state = {
value: initialValue,
}
onChange = ({ value }) => {
this.setState({ value })
}
onKeyDown = (event, change) => {
if (event.key != '`' || !event.ctrlKey) return
event.preventDefault()
// Determine whether any of the currently selected blocks are code blocks.
const isCode = change.value.blocks.some(block => block.type == 'code')
// Toggle the block type depending on `isCode`.
change.setBlocks(isCode ? 'paragraph' : 'code')
return true
}
render() {
return (
Next:
Applying Custom Formatting