{"id":3206,"date":"2022-10-12T11:50:45","date_gmt":"2022-10-12T11:50:45","guid":{"rendered":"https:\/\/www.bohort.nl\/?p=3206"},"modified":"2023-05-05T12:39:21","modified_gmt":"2023-05-05T12:39:21","slug":"vcomp-intro","status":"publish","type":"post","link":"https:\/\/www.bohort.nl\/en\/2022\/10\/12\/vcomp-intro\/","title":{"rendered":"Creating a simple Oracle JET VComponent"},"content":{"rendered":"<h4 class=\"wp-block-heading\">Introduction<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle JavaScript Extension Toolkit (Oracle JET) simplifies the process of building modern web applications through its comprehensive set of open-source JavaScript libraries. A major feature of Oracle JET is the use of VComponents, which enable developers to create modular, maintainable, and high-performance applications using the Virtual DOM (VDOM) architecture. In this blog post, I will walk you through the process of creating a VComponent in Oracle JET step by step.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Prerequisites<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Before you start creating a VComponent in Oracle JET, ensure that you have the following tools and resources:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Node.js and npm (Node Package Manager) installed on your development machine.<\/li>\n\n\n\n<li>Oracle JET CLI (Command Line Interface) installed globally using the command: <code>npm install -g @oracle\/ojet-cli<\/code><\/li>\n\n\n\n<li>An Oracle JET application created using the command: <code>npx @oracle\/ojet-cli create componentDemo --template=basic --vdom<\/code><\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Create a new VComponent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>npx @oracle\/ojet-cli create component demo-component&nbsp;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This command will generate a new VComponent named &#8216;<code>demo-component<\/code>&#8216; with the necessary files, including a TypeScript file (<code>demo-component.tsx<\/code>) and a CSS file (<code>demo-component-styles.css<\/code>).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Define the VComponent&#8217;s structure and appearance<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Open the <code>demo-component.tsx<\/code> file, and you&#8217;ll find a basic structure for your VComponent. You can now define the component&#8217;s structure and appearance using JSX syntax. For example, you can create a simple counter component.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { customElement, ExtendGlobalProps } from &quot;ojs\/ojvcomponent&quot;;import { h, Component, ComponentChild } from &quot;preact&quot;;import componentStrings = require(&quot;ojL10n!.\/resources\/nls\/demo-component-strings&quot;);import &quot;css!.\/demo-component-styles.css&quot;;type Props = {  initialValue?: number;  value?: number;  incrementBy: number;};type State = {  counter: number;}\/** *  * @ojmetadata version &quot;1.0.0&quot; * @ojmetadata displayName &quot;A user friendly, translatable name of the component&quot; * @ojmetadata description &quot;A translatable high-level description for the component&quot;*\/@customElement(&quot;demo-component&quot;)export class DemoComponent extends Component &lt; ExtendGlobalProps &lt; Props &gt;, State&gt; {   static defaultProps: Partial &lt; Props &gt; = {    initialValue:0,    value:null,    incrementBy: 1};private _increment = () =&gt; {  this.setState({    counter: this.state.counter + this.props.incrementBy  });};private _decrement = () =&gt; {  this.setState({    counter: this.state.counter - this.props.incrementBy  });};private _reset = () =&gt; {  this.setState({    counter: this.props.initialValue  });}private getValue(){  let currentValue;  if(this.state.counter===undefined){    this.setState({    counter: this.props.initialValue  })}  currentValue = this.state.counter;  return currentValue;}render(props: Props, state: State): ComponentChild {  const current = this.getValue();  return (    &lt;div&gt;      &lt;button class=&quot;red&quot; onClick={this._decrement}&gt;-&lt;\/button&gt;      &lt;&gt;{current}&lt;\/&gt;      &lt;button class=&quot;green&quot; onClick={this._increment}&gt;+&lt;\/button&gt;      &lt;button onClick={this._reset}&gt;reset&lt;\/button&gt;    &lt;\/div&gt;  );  }}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">customElement<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">ExtendGlobalProps<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ojs\/ojvcomponent&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">Component<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">ComponentChild<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;preact&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">componentStrings<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;ojL10n!.\/resources\/nls\/demo-component-strings&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;css!.\/demo-component-styles.css&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">initialValue<\/span><span style=\"color: #D4D4D4\">?: <\/span><span style=\"color: #4EC9B0\">number<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\">?: <\/span><span style=\"color: #4EC9B0\">number<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">incrementBy<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">number<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">State<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">counter<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">number<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@ojmetadata<\/span><span style=\"color: #6A9955\"> version &quot;1.0.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@ojmetadata<\/span><span style=\"color: #6A9955\"> displayName &quot;A user friendly, translatable name of the component&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@ojmetadata<\/span><span style=\"color: #6A9955\"> description &quot;A translatable high-level description for the component&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">@<\/span><span style=\"color: #4EC9B0\">customElement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;demo-component&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">export<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">DemoComponent<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">extends<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Component<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #4EC9B0\">ExtendGlobalProps<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\"> &gt;, <\/span><span style=\"color: #4EC9B0\">State<\/span><span style=\"color: #D4D4D4\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">static<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">defaultProps<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">Partial<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\"> &gt; = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">initialValue:<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">value:<\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">incrementBy:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">_increment<\/span><span style=\"color: #D4D4D4\"> = () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">counter:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">counter<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">incrementBy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">_decrement<\/span><span style=\"color: #D4D4D4\"> = () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">counter:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">counter<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">incrementBy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">_reset<\/span><span style=\"color: #D4D4D4\"> = () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">counter:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">initialValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getValue<\/span><span style=\"color: #D4D4D4\">(){<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">currentValue<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">counter<\/span><span style=\"color: #D4D4D4\">===<\/span><span style=\"color: #569CD6\">undefined<\/span><span style=\"color: #D4D4D4\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">counter:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">initialValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  })}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">currentValue<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">counter<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">currentValue<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">render<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">State<\/span><span style=\"color: #D4D4D4\">): <\/span><span style=\"color: #4EC9B0\">ComponentChild<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">current<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getValue<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #4EC9B0\">div<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;<\/span><span style=\"color: #9CDCFE\">button<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;red&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">onClick<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">_decrement<\/span><span style=\"color: #D4D4D4\">}&gt;-&lt;\/<\/span><span style=\"color: #4EC9B0\">button<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&gt;{<\/span><span style=\"color: #9CDCFE\">current<\/span><span style=\"color: #D4D4D4\">}&lt;\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;<\/span><span style=\"color: #9CDCFE\">button<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;green&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">onClick<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">_increment<\/span><span style=\"color: #D4D4D4\">}&gt;+&lt;\/<\/span><span style=\"color: #4EC9B0\">button<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;<\/span><span style=\"color: #9CDCFE\">button<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">onClick<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">_reset<\/span><span style=\"color: #D4D4D4\">}&gt;<\/span><span style=\"color: #9CDCFE\">reset<\/span><span style=\"color: #D4D4D4\">&lt;\/<\/span><span style=\"color: #9CDCFE\">button<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;\/<\/span><span style=\"color: #9CDCFE\">div<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we define a simple counter VComponent with two buttons for incrementing and decrementing the count. We also define a <code>Props<\/code> interface to define the initial count value and a <code>State<\/code> interface to manage the component&#8217;s state.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: Style the VComponent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Open the <code>demo-component-styles.css<\/code> file to apply custom styling to your VComponent. For instance, you can add the following CSS rules to style the counter component:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"button {  background-color: #007bff;  color: white;  border: none;  padding: 8px 16px;  margin: 0 8px;  cursor: pointer;}button.red {  background-color: red;  }button.green {  background-color: green;  }\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D7BA7D\">button<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">background-color<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">#007bff<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">color<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">white<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">border<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">none<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">padding<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">8px<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">16px<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">margin<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">8px<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cursor<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">pointer<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">button.red<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">background-color<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">red<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">button.green<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">background-color<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">green<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Step 4: Use the VComponent in your application<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">To use your newly created VComponent, open the TypeScript file of the view where you want to include it, such as <code>src\/ts\/views\/dashboard.tsx<\/code>. First, import the VComponent:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { DemoComponent } from 'demo-component\/loader'\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">DemoComponent<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;demo-component\/loader&#39;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Next, include the VComponent within the render method of the view by adding the custom JSX element. Remember to pass the required properties. In our example, we need to pass the <code>initialValue, and the incrementBy<\/code> prop to the <code>demo-component<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { h, Component } from &quot;preact&quot;;import { customElement, GlobalProps } from 'ojs\/ojvcomponent';import { DemoComponent } from 'demo-component\/loader'export function Content() {  return (    &lt;div class=&quot;oj-web-applayout-max-width oj-web-applayout-content&quot;&gt;        &lt;DemoComponent initialValue={11} incrementBy={1}\/&gt;    &lt;\/div&gt;  );};\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">Component<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;preact&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">customElement<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">GlobalProps<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;ojs\/ojvcomponent&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">DemoComponent<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;demo-component\/loader&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">export<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Content<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;oj-web-applayout-max-width oj-web-applayout-content&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #4EC9B0\">DemoComponent<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">initialValue<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">incrementBy<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #808080\">\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Step 5: Run and test the application<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Now that you have created and included the VComponent in your application, it&#8217;s time to run and test it. In your terminal, navigate to your Oracle JET application&#8217;s root folder and execute the following command:<code> ojet serve<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The application will open in your default web browser. Navigate to the view where you included the <code>demo-component<\/code>, and you should see the counter VComponent with its buttons functioning as expected.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"386\" style=\"aspect-ratio: 1420 \/ 386;\" width=\"1420\" controls src=\"https:\/\/www.bohort.nl\/wp-content\/uploads\/2023\/05\/demo.mov\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Conclusion<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Creating a VComponent in Oracle JET is a straightforward process that allows developers to leverage the benefits of the Virtual DOM architecture, resulting in improved performance and maintainability of web applications. By following these steps, you can create your own custom VComponents to build complex and efficient web applications with Oracle JET.<\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction Oracle JavaScript Extension Toolkit (Oracle JET) simplifies the process of building modern web applications through its comprehensive set of open-source JavaScript libraries. A major feature of Oracle JET is&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[69],"tags":[4,5,70,72,71],"class_list":["post-3206","post","type-post","status-publish","format-standard","hentry","category-oracle-jet","tag-bohort","tag-luc-bors","tag-oracle-jet","tag-vcomponent","tag-vdom"],"_links":{"self":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts\/3206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/comments?post=3206"}],"version-history":[{"count":13,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts\/3206\/revisions"}],"predecessor-version":[{"id":3220,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts\/3206\/revisions\/3220"}],"wp:attachment":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/media?parent=3206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/categories?post=3206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/tags?post=3206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}