<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Progress Telerik</title>
    <description>The latest articles on Forem by Progress Telerik (@progresstelerik).</description>
    <link>https://forem.com/progresstelerik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F242%2F22e53290-29b0-4be1-97ec-258516e70c19.jpg</url>
      <title>Forem: Progress Telerik</title>
      <link>https://forem.com/progresstelerik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/progresstelerik"/>
    <language>en</language>
    <item>
      <title>Angular Basics: How To Get the Value of a Selected Dropdown Menu Item</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 10 Jul 2025 07:51:22 +0000</pubDate>
      <link>https://forem.com/progresstelerik/angular-basics-how-to-get-the-value-of-a-selected-dropdown-menu-item-18ea</link>
      <guid>https://forem.com/progresstelerik/angular-basics-how-to-get-the-value-of-a-selected-dropdown-menu-item-18ea</guid>
      <description>&lt;p&gt;&lt;em&gt;Brought to you by the team behind &lt;a href="https://www.telerik.com/kendo-angular-ui?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Kendo UI for Angular&lt;/a&gt; — a complete set of enterprise-grade Angular components that help you design visually stunning, accessible and high-performing apps faster. Originally published at the &lt;a href="https://www.telerik.com/blogs/angular-basics-how-to-get-value-selected-dropdown-menu-item?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Telerik blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Have you ever had to ask, “How do I get the value of the selected dropdown menu item in Angular?” Let’s answer that!&lt;/p&gt;

&lt;p&gt;In Angular apps, the dropdown is a typical HTML element used in forms and components to allow users to select values. Today, we will learn three ways to get the value of the user’s selected item in a dropdown list with Angular.&lt;/p&gt;

&lt;p&gt;Our three approaches are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using a change event&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;ngModel&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;ViewChild&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our example app has three components with the same HTML markup, a dropdown with a list of NBA teams, and one property, selectedTeam, on the TypeScript file. We will implement each solution to assign the selected value from the dropdown to the selectedTeam variable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TeamWithChangeEventComponent: Uses the HTML change event and template reference.&lt;/li&gt;
&lt;li&gt;TeamUsingViewChildComponent: Uses the viewChild decorator and template reference.&lt;/li&gt;
&lt;li&gt;TeamWithNgmodelComponent: Uses the ng-model directive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The HTML markup looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }} using viewChild&amp;lt;/p&amp;gt;
    &amp;lt;select #teams (change)="onSelected()"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the TypeScript file will have the variable selectedTeam.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    selectedTeam = '';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s work with the first solution TeamWithChangeEventComponent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Change Event and Template Reference Variables
&lt;/h2&gt;

&lt;p&gt;To work with this approach, we first use HTML reference variables to read the value and the dropdown event change, listen when the user changes the selection in the dropdown, and create a new method onSelected to assign the value to selectedTeam.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How to Build Modern Angular Dropdowns in Minutes with Kendo UI&lt;/strong&gt;&lt;br&gt;
Go beyond HTML select by &lt;a href="https://www.telerik.com/blogs/learn-how-to-build-modern-angular-dropdowns-minutes-kendo-ui?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;learning how to implement modern dropdowns&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, create the template variables for dropdown using #teams. Use the event binding to listen for the change event and link with the onSelect method.&lt;/p&gt;

&lt;p&gt;The onSelect method receives the reference variable and takes the value of the dropdown element.&lt;/p&gt;

&lt;p&gt;The code will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }} using change event&amp;lt;/p&amp;gt;
    &amp;lt;select #teams (change)="onSelected(teams.value)"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create the onSelected(value) method in the TypeScript file. Take the value as a parameter and assign it to the selectedTeam variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Component } from '@angular/core';
@Component({
    selector: 'app-team-with-change-event',
    templateUrl: './team-with-change-event.component.html',
    styleUrls: ['./team-with-change-event.component.css'],
})
export class TeamWithChangeEventComponent {
    selectedTeam = '';
    onSelected(value:string): void {
        this.selectedTeam = value;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Does It Work?
&lt;/h3&gt;

&lt;p&gt;Angular uses event binding to link the method, and it gets the value from the parameter because it uses template reference to gain access to the dropdown HTML element.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can read more about &lt;a href="https://angular.io/guide/template-reference-variables" rel="noopener noreferrer"&gt;template reference variables&lt;/a&gt; and &lt;a href="https://angular.io/guide/event-binding" rel="noopener noreferrer"&gt;event binding in Angular&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, using the viewChild—let’s do it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Using viewChild and Template Reference Variable
&lt;/h2&gt;

&lt;p&gt;The new approach uses the @ViewChild decorator and template reference variables. In the new scenario, we create the template reference variable for the teams dropdown using #teams and listen for the (change) event. However, the method onSelected doesn’t require passing the value with a slight change.&lt;/p&gt;

&lt;p&gt;The HTML looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }} using viewChild&amp;lt;/p&amp;gt;
    &amp;lt;select #teams (change)="onSelected()"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt; 
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our TypeScript file, add the variable teams, using the decorator @ViewChild with type ElementRef and create the method onSelected() without parameters. But using the reference of teams, we can read the value of the reference of teams and assign it to the variable.&lt;/p&gt;

&lt;p&gt;The code will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Component, ElementRef, ViewChild } from '@angular/core';
@Component({
    selector: 'app-team-using-view-child',
    templateUrl: './team-using-view-child.component.html',
    styleUrls: ['./team-using-view-child.component.css'],
})
export class TeamUsingViewChildComponent {
    @ViewChild('teams') teams!: ElementRef;
    selectedTeam = '';
    onSelected():void {
        this.selectedTeam = this.teams.nativeElement.value;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  But How Does It Work?
&lt;/h3&gt;

&lt;p&gt;The ElementRef is a wrapper for the DOM HTML element, and the property nativeElement has a reference to the DOM object. Using the @ViewChild decorator, we get ElementRef in the component class.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to read more about the &lt;a href="https://v17.angular.io/api/core/ViewChild" rel="noopener noreferrer"&gt;ViewChild decorator&lt;/a&gt; and &lt;a href="https://v17.angular.io/api/core/ElementRef#description" rel="noopener noreferrer"&gt;ElementRef&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using NgModel Directive
&lt;/h2&gt;

&lt;p&gt;Angular has another way to get the selected value in the dropdown using the power of ngModel and two-way data binding.&lt;/p&gt;

&lt;p&gt;The ngModel is part of the forms module. We need to import it into the NgModule list in the app.module, which will be available in our app.&lt;/p&gt;

&lt;p&gt;The ngModel directive helps us listen and update variables when the event changes trigger, and to use it, add the ngModel using [(ngModel)]="selectedTeam".&lt;/p&gt;

&lt;p&gt;Angular automatically gets the value and updates the variable selectedTeam using the ngModel approach when the user changes the value. We don’t need to create the onSelected method in our TypeScript file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The change Event&amp;lt;/p&amp;gt;
    &amp;lt;select [(ngModel)]="selectedTeam"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Does It Work?
&lt;/h3&gt;

&lt;p&gt;First, the ngModel directive uses the ControlValueAccessor, because Angular provides access to all HTML form elements like input, select and checkbox by default. It sends the value, and the two-way data binding creates the link between the value and the variable.&lt;/p&gt;

&lt;p&gt;If you want to read more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v17.angular.io/api/forms/NgModel" rel="noopener noreferrer"&gt;NgModel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v17.angular.io/guide/two-way-binding#how-two-way-binding-works" rel="noopener noreferrer"&gt;Two-way data binding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v17.angular.io/api/forms/SelectControlValueAccessor" rel="noopener noreferrer"&gt;SelectControlValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://v17.angular.io/api/forms/ControlValueAccessor" rel="noopener noreferrer"&gt;ControlValueAccessor&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We built three different ways to work with dropdowns in our apps. You can find a full code example for this article and play with the example app in the following links:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/danywalls/dropdowns-in-angular" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackblitz.com/edit/angular-ivy-mdajjb?file=src%2Findex.html" rel="noopener noreferrer"&gt;StackBliz&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to save your time and create fast and advanced dropdowns, then I recommend visiting the article about &lt;a href="https://www.telerik.com/blogs/learn-how-to-build-modern-angular-dropdowns-minutes-kendo-ui?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Angular Dropdowns in Minutes with Kendo UI&lt;/a&gt;—it shows you how to use &lt;a href="https://www.telerik.com/kendo-angular-ui/components/dropdowns/dropdownlist?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Angular DropDownList&lt;/a&gt; in your apps.&lt;/p&gt;

&lt;p&gt;Thanks for your time. I hope you can see how many ways there are to work with dropdowns and pick the best for your app.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Can We Make Open Source More Sustainable?</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Fri, 06 Mar 2020 04:58:47 +0000</pubDate>
      <link>https://forem.com/progresstelerik/can-we-make-open-source-more-sustainable-101a</link>
      <guid>https://forem.com/progresstelerik/can-we-make-open-source-more-sustainable-101a</guid>
      <description>&lt;p&gt;If you’re a software developer, you might not realize that the economics behind open source make zero sense to most people.&lt;/p&gt;

&lt;p&gt;For example, consider this conversation I had with a normal person a few days ago.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me: “Sorry I’m a bit late. Crazy day at work”.&lt;/p&gt;

&lt;p&gt;Friend: “Ah, no worries, what’s up though?”&lt;/p&gt;

&lt;p&gt;Me: “We’re just trying to decide between three different JavaScript frameworks for that project, and the deadline is next week so we have to pick soon.&lt;/p&gt;

&lt;p&gt;Friend: “Ah, gotcha. Well which framework is the cheapest?”&lt;/p&gt;

&lt;p&gt;Me: “Oh they’re all free.”&lt;/p&gt;

&lt;p&gt;Friend:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In most industries you pay for tools that help you do your job, yet in the software world—a world where there’s a ton of money involved—most of us build apps using a variety of free tools.&lt;/p&gt;

&lt;p&gt;The most popular text editor? Visual Studio Code—free. The most popular source-control provider? git—free. The most popular JavaScript libraries? React, Angular, Vue, and their competitors—all free. Although paid software very much exists, it’s amazing how much of our critical infrastructure has moved to free and open-source software over the last handful of years.&lt;/p&gt;

&lt;p&gt;And although this switch to free-and-open-source tools has been enormously beneficial for developers, and for software in general, this same shift has also had consequences. In this article I’ll discuss one of those consequences: a problematic economic model, and I’ll discuss what I think we can do about it.&lt;/p&gt;

&lt;p&gt;Let’s start this discussion by taking a brief look at how we ended up with the open-source model we have today.&lt;/p&gt;

&lt;h2&gt;
  
  
  How did this happen?
&lt;/h2&gt;

&lt;p&gt;To give you a sense of how much times have changed, here are a few &lt;a href="https://www.cnet.com/news/microsoft-raps-open-source-approach/" rel="noopener noreferrer"&gt;quotes from Microsoft executives&lt;/a&gt; from the early 2000s that haven’t aged well.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Open source is an intellectual-property destroyer. I can't imagine something that could be worse than this for the software business and the intellectual-property business.”&lt;/p&gt;

&lt;p&gt;— Jim Allchin, former Windows chief&lt;/p&gt;

&lt;p&gt;“As history has shown, while this type of model (open source) may have a place, it isn't successful in building a mass market and making powerful, easy-to-use software broadly accessible to consumers”&lt;/p&gt;

&lt;p&gt;— Craig Mundie, former Microsoft senior vice president&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although it’s easy to laugh at these quotes today, they weren’t very radical opinions at the time. Even though open source was already an established and growing concept by 2000, most companies primarily used paid solutions to build applications.&lt;/p&gt;

&lt;p&gt;I started my career in software in the early 2000s, and my first job involved an IBM-based IDE for writing Java code, a proprietary source-control solution that I’d prefer not to remember, and an IBM mainframe to host our production apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Frad-developer.jpg%3Fsfvrsn%3Db10fb693_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Frad-developer.jpg%3Fsfvrsn%3Db10fb693_0" title="rad-developer" alt="rad-developer" width="1366" height="768"&gt;&lt;/a&gt; &lt;em&gt;IBM’s Rational Application Developer. I used it in the early 2000s, and it’s still around today.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All of these tools cost money—a lot of money—but they were deemed an acceptable expense because the tools provided enough value to warrant their cost.&lt;/p&gt;

&lt;p&gt;The switch to open source happened slowly throughout the following decade. Companies increasingly realized that open-source tools like MySQL and Apache were not only viable, but oftentimes better than the commercial products they were paying big money for.&lt;/p&gt;

&lt;p&gt;My personal experience for this transformation was on the web, which in the mid 2000s was the wild west compared to the web we have today. Web developers were tasked with supporting a dizzying set of browsers, ranging from the newly released Internet Explorer 7, to the venerable IE6, as well as Firefox, an open-source browser that was starting to challenge Microsoft’s stranglehold on the browser market.&lt;/p&gt;

&lt;p&gt;The tools developers built to manage the complexity of cross-browser development included the likes of Dojo, MooTools, jQuery, and many others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-2007.png%3Fsfvrsn%3D155cc26e_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-2007.png%3Fsfvrsn%3D155cc26e_0" title="jquery-2007" alt="jquery-2007" width="867" height="744"&gt;&lt;/a&gt;&lt;em&gt;The jQuery homepage in June of 2007&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And while these frameworks took different approaches and used different APIs, they had one important thing in common: they were all free and open source.&lt;/p&gt;

&lt;p&gt;Whereas more established development ecosystems—Java, .NET, etc—were still conflicted about the benefits of open source, the web was built on free-and-open-source software from its onset.&lt;/p&gt;

&lt;p&gt;This was a boon to new web developers like me, as it meant I could instantly start tinkering with Dojo and jQuery at home, and even start using them at my corporate day job—a place where I was used to paying for the software tools I needed.&lt;/p&gt;

&lt;p&gt;And it wasn’t just me who jumped at the chance to use these new libraries. jQuery usage exploded in the late 2000s, and created an enormous ecosystem of jQuery plugins that built upon what jQuery had started. The overwhelming majority of these plugins were free and open source, as that had become the expectation for any web framework or plugin by this point.&lt;/p&gt;

&lt;p&gt;This new generation of web software inspired a lot of developers—myself included—and helped build the web into the dominant platform it is today. But this expectation that all software must be free and open-source helped to create one problem we have with open source today: a problematic economic and funding structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source and economics
&lt;/h2&gt;

&lt;p&gt;Open source projects often start as a passion project for an individual or a small group, which they then share with the world for free. The fact that this is commonplace in the software world is actually kind of awesome.&lt;/p&gt;

&lt;p&gt;But that doesn’t mean that the work these developers do is 100% altruistic. The primary incentive to working on an open-source project today is career advancement. For example, many former members of the jQuery team now have prominent roles at major tech companies. Several &lt;a href="https://www.freecodecamp.org/news/between-the-wires-an-interview-with-mootools-contributors-33d764957575/" rel="noopener noreferrer"&gt;MooTools contributors now work on React at Facebook&lt;/a&gt;. Personally, I worked on jQuery UI for two years, and that involvement helped me get the job I have today at Progress.&lt;/p&gt;

&lt;p&gt;There’s nothing inherently wrong with career advancement as the primary incentive to work on open source, but it can become problematic when the project author(s) achieve some success. Because, as it turns out, once you’ve achieved whatever notoriety you had in mind, suddenly dealing with random GitHub issues no longer feels like the best way to spend your Saturday nights.&lt;/p&gt;

&lt;p&gt;In this situation, many developers try to gather donations to cover their time and effort. For example, if you look back at jQuery’s site from 2007, notice how there was already a donation button on the bottom-left corner of the screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-donate.png%3Fsfvrsn%3D4af4047f_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-donate.png%3Fsfvrsn%3D4af4047f_0" title="jquery-donate" alt="jquery-donate" width="867" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Dojo project had a similar donation on their site dating back to the same time frame.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdojo8a822851ffc24038a6a8493ae905b5bf.png%3Fsfvrsn%3D529ff8bf_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdojo8a822851ffc24038a6a8493ae905b5bf.png%3Fsfvrsn%3D529ff8bf_0" title="dojo" alt="dojo" width="981" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, these calls for donations more typically happen through Patreon, or through some form of sponsorship, which projects like ESLint and Vue.js use. Perhaps the most notorious example occurs in the popular &lt;a href="https://github.com/zloirock/core-js" rel="noopener noreferrer"&gt;core-js library&lt;/a&gt;, which includes an overt donation request every time you install the library, and which has generated &lt;a href="https://github.com/zloirock/core-js/issues/548" rel="noopener noreferrer"&gt;some controversy&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
&amp;gt; https://opencollective.com/core-js 
&amp;gt; https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In an even more controversial move, last year the &lt;a href="https://github.com/standard/standard" rel="noopener noreferrer"&gt;Standard JavaScript project&lt;/a&gt; &lt;a href="https://www.zdnet.com/article/popular-javascript-library-starts-showing-ads-in-its-terminal/" rel="noopener noreferrer"&gt;started showing ads every time you installed its package&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I guess we now live in the post-"ads in the npm install log" era &lt;a href="https://t.co/pSnBnMDNSg" rel="noopener noreferrer"&gt;pic.twitter.com/pSnBnMDNSg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Quine atom (@qntm) &lt;a href="https://twitter.com/qntm/status/1165344132728066048?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;August 24, 2019&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you might expect, &lt;a href="https://github.com/standard/standard/issues/1381" rel="noopener noreferrer"&gt;developers weren’t too happy about the ad&lt;/a&gt;, and &lt;a href="https://www.zdnet.com/article/npm-bans-terminal-ads/" rel="noopener noreferrer"&gt;npm quickly took action&lt;/a&gt;—banning any package that “display ads at runtime, on installation, or at other stages of the software development lifecycle, such as via npm scripts.”&lt;/p&gt;

&lt;p&gt;Regardless of what you think about ads in your npm logs, there’s one thing we can probably all agree on: from an economics perspective, the idea that authors want money for their work shouldn’t be surprising at all.&lt;/p&gt;

&lt;p&gt;In today’s open-source world there’s a massive disconnect between the amount of value projects like core-js and Standard provide, and the financial proceeds maintainers earn in return for their effort.&lt;/p&gt;

&lt;p&gt;With that background in mind, let’s look at what I believe are three different ways we could attempt to solve this funding gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 1: Foundations
&lt;/h2&gt;

&lt;p&gt;The oldest solution to open-source funding comes in the form of foundations. The most well-known foundation is the &lt;a href="https://www.linuxfoundation.org" rel="noopener noreferrer"&gt;Linux Foundation&lt;/a&gt;, which was founded in 2000, and which today has &lt;a href="https://www.linuxfoundation.org/membership/members/" rel="noopener noreferrer"&gt;a crazy number of corporate members&lt;/a&gt;. The foundation supports some of the biggest open-source projects out there, from Linux itself, to Node.js, to jQuery, and just about everything in between.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Flinux-foundation-projects.png%3Fsfvrsn%3Dd869e8de_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Flinux-foundation-projects.png%3Fsfvrsn%3Dd869e8de_0" title="linux-foundation-projects" alt="linux-foundation-projects" width="1495" height="1033"&gt;&lt;/a&gt;&lt;em&gt;The Linux Foundation supports development on a &lt;a href="https://www.linuxfoundation.org/projects/" rel="noopener noreferrer"&gt;ton of projects&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Although the Linux Foundation is the largest software foundation, there are a variety of others for more specialized software technologies or fields. For example, the &lt;a href="https://dotnetfoundation.org/" rel="noopener noreferrer"&gt;.NET Foundation&lt;/a&gt; helps support .NET projects, and &lt;a href="https://www.finos.org/" rel="noopener noreferrer"&gt;FINOS&lt;/a&gt;, the Fintech Open Source Foundation, supports open-source projects in the financial space.&lt;/p&gt;

&lt;p&gt;Although these foundations have done unquestionable good, and are the reason that big open-source projects like Linux stay maintained, they’re not a silver-bullet solution to solving open-source funding.&lt;/p&gt;

&lt;p&gt;Perhaps the biggest issue with foundations is the sheer breadth of projects they support. If you’re a company and you pay money to join a foundation—and it’s usually a whole lot of money—you’re relying on the foundation to allocate those funds into the individual open-source projects appropriately. And when there are a crazy number of projects these foundations support, there’s no guarantee that your money will go to projects your company uses or cares about. There’s also some chance that your money will go into a competitor’s open source project or initiative.&lt;/p&gt;

&lt;p&gt;Because of this, I see foundations as an excellent solution for large established projects, such as Linux, Node.js and jQuery, but less useful for less-established open-source projects. But the good news is, there’s another model aimed at these smaller projects that’s gotten a lot of attention lately: subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 2: Subscriptions
&lt;/h2&gt;

&lt;p&gt;Subscriptions have long been a popular way for open-source project authors to raise money to support their work.&lt;/p&gt;

&lt;p&gt;In the early 2000s, services like PayPal were popular for one-time donations and recurring payments. More recently, Patreon popularized a subscription model for funding open-source projects, and a number of different subscription platforms now compete to provide a similar service.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://opencollective.com/" rel="noopener noreferrer"&gt;Open Collective platform&lt;/a&gt; launched in 2016, offering a funding model that revolves around public donations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fopen-collective.png%3Fsfvrsn%3D4ab3732e_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fopen-collective.png%3Fsfvrsn%3D4ab3732e_0" title="open-collective" alt="open-collective" width="1333" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, an impressive set of projects use Open Collective, including projects like &lt;a href="https://opencollective.com/bootstrap" rel="noopener noreferrer"&gt;Bootstrap&lt;/a&gt; and &lt;a href="https://opencollective.com/core-js" rel="noopener noreferrer"&gt;core-js&lt;/a&gt;. Because the donations on Open Collective are public, they provide a rare view into how much money some of these projects actually take in. For example, here are the top financial contributors to Bootstrap on Open Collective.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fbootstrap-funding.png%3Fsfvrsn%3D7b92f20_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fbootstrap-funding.png%3Fsfvrsn%3D7b92f20_0" title="bootstrap-funding" alt="bootstrap-funding" width="1027" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I like about this model is it offers an incentive for organizations to sponsor projects—and that incentive is appearing on the list of top financial contributors. For example, I had no idea what Segment was, but I looked up the service after seeing they were the No. 2 funder of Bootstrap.&lt;/p&gt;

&lt;p&gt;Open Collective is not the only player in this space, as last year GitHub debuted &lt;a href="https://github.com/sponsors" rel="noopener noreferrer"&gt;GitHub Sponsors&lt;/a&gt;, an open-source sponsorship program built into GitHub itself. GitHub has a pretty big competitive advantage for making GitHub Sponsors succeed, as GitHub itself has been the canonical place to host open-source projects over the last decade.&lt;/p&gt;

&lt;p&gt;To GitHub’s credit though, they do take steps to ensure their program gets positioned alongside competing donation services. For example, any project on GitHub can now create a &lt;code&gt;.github/FUNDING.yml&lt;/code&gt; file, and in that file you can &lt;a href="https://help.github.com/en/github/administering-a-repository/displaying-a-sponsor-button-in-your-repository" rel="noopener noreferrer"&gt;list all the sponsorship options your repository offers&lt;/a&gt;—whether those options are GitHub Sponsors or not.&lt;/p&gt;

&lt;p&gt;If you do, GitHub will display a “sponsor” button on your repository, which lists all those sponsorship options for your users. For example, here’s what that process looks like for the &lt;a href="https://github.com/zloirock/core-js" rel="noopener noreferrer"&gt;core-js GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fsponsorship-flow.png%3Fsfvrsn%3D5b2283a7_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fsponsorship-flow.png%3Fsfvrsn%3D5b2283a7_0" title="sponsorship-flow" alt="sponsorship-flow" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last service I want to discuss appears last in the screenshot above, &lt;a href="https://dev.to(https:)"&gt;Tidelift&lt;/a&gt;, which has a rather unique offering. Tidelift is a ~$1,500 monthly subscription product that provides something they call “managed open source,” which Tidelift’s website describes in three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;. We provide tools to keep track of all the dependencies you use, flag issues, and enforce policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management&lt;/strong&gt;. We manage core, mission-critical packages on your behalf, including researching and resolving issues so you don't have to anymore&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainers&lt;/strong&gt;. We recruit maintainers for many important projects and pay them to proactively prevent problems and address the root causes of issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m a bit skeptical of this approach, both because it feels like an indirect way of supporting open-source maintainers, and because I don’t see much incentive for companies to subscribe. Nevertheless, I do like that there are companies out there trying innovative new ways to create a different open-source funding model. And I should also note that &lt;a href="https://news.crunchbase.com/news/tidelift-raises-25m-series-b-just-seven-months-after-last-funding/" rel="noopener noreferrer"&gt;Tidelift has raised a shocking $40 million dollars in funding&lt;/a&gt;, so there are investors out there that think Tidelift’s model has some real potential.&lt;/p&gt;

&lt;p&gt;Overall, perhaps the biggest reason to be optimistic about the future of subscription services is the current number of competitors. More competitors means more ideas, and if economics works like it should, the best ideas will find their way to more and more projects. And the fact that GitHub is now involved, and providing &lt;strong&gt;sponsor&lt;/strong&gt; buttons on repositories, will help ensure that these sponsorship services remain visible.&lt;/p&gt;

&lt;p&gt;The reason to be pessimistic about subscription services is they rely heavily on goodwill. Convincing companies to donate money is not easy, and even though these subscription services offer incentives, such as appearing on a list of top donors, I believe they’ll need to offer companies more in return for their cash.&lt;/p&gt;

&lt;p&gt;Before wrapping up our tour of open-source funding solutions, I want to discuss one final option you might not have thought about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 3: Paying for software
&lt;/h2&gt;

&lt;p&gt;In researching this article I read a lot of opinions on how to fix open-source economics, and none of them included the simplest economic solution: having companies pay for the software they use directly.&lt;/p&gt;

&lt;p&gt;I have a lot of personal experience with both free and paid software, as I’ve spent my career with both, and over time I’ve gone from a die-hard open-source fan, to being far more pragmatic about when paying for software makes sense—largely because I’ve seen the difficulty of funding open-source projects firsthand.&lt;/p&gt;

&lt;p&gt;I was a member of the free-and-open-source &lt;a href="https://jqueryui.com/" rel="noopener noreferrer"&gt;jQuery UI&lt;/a&gt; project for two years, and am proud that our components helped web developers around the world build better apps. But at the same time, I also saw that when maintainers’ interest goes away, and when sponsorship money can no longer cover the bills, a project can quickly die off. Today, jQuery UI is technically part of the Linux Foundation, but the project’s last release happened in 2016.&lt;/p&gt;

&lt;p&gt;I then worked as part of the free-and-open-source &lt;a href="https://www.nativescript.org/" rel="noopener noreferrer"&gt;NativeScript&lt;/a&gt; project for five years, and our framework has helped tons of JavaScript developers build iOS and Android apps. But while working on NativeScript I learned how hard it is to finance a framework when you make no money directly—especially when you compete with the likes of Facebook’s React Native and Google’s Flutter, companies that have a seemingly endless budget and zero revenue goals.&lt;/p&gt;

&lt;p&gt;As a contrast to my work on jQuery UI and NativeScript, for the last several months I’ve switched over to work on the &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact team&lt;/a&gt;, where we sell premium UI components to React developers. Whereas with jQuery UI and NativeScript I had trouble explaining the finances around everything I did, with KendoReact it’s quite simple: developers pay us money, and in return, we give them a suite of awesome user interface components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkendo-react.png%3Fsfvrsn%3D64457c1d_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkendo-react.png%3Fsfvrsn%3D64457c1d_0" title="kendo-react" alt="kendo-react" width="1342" height="1057"&gt;&lt;/a&gt;&lt;em&gt;A sample app showing off several KendoReact UI components. You can try it for yourself &lt;a href="https://telerik.github.io/kendo-react-finance-portfolio/#/stocks" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Paid software has a number of benefits. By paying, you get a number of assurances you don’t from a random project you find on GitHub—for example guaranteed updates, more consistent APIs, and a company you can get contact when things inevitably go wrong.&lt;/p&gt;

&lt;p&gt;That doesn’t mean that paid software is perfect. Charging money for software makes it harder to build a community, as you’ll never have as many paying customers as you will have free users. Receiving payments also requires you to have some corporate infrastructure, which can be onerous for small projects.&lt;/p&gt;

&lt;p&gt;For these reasons I’m not suggesting that all, or even most software charge money. Open source software has done a lot of good for the world, and should continue to be the way we develop most of our software. But I do believe that paid software has a place, and shouldn’t be something that developers immediately reject out of principle.&lt;/p&gt;

&lt;p&gt;Along with foundations and donations, charging money for software should be seen as a viable way to fund software projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;In today’s software world there’s a huge disconnect between the value open-source projects provide, and the financial compensation they receive in return.&lt;/p&gt;

&lt;p&gt;This disconnect has spurred the creation of a number of services to attempt to make open-source economics more sane. Foundations help ensure large open-source projects continue to run, and subscription services can help smaller open-source project maintainers pay their bills.&lt;/p&gt;

&lt;p&gt;My hope is that, in general, we can encourage companies to increasingly pay for the software they use. These payments can come in the form of foundation memberships, subscriptions to open-source projects, or through payments to the software they use directly. Hopefully, the ongoing innovation in this space will help make these payments easier, and encourage more corporations to give back to an industry they benefit from enormously. If they do, it’ll help us explain how open source works to our friends and families a lot easier.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Use the KendoReact Editor</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 05 Jun 2019 15:48:47 +0000</pubDate>
      <link>https://forem.com/progresstelerik/how-to-use-the-kendoreact-editor-2900</link>
      <guid>https://forem.com/progresstelerik/how-to-use-the-kendoreact-editor-2900</guid>
      <description>&lt;p&gt;The editor is a powerful and versatile component of KendoReact, making it easy to add and format text and other HTML content. Learn how to use and customize it in your React apps.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/" rel="noopener noreferrer"&gt;Editor&lt;/a&gt; component in &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; is a full-featured, highly customizable WYSIWYG rich text editor that can be integrated wherever you need to provide HTML editing (CMS, forums, ticketing systems, mail clients, chat clients, etc). It enables users to input free-form text, apply a large spectrum of formatting options, and insert HTML content such as images, tables, and hyperlinks.&lt;/p&gt;

&lt;p&gt;The Editor offers a large set of built-in tools. You can also add custom tools, change the rendering of all the editor's elements (custom rendering) and extend the built-in functionality by adding plugins. The Editor, like all other components in the KendoReact UI library, is built in TypeScript.&lt;/p&gt;

&lt;p&gt;In this blog post, I will show you how to use the Editor, and we will go through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting Started with the KendoReact Editor&lt;/li&gt;
&lt;li&gt;How to Customize the React Text Editor's Built-In Tools&lt;/li&gt;
&lt;li&gt;How to Implement Custom Tools into the KendoReact Editor&lt;/li&gt;
&lt;li&gt;Why Sanitize Pasted Content?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started with the KendoReact Editor
&lt;/h2&gt;

&lt;p&gt;First, you need to import the &lt;code&gt;Editor&lt;/code&gt; component and &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/api/" rel="noopener noreferrer"&gt;&lt;u&gt;&lt;code&gt;EditorTools&lt;/code&gt;&lt;/u&gt;&lt;/a&gt; module from the package, &lt;a href="https://www.npmjs.com/package/@progress/kendo-react-editor" rel="noopener noreferrer"&gt;@progress/kendo-react-editor&lt;/a&gt;. Then, get the needed tools from &lt;code&gt;EditorTools&lt;/code&gt; and pass them into the &lt;code&gt;tools&lt;/code&gt; prop of the Editor. Setting initial content happens through the &lt;code&gt;defaultContent&lt;/code&gt; prop. Getting content from the &lt;code&gt;Editor&lt;/code&gt; or setting new content happens using the helper &lt;code&gt;getHtml()&lt;/code&gt; and &lt;code&gt;setHtml()&lt;/code&gt; functions exported by the &lt;code&gt;EditorUtils&lt;/code&gt; module.&lt;/p&gt;

&lt;p&gt;Up to this point, you don't need to know how the Editor manages its content or how the tools work. If your project requires customization or needs the Editor's functionality to be extended though, keep reading as we dive into the different ways you can customize or extend the functionality of the Editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Customize the React Text Editor's Built-In Tools
&lt;/h2&gt;

&lt;p&gt;There are two ways for customizing this editor's built-in tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using the Editor's utility functions for generating tools&lt;/li&gt;
&lt;li&gt;Wrapping the tool into a &lt;a href="https://reactjs.org/docs/higher-order-components.html" rel="noopener noreferrer"&gt;higher-order component&lt;/a&gt; (HOC) function, through which to add the new props you need&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Using the Editor's Utility Functions for Generating Tools
&lt;/h3&gt;

&lt;p&gt;All the Editor's tools are React components and are generated by a corresponding HOC function. Each tool also has a settings object which is being passed to its generation function as a parameter. The Editor package exports both the functions and the settings needed for tool generation. For example, the Bold tool has been created in the following way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { EditorToolsSettings, EditorTools } from '@progress/kendo-react-editor';
const BoldTool = EditorTools.createInlineFormatTool(EditorToolsSettings.bold);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passing a modified version of &lt;code&gt;EditorToolsSettings.bold&lt;/code&gt; to &lt;code&gt;EditorTools.createInlineFormatTool()&lt;/code&gt; will create a custom tool. Here's how the default settings of the Bold tool look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const boldSettings = {
  mark: 'strong', // toggle the 'STRONG' tag
  altMarks: ['b'], // recognize the 'B' tag also as Bold

  // recognize an inline node with font-weight style and a
  // value matching the regular expression
  altStyle: { name: 'font-weight', value: /^(bold(er)?|[5-9]\d{2,})$/ },

  // props which will be passed to the Button component of the tool
  props: {
    icon: 'bold',
    type: 'button'
  }
};

// The messages keys used by the tool for localization. See
// also https://www.telerik.com/kendo-react-ui/components/editor/globalization/#toc-messages

{
  messages: {
    title: 'editor.bold'
  },

  // the name of the command that the tool executes
  commandName: 'Bold'
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach allows you to easily modify the appearance and behavior of the tools without having to learn in-depth how the whole component is built. Follow this link for a full &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/tools/" rel="noopener noreferrer"&gt;list of settings and functions for Editor tool generation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping the Tool into a HOC
&lt;/h3&gt;

&lt;p&gt;The HOC will extend the props of the desired tool and return the custom tool. Then add the HOC function into your tools collection. Simple as that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const CustomBold = (props) =&amp;gt; {
  return (
    &amp;lt;Bold
      {...props}
      title="Custom Bold"
    /&amp;gt;
  );
};

&amp;lt;Editor
  tools={[
    [CustomBold, /* ... */]
  ]}
  &amp;lt;!-- ... --&amp;gt;
/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Currently, the props of all tools extend the &lt;a href="https://www.telerik.com/kendo-react-ui/components/buttons/button/" rel="noopener noreferrer"&gt;KendoReact Button&lt;/a&gt; and &lt;a href="https://www.telerik.com/kendo-react-ui/components/dropdowns/dropdownlist/" rel="noopener noreferrer"&gt;DropDownList&lt;/a&gt; props. In our case, the props that are available for our custom tool are listed in the &lt;a href="https://www.telerik.com/kendo-react-ui/components/buttons/api/ButtonProps/" rel="noopener noreferrer"&gt;ButtonProps&lt;/a&gt; interface. In other words, when it comes to customizing the tools, you can also configure everything that the KendoReact Button or DropDownList allows.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Implement Custom Tools into the KendoReact Editor
&lt;/h2&gt;

&lt;p&gt;The above approach for customizing built-in tools can also be used for generating new tools. For example, if we take the Bold tool settings and change the &lt;code&gt;mark&lt;/code&gt; to &lt;code&gt;'code'&lt;/code&gt;, &lt;code&gt;props.icon&lt;/code&gt; to &lt;code&gt;'code-snippet'&lt;/code&gt;, and remove &lt;code&gt;altMarks&lt;/code&gt; and &lt;code&gt;altStyle&lt;/code&gt; fields, we can generate an entirely different tool that will toggle the &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt; element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const codeSnippetSettings = {
  mark: 'code', // toggle the 'code' tag
  props: {
    icon: 'code-snippet',
    type: 'button'
  },
  messages: {},
  commandName: 'Code'
};

const CodeTool = EditorTools.createInlineFormatTool(codeSnippetSettings);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Editor's package also exports all the functionality that is used from the built-in tools, which includes functions for formatting, inserting content and others. This allows you to create your own tools for which the foundations have been already laid out (i.e. how to insert HTML content or apply formatting).&lt;/p&gt;

&lt;p&gt;Here is an example of our custom code tool and a few more tools for formatting and inserting content:&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Sanitize Pasted Content?
&lt;/h2&gt;

&lt;p&gt;Pasted HTML content could look quite ugly, especially if copied from MS Word. Lists are presented as styled paragraphs, and content could contain invalid HTML styles, comments and XML strings.&lt;/p&gt;

&lt;p&gt;In our experience, people are not always happy with the built-in paste functionality. They often have project-specific requirements, which need to be handled externally. For this reason, we have decided to move the format-stripping functionality outside of the Editor, so everyone can play with the code and edit it as needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Theming
&lt;/h3&gt;

&lt;p&gt;As with all KendoReact UI components for React, the Editor can also be styled in all three out-of-the-box themes: Bootstrap theme, Material, and our own Default theme. If you are working within your own design system/theme, you can easily customize the Editor's styling using CSS or create your own theme using the &lt;a href="https://themebuilder.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact ThemeBuilder&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;For the Editor, we have decided to use an external engine instead of implementing our own from scratch. Since HTML editing has been here for a while, currently there are a lot of available engines to work with, and there is no value added in starting an Editor from scratch. After evaluating the available options, we decided that the &lt;a href="http://prosemirror.net/" rel="noopener noreferrer"&gt;ProseMirror&lt;/a&gt; toolkit is the right choice for our use case. It is very powerful and written in pure JavaScript.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/" rel="noopener noreferrer"&gt;Editor&lt;/a&gt; in KendoReact is a versatile WYSIWYG rich text editor whose functionality can be customized or extended to meet any project requirements. Built specifically for React, it is as fast and lightweight as the framework itself and can save you a lot of development time.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>kendoreact</category>
      <category>editor</category>
    </item>
    <item>
      <title>A Look Back at React Europe 2019 in Paris</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 29 May 2019 15:54:43 +0000</pubDate>
      <link>https://forem.com/progresstelerik/a-look-back-at-react-europe-2019-in-paris-194m</link>
      <guid>https://forem.com/progresstelerik/a-look-back-at-react-europe-2019-in-paris-194m</guid>
      <description>&lt;p&gt;React Europe 2019 concluded last week. I want to share my experience from the perspective of a first time visitor to Paris, and highlight some of the amazing talks, speakers and attendees that made this event so incredible for myself and my teammates from &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the 5th year in a row, React Europe has held a fantastic conference in Paris, France. My company (&lt;a href="https://www.progress.com/" rel="noopener noreferrer"&gt;Progress Software&lt;/a&gt;) had an amazing time not only as a &lt;a href="https://www.react-europe.org/#progress" rel="noopener noreferrer"&gt;sponsor&lt;/a&gt; of the main conference event, but we also participated in the hackathon on Saturday.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/crowd.png?sfvrsn=5e43d6aa_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcrowd.png%3Fsfvrsn%3D5e43d6aa_1" title="The React Europe Crowd" alt="React Europe Crowd" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The event was held at the &lt;a href="http://www.espacecharenton.com/index.php?lang=en" rel="noopener noreferrer"&gt;Espace Charenton&lt;/a&gt; event center in the Porte de Charenton area of Paris and drew around one thousand React developers from all over the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/keynote.png?sfvrsn=7b7b05be_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkeynote.png%3Fsfvrsn%3D7b7b05be_1" title="The Keynote by Jared Palmer" alt="Keynote by Jared palmer" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Host and emcee &lt;a href="https://twitter.com/jardpalmer" rel="noopener noreferrer"&gt;Jared Palmer&lt;/a&gt; led the conference with a really good message about embracing React, building new things, contributing to open source including ReactJS, writing understandable docs, welcoming newcomers to JavaScript and the community as a whole. If we don't give these people the room to grow and improve, they will find another community that does welcome them.&lt;/p&gt;

&lt;p&gt;React has always been a growing and welcoming community, and we have to work extra hard to make sure that doesn't change. I felt Jared's keynote to be an inspiring way to open the conference, which ended up being one of the more intimate of the conferences I had been to as all of the speakers were super approachable. It was a very friendly vibe amongst the attendees and I never once encountered anything to the contrary. The coordinators were not only welcoming to me and my team as a new sponsor, but they went out of their way to show us a good time. I recommend this as one of the few must-attend and must-sponsor events if your team is thinking about going next year.&lt;/p&gt;

&lt;p&gt;The food and catering throughout the event was top notch, french breakfasts and baguette sandwiches for lunch, and of course there is no shortage of amazing restaurants in Paris.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/amazing_food.png?sfvrsn=cf2958d0_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Famazing_food.png%3Fsfvrsn%3Dcf2958d0_1" title="The Amazing Food and French Catering" alt="Amazing Food and French Catering" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It doesn't hurt that React Europe is held in one of the most romantic and beautiful cities in the world. As a first time traveler (as was most of my group), we made some time to get around the city and take in the great landmarks and attractions. But the conference really was the shining light in this trip and I would like to quickly highlight some of my favorite talks and give you my experience as a first time attendee. &lt;/p&gt;

&lt;p&gt;We heard from many amazing speakers at this event. Some of them were veterans of react Europe, like &lt;a href="https://twitter.com/leeb" rel="noopener noreferrer"&gt;Lee Byron&lt;/a&gt;, who is the only speaker to have graced the React Europe stage every year since it began in 2015. Others included &lt;a href="https://twitter.com/mweststrate" rel="noopener noreferrer"&gt;Michael Westrate&lt;/a&gt;, &lt;a href="https://twitter.com/compuives" rel="noopener noreferrer"&gt;Ives van Hoorne&lt;/a&gt;, &lt;a href="https://twitter.com/notbrent" rel="noopener noreferrer"&gt;Brent Vatne&lt;/a&gt;, &lt;a href="https://twitter.com/joshwcomeau" rel="noopener noreferrer"&gt;Josh Comeau&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an avid viewer of the previous years talks, I noticed a lot of new faces that may not have been on the main stage before or had only been involved with lightning talks in the past years. I thought many had extremely amazing talks, including: &lt;a href="https://twitter.com/kulkarniankita9" rel="noopener noreferrer"&gt;Ankita Kulkarni&lt;/a&gt;, &lt;a href="https://twitter.com/whereischarly" rel="noopener noreferrer"&gt;Charly POLY&lt;/a&gt;, &lt;a href="https://twitter.com/tyoushe" rel="noopener noreferrer"&gt;Olga Petrova&lt;/a&gt; &lt;a href="https://twitter.com/ellatrx" rel="noopener noreferrer"&gt;Ella van Durpe&lt;/a&gt;, and &lt;a href="https://twitter.com/alecdotbiz" rel="noopener noreferrer"&gt;Alec Larson&lt;/a&gt;, &lt;a href="https://twitter.com/Charles_Mangwa" rel="noopener noreferrer"&gt;Charles Mangwa&lt;/a&gt;, &lt;a href="https://twitter.com/lisa_gagarina" rel="noopener noreferrer"&gt;Lisa Gagarina&lt;/a&gt; and &lt;a href="https://twitter.com/timneutkens" rel="noopener noreferrer"&gt;Tim Neutkens&lt;/a&gt; just to name a few.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/hooks_in_motion.png?sfvrsn=94db476c_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fhooks_in_motion.png%3Fsfvrsn%3D94db476c_1" title="Hooks in Motion by Alec larson" alt="Hooks in Motion by Alec larson" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of my favorite talks as a UI developer who loves animations and React Hooks was from Alec Larson (@alecdotbiz), you can check out his full talk &lt;a href="https://www.youtube.com/watch?v=5QCYBiANRYs" rel="noopener noreferrer"&gt;"Hooks in Motion"&lt;/a&gt; about natural animations!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/move_fast.png?sfvrsn=c3867a1c_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fmove_fast.png%3Fsfvrsn%3Dc3867a1c_1" title="Move Fast With Confidence by Paul Armstrong" alt="Move Fast With Confidence by Paul Armstrong" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another great talk that really resonated with me, and which is valuable for everyone no matter their skill level, was Paul Armstrong's &lt;a href="https://www.youtube.com/watch?v=ikn_dBSski8" rel="noopener noreferrer"&gt;"Move Fast With Confidence"&lt;/a&gt; talk. You can preview this already on the &lt;a href="https://www.youtube.com/channel/UCorlLn2oZfgOJ-FUcF2eZ1A/videos" rel="noopener noreferrer"&gt;React Europe YouTube channel&lt;/a&gt;, and they are adding more and more talks every day from the conference, so you should go check them out now to see all of the amazing sessions that you might have missed or just want to watch again. I know I have been spending a lot of time in the past few days checking out the talks that I liked or maybe missed out on while I was there.&lt;/p&gt;

&lt;p&gt;It's important as a conference to not simply progress with more advanced talks each year, but to always have something for those who are new to React or even the industry for that matter. This keeps the roster of speakers each year fresh and keeps form alienating newcomers to the React space by making sure there is something for everyone.&lt;/p&gt;

&lt;p&gt;A few talks were what I feel to be a little on the advanced side (and this is OK), one example of which is &lt;a href="https://twitter.com/jverlaguet" rel="noopener noreferrer"&gt;Julien Verlaguet&lt;/a&gt;'s &lt;a href="https://www.youtube.com/watch?v=zXqrxQ5AL6I" rel="noopener noreferrer"&gt;talk&lt;/a&gt; on &lt;a href="http://www.skiplang.com" rel="noopener noreferrer"&gt;SKIP&lt;/a&gt;, the language recently open-sourced by Facebook. SKIP was a research project to explore language and runtime support for correct, efficient &lt;a href="https://stackoverflow.com/questions/6469437/what-is-the-difference-between-caching-and-memoization" rel="noopener noreferrer"&gt;memoization-based caching&lt;/a&gt; and &lt;a href="https://yihui.name/en/2018/06/cache-invalidation/" rel="noopener noreferrer"&gt;cache invalidation&lt;/a&gt;. Or I think he described it better when he said that it's a programming language built from the ground up with the ideas of React at its core, meaning that it deals with state in a similar way to React.  You will need to watch the talk as it is a very interesting presentation.&lt;/p&gt;

&lt;p&gt;I can't talk about everything that was presented on at the main stage, we would be here for hours, but it's all a great reason to go and check out day one and day two of the conference on YouTube, I'll put a list of all of the talks below so you can pick and choose and jump straight to the individual talks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Talks on YouTube
&lt;/h2&gt;

&lt;p&gt;Currently there are only a few talks posted to the React Europe YouTube page. The full day's video was posted after the conference but was removed yesterday as each individual talk began to be posted. Below are the talks that have been uploaded. I will try to keep the article updated as new ones are posted each day, but it's a time intensive process and it may take a while for all of them to get posted.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Europe Conference Day One (May 23rd)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=u_0ZMiQZr0k" rel="noopener noreferrer"&gt;The State of React and its Future (Jared Palmer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=viPhwbusWuE" rel="noopener noreferrer"&gt;Saving the Web, 16ms at a Time (Joshua Comeau)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5QCYBiANRYs" rel="noopener noreferrer"&gt;React-spring: How Hooks Mark a Shift in How We Think of Animation (Alec Larson)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=viPhwbusWuE" rel="noopener noreferrer"&gt;Designing a Rich Content Editor for a Third of the Web (Ella van Durpe)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=VxJnNeHpUzc" rel="noopener noreferrer"&gt;A Hitchhiker’s Guide to the new ReasonReact (Nik Graf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=K3JqNaw0-Us" rel="noopener noreferrer"&gt;Totally Native React With Revery (Bryan Phelps)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ikn_dBSski8" rel="noopener noreferrer"&gt;Move fast With confidence (Paul Armstrong)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zXqrxQ5AL6I" rel="noopener noreferrer"&gt;Skip (Julien Verlaguet)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Coders are the new Rock Stars (Daniel Stein/DJ Fresh) (Not Available Yet)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Uj7aWfrtey8" rel="noopener noreferrer"&gt;Magic Move transitions in React-native (Hein Rutjes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Sq2M00vghqY" rel="noopener noreferrer"&gt;Data models all the way; GraphQL + mobx-state-tree (Michel Weststrate)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lightening Talks (Not Available Yet)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  React Europe Conference Day Two (May 24th)
&lt;/h3&gt;

&lt;p&gt;Links still being processed, update coming soon!&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon
&lt;/h2&gt;

&lt;p&gt;This was held on the Saturday after the conference. We posed a &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; challenge, offering attendees the opportunity to win an Apple Watch by hacking a demo we put together where attendees built a travel booking site using our React components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/prizes.png?sfvrsn=4a645c98_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fprizes.png%3Fsfvrsn%3D4a645c98_1" title="Hackathon Prizes" alt="Hackathon Prizes" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This event was attended by about 20 developers that stuck around an extra day to try their hand at our coding challenges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/hackerz.png?sfvrsn=a2cb2465_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fhackerz.png%3Fsfvrsn%3Da2cb2465_1" title="The Hackathon Attendees" alt="Hackathon Attendees" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone did such an amazing job that we decided to give three runners up KendoReact licenses as well!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/winner.png?sfvrsn=a9eecd78_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fwinner.png%3Fsfvrsn%3Da9eecd78_1" title="The Hackathon Winner" alt="Hackathon Winner" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One winner (shown above), who combined both our KendoReact challenge and the AWS Amplify challenge, took home the well-deserved Apple Watch and a KendoReact license. As I said above three runners up also walked out with a KendoReact license. Thanks to everyone who participated!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>kendoreact</category>
    </item>
    <item>
      <title>Web Accessibility for Developers: What It Is and Why It’s Important (Part I)</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 08 May 2019 19:15:16 +0000</pubDate>
      <link>https://forem.com/progresstelerik/web-accessibility-for-developers-what-it-is-and-why-it-s-important-part-i-4279</link>
      <guid>https://forem.com/progresstelerik/web-accessibility-for-developers-what-it-is-and-why-it-s-important-part-i-4279</guid>
      <description>&lt;p&gt;Web accessibility is an increasingly important component of web development, for usability, compliance and many other reasons. In this series we'll explore the topic in depth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the process of implementing &lt;a href="https://www.telerik.com/kendo-react-ui/components/accessibility/" rel="noopener noreferrer"&gt;accessibility compliance&lt;/a&gt; (Section 508, WCAG 2.0 and WAI-ARIA) for &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt;, our suite of native UI components for React, we learned a lot on the topic. With this blog series, our goal is to introduce fellow engineers to web accessibility and share our practical knowledge and best practices.&lt;/p&gt;

&lt;p&gt;This first article is an attempt to answer what accessibility is and why it matters.&lt;/p&gt;

&lt;p&gt;The W3C definition is a great starting point: accessibility means that websites, tools, and technologies are designed and developed so that people with disabilities can use them. More specifically, people can: perceive, understand, navigate, and interact with the Web, and contribute to the Web.&lt;/p&gt;

&lt;p&gt;The perfect example for accessibility is if you can use your site without looking at it. Instead, you would listen to a screen reader that describes the UI and navigate with keyboard only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Accessibility is Generally Neglected
&lt;/h2&gt;

&lt;p&gt;While there are many reasons why accessibility is not omnipresent, as it ideally should be, three of them seem to be key. First, it’s hard to accommodate for something that you don’t understand well. Second, making your application accessible requires a lot of work – from understanding the premises of the standards you need to follow to designing the needed features and functionalities into your app (or finding a good way to modify it if it’s a legacy project). Then of course, there’s testing whether your approach has yielded the desired result – and much of the testing can only be done manually. The practices described in this series will make this effort easier, but we are still talking about a serious undertaking.&lt;/p&gt;

&lt;p&gt;Third is the economic argument which rightly or not dominates modern decision making: in most cases, a smaller percentage of your clients (or users) would be affected by a disability, which serves as justification to postpone implementing those accessibility improvements for the next release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Accessibility is Important
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ethics
&lt;/h3&gt;

&lt;p&gt;People with disabilities deal with a lot of challenges on a daily basis. If they are among your clients or users, enabling them to interact with your web app is plain human decency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Market
&lt;/h3&gt;

&lt;p&gt;There's data that one billion people worldwide, and 20% of all internet users, have some form of disability. This is still a minority, but it comprises of a lot more people than most of us would think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Legal
&lt;/h3&gt;

&lt;p&gt;As legislation in this domain develops, it becomes more and more likely for your business to be required by law to be accessible. The next section focuses on this topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  User Experience
&lt;/h3&gt;

&lt;p&gt;Accessibility guidelines are designed to help people access and use your website more easily. As a side effect, most of them improve usability and directly benefit all users, including those without disabilities. For example, readable text helps not only people with poor sight, but all users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering
&lt;/h3&gt;

&lt;p&gt;Many of the good practices for accessibility are good engineering and design principles in general. Often it is the poorly written code that is not accessible. For those of us who strive for mastery of our craft, accessibility is just a matter of doing a good job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reputation
&lt;/h3&gt;

&lt;p&gt;Having a more accessible site than your competition is a competitive advantage and can potentially create positive buzz around your brand.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEO
&lt;/h3&gt;

&lt;p&gt;There is some overlap between good practices for SEO and web accessibility. For example, writing semantic HTML with proper use of descriptive attributes such as labels, video transcription, image captioning and using title and header tags all improve both a website’s SEO and its accessibility. &lt;/p&gt;

&lt;h2&gt;
  
  
  Legislation
&lt;/h2&gt;

&lt;p&gt;Current legislation is moving in a direction where accessibility is becoming a mandatory feature of the web. In the USA, accessibility is covered by the Americans with Disabilities Act (&lt;a href="https://www.ada.gov/" rel="noopener noreferrer"&gt;ADA&lt;/a&gt;). Many of the developed countries have similar laws, for example, the UK has the &lt;a href="http://www.legislation.gov.uk/ukpga/2010/15/contents" rel="noopener noreferrer"&gt;Equality Act of 2010&lt;/a&gt;. In practical terms, these laws mean that public sector organizations and businesses are required by law to follow the &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s not just your customers and users you should be thinking about. If your organization has 50 or more employees, you need to accommodate those that have disabilities. This means your internal web tools will have to be accessible as well.&lt;/p&gt;

&lt;p&gt;If you are a contractor working for the government, you need to comply with &lt;a href="https://www.section508.gov/" rel="noopener noreferrer"&gt;Section 508 of the Rehabilitation Act&lt;/a&gt; in your work in addition to the above. By law, all US government services need to follow Section 508.&lt;/p&gt;

&lt;p&gt;These laws are not just an indication of good intentions. More and more law firms take legal actions based on accessibility legislation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We hope you are convinced that accessibility matters and is a worthwhile project to pursue. Now that we’ve laid the foundations, in the following parts, we will explore how to achieve good results meeting accessibility requirements with a reasonable investment of effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Whole Series: What's to Come
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Part 2: Types of Disabilities and Best Practices to Accommodate for Them. Here we further define the problem, break it down into sections on different disability types, suggesting individual solutions.&lt;/li&gt;
&lt;li&gt;Part 3: Technical Best Practices. This part is technically oriented and focuses on working with screen readers.&lt;/li&gt;
&lt;li&gt;Part 4: More Best Practices and Resources. Here we go over more practices about organizing our workflow and further explore how to make this daunting task manageable.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Discovering React Hooks with KendoReact</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 01 May 2019 18:52:04 +0000</pubDate>
      <link>https://forem.com/progresstelerik/discovering-react-hooks-with-kendoreact-3bjd</link>
      <guid>https://forem.com/progresstelerik/discovering-react-hooks-with-kendoreact-3bjd</guid>
      <description>&lt;p&gt;React Hooks have been available for use since the React 16.8 release. We'll learn how we can start applying these Hooks by using our KendoReact components.&lt;/p&gt;

&lt;p&gt;With the release of Hooks, building applications in React and managing the local state of its components is now easier, more straightforward and concise. There is a lot to know about Hooks from a conceptual standpoint, and we have many articles here on the Progress Telerik blog to help you get acquainted with them - I've highlighted a few of them below. In this post, we'll learn about Hooks and how to apply them using &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; components.&lt;/p&gt;

&lt;p&gt;Building React applications has not always been a breeze - before Hooks there was a lot you had to know about several patterns and practices in React just to do everyday things like state management, separating logic within your components, ensuring that you could share lifecycle methods and such across components, etc. It required understanding about several different techniques like Mixins, Higher Order Components, and or Render Props, something typically only done with classes.&lt;/p&gt;

&lt;p&gt;Before Hooks React developers, when faced with ever growing state concerns, would reach for Redux or MobX to manage their data and communication state. This was a natural use for Redux, but there are other forms of application state that using Redux might not be as good of a choice for, like the state inside of class-based components that would use &lt;code&gt;this.state&lt;/code&gt; and &lt;code&gt;setState&lt;/code&gt;. &lt;code&gt;setState&lt;/code&gt; is a method provided in React allowing the user to define and change state over time. This capability used to only be available in class components, until Hooks.&lt;/p&gt;

&lt;p&gt;Below are some articles on our blog explaining Hooks in more detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/hello-create-react-app-20-316-temp-slug-3014493"&gt;Say Hello to Create React App (2/3)&lt;/a&gt; to help get started in React&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/how-to-use-basic-react-hooks-for-state-and-effects-4bld"&gt;Learn Basic React Hooks State and Effects&lt;/a&gt; for local state and effects&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/how-to-use-basic-react-hooks-for-context-45pp-temp-slug-9116858"&gt;Learn Basic React Hooks for Context&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/how-to-use-basic-react-hooks-for-reducers-4nfo-temp-slug-1109404"&gt;Learn Basic React Hooks for Reducers&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/everything-you-need-to-create-a-custom-react-hook-47kl"&gt;Learn to Create Custom React Hooks&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;ReactJS.org documentation on Hooks&lt;/a&gt; is also a great resource that you should know about.&lt;/p&gt;

&lt;p&gt;As I stated before, Hooks are great for dealing with certain types of application state. A few examples are control state, local component state and session state. I'd like to leverage Hooks when working with our KendoReact components, but I want to start simple. Let's refactor one of the StackBlitz demos from a demo that uses classes and switch it to using functional components instead.&lt;/p&gt;

&lt;p&gt;We will look for instances where the demo is using &lt;code&gt;this.state&lt;/code&gt; and &lt;code&gt;this.setState&lt;/code&gt;, because when we convert the component to functional we will not have to use the &lt;code&gt;this&lt;/code&gt; keyword anymore, and we will not need to use a constructor or call &lt;code&gt;setState&lt;/code&gt;. When we work with Hooks, we do things slightly differently. So let's get into refactoring the KendoReact demo that shows how to work with our &lt;a href="https://www.telerik.com/kendo-react-ui/components/dialogs/dialog" rel="noopener noreferrer"&gt;KendoReact Dialog&lt;/a&gt;. I have &lt;a href="https://stackblitz.com/edit/kendoreact-dialog-class-based?file=app/main.jsx" rel="noopener noreferrer"&gt;forked the original StackBlitz demo&lt;/a&gt; from the Dialog Overview page, that will be our starting point.&lt;/p&gt;

&lt;p&gt;If you look at this demo's &lt;code&gt;main.jsx&lt;/code&gt; page which I have shown below, there are several target areas we can identify that will change when using a functional component and React Hooks. The code and lines highlighted in GREEN will need modification, and the lines highlighted in RED will be able to be removed completely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2019/2019-05/refactor_highlights.png?sfvrsn=8f624148_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-05%2Frefactor_highlights.png%3Fsfvrsn%3D8f624148_0" title="refactor\_highlights" alt="refactor_highlights" width="860" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On line 6 we have a &lt;code&gt;class&lt;/code&gt; definition, we need to convert this to a functional component.&lt;/li&gt;
&lt;li&gt;On line 7 we have a constructor, on line 8 a call to &lt;code&gt;super()&lt;/code&gt; and on line 10 we have some binding. None of these are needed in our functional component using Hooks.&lt;/li&gt;
&lt;li&gt;On line 9 we create an instance of our state and give it a default value of &lt;code&gt;true&lt;/code&gt; this will instead be a call to the &lt;code&gt;useState&lt;/code&gt; hook.&lt;/li&gt;
&lt;li&gt;On line 13 we need to rename the &lt;code&gt;toggleDialog&lt;/code&gt; function and switch it to the ES6 Arrow Function style syntax, lines 14 through 16 will simply call an update method provided by our &lt;code&gt;useState()&lt;/code&gt; assignment called &lt;code&gt;setVisible&lt;/code&gt; and the value it will be referencing will be &lt;code&gt;visible&lt;/code&gt; instead of &lt;code&gt;this.state.visible&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On line 19 we have a call to &lt;code&gt;render()&lt;/code&gt; which will not be necessary in our functional component&lt;/li&gt;
&lt;li&gt;On line 22, 23, 26 and 27 we have references to &lt;code&gt;this.&lt;/code&gt; and &lt;code&gt;this.state&lt;/code&gt; that will need to be to reference &lt;code&gt;visible&lt;/code&gt; and &lt;code&gt;toggleVisible&lt;/code&gt; instead of &lt;code&gt;toggleDialog&lt;/code&gt; and I will explain later on why I want to rename that function.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's get started. The first thing we need to do is to convert the class to a functional component, remove the constructor and call to &lt;code&gt;super()&lt;/code&gt;, the binding of the &lt;code&gt;toggleDialog()&lt;/code&gt; function. There are multiple syntax options we could use here - I prefer the ES6 Arrow Function style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const multiply = (x, y) =&amp;gt; { return x * y };  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our component line 5 would now look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const DialogWrapper = () =&amp;gt; {

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go ahead and set up our hook that will take the place of the state object. Instead of creating an object named state, we will set up a call to &lt;code&gt;useState()&lt;/code&gt; and destructure its return value into a variable that will hold our state and an update/set method to update that piece of state. Our name of our state will be &lt;code&gt;visible&lt;/code&gt; and its update method will be called &lt;code&gt;setVisible&lt;/code&gt;. We will basically remove the entire constructor and replace it with this one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [visible, setVisible] = useState(true);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we are using the &lt;code&gt;useState()&lt;/code&gt; basic hook, we also need to import it. Our React import will now look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need a function inside this component that will deal with calling &lt;code&gt;setVisible&lt;/code&gt; for the purposes of toggling its value. We decided that we would name it &lt;code&gt;toggleVisible&lt;/code&gt; instead of &lt;code&gt;toggleDialog&lt;/code&gt; and since we are in a functional component, the syntax that was used before will not work. For this reason, I will update it to the ES6 Arrow Function style.&lt;/p&gt;

&lt;p&gt;This function will simply set the &lt;code&gt;visible&lt;/code&gt; state to the opposite of its current state at the time. Behind the scenes React is managing this &lt;code&gt;visible&lt;/code&gt; variable in a similar way as it would if you were calling &lt;code&gt;setState&lt;/code&gt; in a class component. That management is just being abstracted by something behind the scenes called &lt;code&gt;useReducer&lt;/code&gt; but we are not going to get into exactly how all of that works in this simple example. Our new code looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const DialogWrapper = () =&amp;gt; {;
  const [visible, setVisible] = useState(true);
  const toggleVisible = () =&amp;gt; setVisible(!visible);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to get rid of the &lt;code&gt;render()&lt;/code&gt; block and its two curly braces. Also, we need to remove all references to this &lt;code&gt;this.toggleDialog&lt;/code&gt; and &lt;code&gt;this.state.visible&lt;/code&gt; and change them to &lt;code&gt;toggleVisible&lt;/code&gt; and &lt;code&gt;visible&lt;/code&gt; accordingly. Now inside of our &lt;code&gt;return()&lt;/code&gt; we will have the following changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return (
  &amp;lt;div&amp;gt;
  &amp;lt;Button className="k-button" onClick={toggleVisible}&amp;gt;Open Dialog&amp;lt;/Button&amp;gt;
  {visible &amp;amp;&amp;amp; &amp;lt;Dialog title={"Please confirm"} onClose={toggleVisible}&amp;gt;
    &amp;lt;p style={{ margin: "25px", textAlign: "center" }}&amp;gt;Are you sure you want to continue?&amp;lt;/p&amp;gt;
    &amp;lt;DialogActionsBar&amp;gt;
    &amp;lt;Button className="k-button" onClick={toggleVisible}&amp;gt;No&amp;lt;/Button&amp;gt;
    &amp;lt;Button className="k-button" onClick={toggleVisible}&amp;gt;Yes&amp;lt;/Button&amp;gt;
    &amp;lt;/DialogActionsBar&amp;gt;
  &amp;lt;/Dialog&amp;gt;}
  &amp;lt;/div&amp;gt;
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again we have just updated our code in the &lt;code&gt;return()&lt;/code&gt; to not reference the &lt;code&gt;this&lt;/code&gt; keyword and to use our new function name &lt;code&gt;toggleVisible&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These are all the changes that need to be made. We have successfully converted our KendoReact demo to use a functional component and the basic &lt;code&gt;useState&lt;/code&gt; hook. Let's take a look at what our overall changes looked like using and awesome tool called GitHistory:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7hpr3a3phmslznbs2it.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7hpr3a3phmslznbs2it.gif" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I have done here is downloaded the original StackBlitz class based demo into its own Git repo. The class-based version would be the initial commit and then I made a second commit after refactoring to the functional hook style that we made. GitHistory gives me the ability to scrub through those commits and see in an animated way how our &lt;code&gt;main.jsx&lt;/code&gt; file has changed over those two commits. I think it's a powerful visual for someone learning how to use Hooks and seeing the change from the old class-based approach to the function based approach.&lt;/p&gt;

&lt;p&gt;I have also pushed &lt;a href="https://github.com/httpJunkie/kendoreact-dialog-to-hooks-demo" rel="noopener noreferrer"&gt;this repo to my GitHub&lt;/a&gt; account where you can &lt;a href="https://github.githistory.xyz/httpJunkie/kendoreact-dialog-to-hooks-demo/blob/master/src/app/main.jsx" rel="noopener noreferrer"&gt;view it with GitHistory&lt;/a&gt; on your own. &lt;a href="https://dev.to/scottw/-git-history-5fpc-temp-slug-9335267"&gt;GitHistory&lt;/a&gt; (created by &lt;a href="https://github.com/pomber" rel="noopener noreferrer"&gt;Rodrigo Pombo&lt;/a&gt;) is a very cool plugin that allows you to diff any file in your repo and scrub through the commits and see how over time the file has changed in a very visual way.&lt;/p&gt;

&lt;p&gt;This is a great place to stop. We learned what it takes to convert a class component with a simple state object into a functional component using a hook. In the next part of this blog series, we will take a deeper dive into setting up several &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; components which have more basic Hooks, plus some advanced Hooks like &lt;code&gt;useReducer&lt;/code&gt;, and take our Hooks skills a little further.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reacthooks</category>
      <category>kendoreact</category>
    </item>
    <item>
      <title>Dealing with CORS in Create React App</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 25 Apr 2019 18:05:11 +0000</pubDate>
      <link>https://forem.com/progresstelerik/dealing-with-cors-in-create-react-app-39jf</link>
      <guid>https://forem.com/progresstelerik/dealing-with-cors-in-create-react-app-39jf</guid>
      <description>&lt;p&gt;If you've ever built a web app that had to request data from a different domain, you've probably had to wrap your head around the browser's &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy" rel="noopener noreferrer"&gt;same-origin policy&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;CORS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article we'll learn how to get around CORS issues using &lt;a href="https://facebook.github.io/create-react-app/" rel="noopener noreferrer"&gt;Create React App&lt;/a&gt;'s proxying capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If our app is hosted under a certain domain (e.g. &lt;code&gt;domain1.com&lt;/code&gt;), and it tries to make a request to an API that lives under a different domain (e.g. &lt;code&gt;domain2.com&lt;/code&gt;), then the browser's same-origin policy kicks in and blocks the request.&lt;/p&gt;

&lt;p&gt;CORS is a feature that allows &lt;code&gt;domain2.com&lt;/code&gt; to tell the browser that it's cool for &lt;code&gt;domain1.com&lt;/code&gt; to make requests to it, by sending certain HTTP headers.&lt;/p&gt;

&lt;p&gt;However, CORS can be tricky to get right, so sometimes people avoid it altogether by serving their frontend and backend under the same domain in production.&lt;/p&gt;

&lt;p&gt;Create React App allows us to replicate this setup in development, so that we don't have to deal with CORS there either. It provides two options to do so: one that's very straightforward but is not very flexible, and one that requires a bit more work but is very flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic Proxying
&lt;/h2&gt;

&lt;p&gt;We can tell Create React App to intercept requests to unknown routes and send them to a different domain, using the &lt;code&gt;proxy&lt;/code&gt; option in &lt;code&gt;package.json&lt;/code&gt;. It looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "flickr-client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-scripts": "^2.1.8"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:4000"
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we start our app, it will be served under &lt;code&gt;http://localhost:3000&lt;/code&gt;. If we request the root path &lt;code&gt;/&lt;/code&gt;, then Create React App will respond with the corresponding HTML for our app. But if we were to request a different path like &lt;code&gt;/api&lt;/code&gt;, Create React App would transparently forward it to &lt;code&gt;http://localhost:4000/api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If we look at the network requests in your browser dev tools, we'll see that the request was made to &lt;code&gt;http://localhost:3000/api&lt;/code&gt;, but it was in fact served by &lt;code&gt;http://localhost:4000/api&lt;/code&gt; without the browser knowing.&lt;/p&gt;

&lt;p&gt;It can't get easier than this!&lt;/p&gt;

&lt;h3&gt;
  
  
  Manual Proxying
&lt;/h3&gt;

&lt;p&gt;If we need more control over how these cross-domain requests get made, we have another option, which is to create a file &lt;code&gt;src/setupProxy.js&lt;/code&gt; that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = function(app) {
  // ...
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That function receives &lt;code&gt;app&lt;/code&gt;, an instance of an &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express&lt;/a&gt; app, so we can do whatever we want with it.&lt;/p&gt;

&lt;p&gt;For example, we can use a middleware like &lt;a href="https://github.com/chimurai/http-proxy-middleware" rel="noopener noreferrer"&gt;&lt;code&gt;http-proxy-middleware&lt;/code&gt;&lt;/a&gt; to proxy requests just like we did with the &lt;code&gt;proxy&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const proxy = require("http-proxy-middleware");

module.exports = app =&amp;gt; {
  app.use(
    "/api",
    proxy({
      target: "http://localhost:4000",
      changeOrigin: true
    })
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But we can go further, and use &lt;code&gt;http-proxy-middleware&lt;/code&gt;'s options like &lt;code&gt;pathRewrite&lt;/code&gt; to change the path of the request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const proxy = require("http-proxy-middleware");

module.exports = app =&amp;gt; {
  app.use(
    "/api",
    proxy({
      target: "http://localhost:4000",
      changeOrigin: true,
      pathRewrite: {
        "^/api": "/api/v1"
      }
    })
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this configuration, a request made to &lt;code&gt;http://localhost:3000/api/foo&lt;/code&gt; will be forwarded to &lt;code&gt;http://localhost:4000/api/v1/foo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We could also add a logger like &lt;a href="https://github.com/expressjs/morgan" rel="noopener noreferrer"&gt;&lt;code&gt;morgan&lt;/code&gt;&lt;/a&gt; while we're at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const proxy = require("http-proxy-middleware");
const morgan = require("morgan");

module.exports = app =&amp;gt; {
  app.use(
    "/api",
    proxy({
      target: "http://localhost:4000",
      changeOrigin: true,
      pathRewrite: {
        "^/api": "/api/v1"
      }
    })
  );

  app.use(morgan('combined'));
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now every time a request gets made to our proxy, it will get logged to the console.&lt;/p&gt;

&lt;p&gt;The possibilities are truly endless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If your web app needs to request data from a different domain, and you want your development environment to mimic a production configuration where frontend and backend are served from the same domain, make sure to take a look at the &lt;code&gt;proxy&lt;/code&gt; and &lt;code&gt;src/setupProxy.js&lt;/code&gt; options of Create React App. They'll make development of your app much easier!&lt;/p&gt;

&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;p&gt;Looking to learn more about developing apps for React with Create React App? Check out the posts below, and don't forget to visit our &lt;a href="https://www.telerik.com/blogs/all-things-react" rel="noopener noreferrer"&gt;All Things React post&lt;/a&gt; for a wide range of info and pointers on everything React.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/progresstelerik/hello-create-react-app-20-316-temp-slug-3014493"&gt;Hello, Create React App 2.0!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/progresstelerik/5-things-i-didnt-know-about-create-react-app-49nj"&gt;5 Things I Didn't Know about Create React App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/progresstelerik/10-more-things-you-didnt-know-about-create-react-app-3dj8"&gt;10 More Things You Didn’t Know About Create React App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>createreactapp</category>
      <category>cors</category>
    </item>
    <item>
      <title>A Look Back at React Amsterdam 2019</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 18 Apr 2019 20:26:47 +0000</pubDate>
      <link>https://forem.com/progresstelerik/a-look-back-at-react-amsterdam-2019-4bf5</link>
      <guid>https://forem.com/progresstelerik/a-look-back-at-react-amsterdam-2019-4bf5</guid>
      <description>&lt;p&gt;React Amsterdam took place last week in Amsterdam Noord at &lt;a href="https://kromhouthal.com/en/" rel="noopener noreferrer"&gt;De Kromhouthal&lt;/a&gt; organized by &lt;a href="https://gitnation.org/" rel="noopener noreferrer"&gt;GitNation&lt;/a&gt; an amazing group of folks who do an amazing job at running developer conferences like &lt;a href="https://jsnation.com/" rel="noopener noreferrer"&gt;JS Nation&lt;/a&gt; another Netherlands based JS community project and now conference, &lt;a href="https://reactday.berlin/" rel="noopener noreferrer"&gt;React Day Berlin&lt;/a&gt; a first of its kind, a full day conference in Berlin Germany, and others. This year's React Amsterdam conference was attended by more than 1500 React developers. I attended the conference, volunteered for both days of workshops and ran a booth for my company &lt;a href="https://www.progress.com/" rel="noopener noreferrer"&gt;Progress&lt;/a&gt; to show off our suite of &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; UI components.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Amazing Conference Location
&lt;/h2&gt;

&lt;p&gt;The Kromhouthal used to be a major marine engine manufacturing plant. I showed up the day before and got to see the hall before most of the conference setup was complete. Alone it's a cold dark hall, a scene that in the past would have been a labor intense atmosphere with massive machines, today it's used for major events and can hold thousands of people with its long hall and massively tall ceilings. The venue was easily accessible using the ferry from Central Station to the IJplein terminal but I also could have come from the Noordpark Metro station and in either situation just had a short 5 minute walk to the venue through a bustling creative area having a mix of local resident housing and soon to be a hotel and packing district. This area will continue to be a great location especially with plans to extend a bridge from the city center over the IJ (river). Check out these well-produced videos from the organizers to get an &lt;a href="https://www.youtube.com/watch?time_continue=15&amp;amp;v=NQyL-Dm7Kig" rel="noopener noreferrer"&gt;idea of the venue&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=bLgrUrPJdKE" rel="noopener noreferrer"&gt;atmosphere and moods&lt;/a&gt; from React Amsterdam past events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazing Workshops Teaching Valuable Principles and Patterns
&lt;/h2&gt;

&lt;p&gt;Although not at the infamous Kromhouthal, part of React Amsterdam (the workshops) took place nearby, in the shadow of A'DAM Lookout at the &lt;a href="https://tolhuistuin.nl/" rel="noopener noreferrer"&gt;Tolhuistuin&lt;/a&gt; a restaurant also fronting the IJ with amazing views for the workshop attendees. This is where I volunteered for two days and had a great opportunity to work with the workshop instructors and attendees. I love helping out wherever I can, I figure that if I'm in Amsterdam for the conference, I can only do so much sightseeing, I like to work in the city to a certain capacity, feel what it's like to be there with deadlines, requirements and work to get done. There are many others like this and I met a lot of them, I worked with a few amazing volunteers and organizers like Olena, Daria, Sara, Ravi, Nicholas, Maksym, and Aleksandra directly and others that had given up their time in this amazing city to serve the community and I want to thank them for being so awesome. You may not know these people but I want you to know that the success of this conference is greatly affected by their hard work.&lt;/p&gt;

&lt;p&gt;Speakers like Kent C Dodds did two workshops (&lt;a href="https://react.amsterdam/workshops#advanced" rel="noopener noreferrer"&gt;Advanced React&lt;/a&gt; &amp;amp; &lt;a href="https://react.amsterdam/workshops#testing" rel="noopener noreferrer"&gt;Testing React&lt;/a&gt;), one each day and he also spoke at the conference. His workshops were exactly the kind I would have gotten so much value attending, I was able to be a fly on the wall, but I hear that you can visit his sites and get some of this same training. There were also speakers like Andrey Okonetchnikov &amp;amp; Artem Sapegin who gave an amazing workshop on &lt;a href="https://react.amsterdam/workshops#design-systems" rel="noopener noreferrer"&gt;Design Systems for React Developers&lt;/a&gt; showing how to design systems offer a systematic approach to the process of product creation. Their view of the IJ was amazing, which in my horrible pictures you can't see.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/workshopimage_lg.jpg?sfvrsn=6c8959a6_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fworkshopimage_lg.jpg%3Fsfvrsn%3D6c8959a6_0" title="React Amsterdam workshop overlooking the river" alt="React Amsterdam workshop" width="1024" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe I got one of the river, ... Here we go!  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/riverimage_sm.jpg?sfvrsn=8289b9b1_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Friverimage_sm.jpg%3Fsfvrsn%3D8289b9b1_0" title="React Amsterdam workshop river view" alt="React Amsterdam workshop river view" width="760" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this same venue, we had Michel Weststrate's &lt;a href="https://react.amsterdam/workshops#typescript" rel="noopener noreferrer"&gt;TypeScript for React Devs&lt;/a&gt; and React Native Workshop by Alex Lobera &amp;amp; Horacio Herrera, all of these workshops in three different rooms at the &lt;a href="https://tolhuistuin.nl/" rel="noopener noreferrer"&gt;Tolhuistuin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Across the river closer to the Amsterdam City Center, there was another set of workshops that I'm sure provides as unique of a location as the one I was volunteering at. It was at the &lt;a href="https://www.igc.nl/" rel="noopener noreferrer"&gt;Royal Industrieele Groote Club&lt;/a&gt; which I walked past several times admiring and not knowing it was actually where the other workshops had taken place. Such a beautiful building like so many others in Amsterdam the City. At that location there were talks from Kitze on two different days (&lt;a href="https://react.amsterdam/workshops#graphql" rel="noopener noreferrer"&gt;GraphQL Workshop&lt;/a&gt; &amp;amp; &lt;a href="https://react.amsterdam/workshops#advanced-with-kitze" rel="noopener noreferrer"&gt;Advanced React&lt;/a&gt;). They also had another interesting fundamentals workshop on [Max Stoiber &lt;a href="https://react.amsterdam/workshops#modern-react" rel="noopener noreferrer"&gt;Modern React&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I could not be in two places at once, but I am very interested in the differences between Kitze' and Kent's workshops. Would love if these workshops were recorded adn given access later on like the talks are done. I know that it would have gaps where the class is working, but the instructors could get clever during this time and maybe live code the exercise on the broadcast. I don't know many ways to make this conference experience more immersive, but this sounds like something they should explore. maybe they already are!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conference Kickoff
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/registration_lgc79582d2115342ce8d85e5a861310f0d.jpg?sfvrsn=57470d99_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fregistration_lgc79582d2115342ce8d85e5a861310f0d.jpg%3Fsfvrsn%3D57470d99_0" title="React Amsterdam Registration" alt="React Amsterdam Registration" width="1024" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Helping at the registration was so much fun getting to meet everyone even if it was just for a minute to get them a badge and some swag. As an attendee, I got to walk away with a bag and I love my new coffee mug! There were a lot of people to process and I felt we did a good job of getting those people who showed up at the beginning, into the event on time for the kickoff, although hectic with 1500 people coming through the doors over a few hour period. It felt like a success and the conference got underway. I headed to my booth to check in with my tam where I switched hats one last time at React Amsterdam. Working our booth and meeting people that were interested in installing &lt;a href="https://www.telerik.com/kendo-react-ui/components/" rel="noopener noreferrer"&gt;our components&lt;/a&gt; and playing with KendoReact. I love talking about the library and getting others excited about it.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/booth_lg.jpg?sfvrsn=fcb88bed_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fbooth_lg.jpg%3Fsfvrsn%3Dfcb88bed_0" title="KendoReact Booth" alt="KendoReact Booth" width="1024" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conference Talk Highlights
&lt;/h2&gt;

&lt;p&gt;There were so many great presentations and Lightening talks, I want to take some time to highlight what I think were the most valuable ones that I attended. Being someone who works with a lot of UI, layout, and presentation in React, I am a big proponent of the fundamentals and general knowledge. I start to get lost when it comes to the advanced and deep dive topics outside of UI and basic React, and what's great about this conference is that they have something for everybody. Let's look at some of those talks and review them here:&lt;/p&gt;

&lt;h3&gt;
  
  
  Requisite React (Kent C Dodds)
&lt;/h3&gt;

&lt;p&gt;The conference started off strong with &lt;a href="https://www.telerik.com/feeds/kentcdodds.com/about/" rel="noopener noreferrer"&gt;Kent C Dodds&lt;/a&gt; on the main stage with a talk called &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=1405s/" rel="noopener noreferrer"&gt;"Requisite React"&lt;/a&gt;. In his own words, this talk is about: "Taking a few steps back and thinking about the usefulness of the fundamentals". We learn how to fix a droopy faucet head (with pics), and learn how understanding abstractions help us to be more effective when using them, not only in real life ?? but also in our code. This means being mindful of our abstractions and understanding that each one ultimately has some type of cost. My favorite abstraction that he dives into is that of JSX and I won't ruin the talk, but getting a look at how we can easily convert our Babel into raw JS, we are able to see under the hood and understand this abstraction better. I felt a lot of the talk was mostly about how to level up as a React developer and if you were a boss or manager who sent several of your developers out to &lt;a href="https://react.amsterdam/" rel="noopener noreferrer"&gt;React Amsterdam&lt;/a&gt;, this is exactly the type of information you want out of the gate!&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring React (Siddarth Kshetrapal)
&lt;/h3&gt;

&lt;p&gt;No time is wasted getting into another very valuable fundamentals based talk around &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=3268s" rel="noopener noreferrer"&gt;refactoring in React&lt;/a&gt;, again we are definitely getting our value right out of the gate with many helpful tips this time from &lt;a href="https://github.com/siddharthkp/" rel="noopener noreferrer"&gt;Siddarth Kshetrapel&lt;/a&gt; an independent developer from India who does an amazing job refactoring a login and authentication form. Starting with class components and constructors with a fair amount of prop drilling involved, we refactor this code quickly into something more manageable and future proof. Some of the techniques that he talks about are spreading props, using methods passed down in props the proper way and how to ensure that we are not overriding prop values for methods or applying them due to not managing our props correctly. He touches on principles like "Single Responsibility" and "Separation of Concerns". I really like most the parts where he talks about understanding about mixing of controlled vs uncontrolled state and how to avoid this. Pick one, he likes uncontrolled components, and this gives us the chance to get into higher order components or better yet, React Hooks. &lt;code&gt;useSmartness()&lt;/code&gt; FTW!&lt;/p&gt;

&lt;p&gt;So those talks were very code heavy and I was already in the mood for some straight up slide talk! My favorite kind fo talks! I don't have to strain my eyes and I still learn some new stuff I didn't know before.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Common Design Language (Andrey Okonetchnikov)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/okonet" rel="noopener noreferrer"&gt;Andrey&lt;/a&gt; who also did an amazing workshop on the same topic of Design Systems in React, puts all the pertinent info into a very clean and easy to understand talk on building a common design language and reducing the choices of options between typography, spacing and color to create a design language system. Using a common design language systems allows for reusability of design choices across multiple products and logos. This can be something as simple as he points out as the design of the German government logos vs Austrian government logos. One has a clear design system and language the other although creative lacks distinguishable characteristics that would show a clear alignment of all of its properties through a common design language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=6900s" rel="noopener noreferrer"&gt;Andrey's presentation&lt;/a&gt; had many strong visuals like above that helped to show us how a design system language can help not only your developers and designers talk, but also help your organization speak to its clients and customers clearly and with great meaning and commonality. The presentation leads into design languages for digital products and this is where we tie in the component-oriented capabilities of React that make it easy to define a common language with your UI achieving similar results as discussed before but now within digital products. Truly amazing talk and I really suggest taking the time to watch. I also want to note that React Amsterdam has an amazing design language and have continued year over year to capitalize on this using a similar set of logos, typography, and design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing with React (Mark Dalgleish)
&lt;/h3&gt;

&lt;p&gt;Following the previous design language presentation, we nicely transition into a talk from Mark Dalgleish on &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=8562s" rel="noopener noreferrer"&gt;designing in React&lt;/a&gt;. Using design systems paired with React Mark is able to design in the final medium. Because React is so component oriented, it allows us to build our own domain specific language. I have seen first hand at companies I have worked at like Tesla capitalize on the ability to do this in React and other web technologies. Mark has some other examples of this idea spreading throughout our industry as many companies build their own design systems. Mark's major points back up the ability to capture the design intent from our design systems and applying them to the web and native apps. &lt;a href="https://github.com/seek-oss/seek-style-guide" rel="noopener noreferrer"&gt;Seek style-guide&lt;/a&gt; is something that Mark's company has created and is a great resource and example of a design system for React executed remarkably.&lt;/p&gt;

&lt;p&gt;Another amazing resource that Mark shows off is the &lt;a href="http://airbnb.io/react-sketchapp/" rel="noopener noreferrer"&gt;React Sketch.app&lt;/a&gt; which renders React components to Sketch helping to design with real data, in react with real component code and manage your design system implemented in React. Watch the video for information on an amazing npm package they created called &lt;code&gt;html-sketchapp&lt;/code&gt;. I will let you discover that amazing gem on your own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Side Rendering Talks
&lt;/h3&gt;

&lt;p&gt;So far I'm 4 talks in, and I have watched the majority of the talks running back to our booth each break to interact with the attendees and talk components. For someone like me who just likes to be totally immersed in technology and talking about it, this event allows you to get into your element. It's great to have the support of a company like mine that gives us the opportunity to do these events in an organic way and let the people representing their product come here and just geek out on React. Aside from questions I had to field about our own component library, most of the talk at the conference was around fundamentals, bleeding edge features and the React roadmap, what's coming next. just an amazing conference to really get knee deep in JavaScript and React more specifically.&lt;/p&gt;

&lt;p&gt;The next four talks are all on Server Side Rendering (SSR) using frameworks like Next JS for pre-rendering, Crystalize for the backend to create lightning-fast scalable SSR React apps, the upsides and downsides of creating apps that use SSR, topics like rehydration, time to interactive and other things related to how our larger e-commerce sites render. In the e-commerce world, shaving milliseconds or maybe even full seconds off of load time can be very valuable. These 4 talks take you on a journey through the benefits and gotchas of SSR.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=10427s" rel="noopener noreferrer"&gt;Next for Next.js&lt;/a&gt; (Tim Neutkens)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=10991s" rel="noopener noreferrer"&gt;Lightning fast SSR React&lt;/a&gt; (Håkon Gullord Krogh)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=11452s" rel="noopener noreferrer"&gt;Speeding up React SSR&lt;/a&gt; (David Mark Clements)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=11870s" rel="noopener noreferrer"&gt;Demystifying Server-Rendered React Apps&lt;/a&gt; (Fernando Porazzi) &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lightning Round... One .. Start! (Read Rapidly and Fast)
&lt;/h2&gt;

&lt;p&gt;OK, really fast, let me tell you about the amazing lightning round talks, read this section really fast to get an idea of what lightning rounds are like. There were four amazing lightning talks, I caught two of them in person and watched the other two from home today and I have to say that I walked away from all of them with golden nuggets from each topic that I could use to explore that topic more on my own. below are the talks and a link to them on YouTube.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4KfAS3zrvX8?t=15862" rel="noopener noreferrer"&gt;Fetch Like a Boss With React Async&lt;/a&gt; (Gert Hengeveld)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4KfAS3zrvX8?t=16267" rel="noopener noreferrer"&gt;Microjob Multithreading&lt;/a&gt; (Vincenzo Ferrari)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4KfAS3zrvX8?t=16656" rel="noopener noreferrer"&gt;URQL Powerful and Simple GraphQL&lt;/a&gt; (Andy Richardson)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/scottw/-git-history-5fpc-temp-slug-9335267"&gt;Showcase of Git History&lt;/a&gt; (Rodrigo Pombo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm a huge fan of the library showcased in that last talk called &lt;a href="https://dev.to/scottw/-git-history-5fpc-temp-slug-9335267"&gt;Git-history&lt;/a&gt; and after being reminded of its awesomeness as React Amsterdam, I will be playing with this package and using it in some of my upcoming talks and demos to show the change when refactoring class based components to functional components with Hooks, I think this will provide a great visual aid in teaching on this subject. It's easy to use, I can show you right here.&lt;/p&gt;

&lt;p&gt;Take any file in any repo of your on GitHub. Like for instance, this article I am writing now:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/httpJunkie/telerik-blogs/blob/master/react-amsterdam-a-look-back.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;http://github.com&lt;/code&gt; with &lt;code&gt;http://github.githistory.xyz&lt;/code&gt; resulting in the following string:&lt;code&gt;https://github.githistory.xyz/httpJunkie/telerik-blogs/blob/master/react-amsterdam-a-look-back.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here is a look at what Git History has done with my file from my repo:&lt;/p&gt;

&lt;p&gt;If you are not instantly in love with this, you don't exist. I showed my son and he was mesmerized, we noted that if I were to have saved more often, I would have a much more granular step through. This is my nomination for the next years GitNation Open Source Awards (which means nothing, because I'm in no way affiliated with GitNation lol). I just think it is people like Rodrigo who will be highlighted for their contributions to open source. Truly amazing, have I said that enough?&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Regrets at Spectrum (Max Stoiber)
&lt;/h2&gt;

&lt;p&gt;I admit that the SSR talks were a little bit over my head, but next up was &lt;a href="https://github.com/mxstbr" rel="noopener noreferrer"&gt;Max Stoiber&lt;/a&gt; to talk about his &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=17600s" rel="noopener noreferrer"&gt;Tech Regrets at Spectrum&lt;/a&gt; which was acquired by GitHub. Another great talk and I don't want to spoil the regrets that Max goes over and I suggest taking a listen to this talk on your own to get the value of lessons learned from hindsight and his experience building a real-world product and shipping it to users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling Applications with Microfrontends (Max Gallo)
&lt;/h2&gt;

&lt;p&gt;Every once in a while there are talks at a conference where I think the guys on stage are on another level than me. TO be honest I have never built any micro frontends and if I did, I would have no idea how to scale them. When he asked for us to raise our hands if we had even heard of them, I was under strict contract to keep my hand down as I had never even heard of this. Once he started explaining the idea, I understood from a very high level. I like how his talk sets up three main tracks for understanding this micro frontends thing. Why do we need them? What is it? and how do they work under the hood? I was going to need all the hand holding I could get for this talk.&lt;/p&gt;

&lt;p&gt;Microfrontends are like a mix between microservices and the actual frontend single page application. Microfrontends are a way of splitting up the codebase of the frontend over many teams, obviously using some type of design system to keep them all similar in style and branding, we have already heard how to do this with extra benefit from React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Women of React Amsterdam
&lt;/h2&gt;

&lt;p&gt;There was no better way to end the General React Track and the conference than to have three amazing talks by pioneering women in the React space. My absolute favorite talk from React Amsterdam was from Elizabet Oliveira. As well, I was truly inspired by both Peggy and Ashi because I'm slowly getting into GraphQL and to see WebGL and Hooks used together painting pixels has to be one of my runners up for second most inspiring talks at React Amsterdam.&lt;/p&gt;

&lt;h3&gt;
  
  
  An SVG's Tale (Elizabet Oliveira)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=21167s" rel="noopener noreferrer"&gt;An SVG's Tale&lt;/a&gt; like I said is my favorite talk. She is a senior UX designer at Optum in Ireland. If I could give an award for the most inspiring talk at React Amsterdam and the most likely to get me started playing with an old but amazingly robust technology that been given a new lease thanks to React, it's SVG. I have always been a huge fan of SVG, but after her talk, I have so many ideas of how I can use SVG's properly and dynamically in my React applications using inline methods or with JSX and components. It's possible with React JS to create animations and styling that under the React hood may be complex but can allow developers not as well versed in SVG to easily use them through your components. Beyond SVG and React, Elizabet showcases a few of her side projects over the years. One of them is an app that you can record your own vocals over dank hip-hop beats which &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;feature=youtu.be&amp;amp;t=22153" rel="noopener noreferrer"&gt;Elizabet demo's for us with some amazing lyrical skills&lt;/a&gt;. This speaker definitely blew my mind and I wish I could have spotted her after the talk to give her a big thank you. Truly amazing presentation, she had everyone out of their seat cheering including myself and at other times fighting back tears because her (fictional) story was so amazing and warm and her performance was pure dope!&lt;/p&gt;

&lt;h3&gt;
  
  
  The GraphQL Developer Experience (Peggy Rayzis)
&lt;/h3&gt;

&lt;p&gt;Peggy Rayzis has to be the most compelling speaker on the topic of GraphQL especially for beginners like myself. It was one of the talks I was most amped up to hear and as happens in most conferences I got sidetracked and missed it ??. But listening back today I was not surprised at all when Peggy told us that she lived in Amsterdam for a month last year and that it is her favorite city in the world. I think most of us who came out for our first time to Amsterdam has the same feeling. I cannot think of a better backdrop for this event. It was my introduction to Europe proper! I enjoyed taking in all of the knowledge that Peggy brings to us on the subject of GraphQL and she has a great perspective as an employee for &lt;a href="https://www.apollographql.com/" rel="noopener noreferrer"&gt;Apollo&lt;/a&gt; where she works as an Engineering Manager. This company builds the most amazing implementation of GraphQL. Apollo helps us bridge the gap between application and API and I don't want to spoil her talk so I simply suggest checking this one out if you are interested in learning about GraphQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Painting Pixels With WebGL And Hooks (Ashi Krishnan)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ashi.io/" rel="noopener noreferrer"&gt;Ashi Krishnan&lt;/a&gt; is a seasoned speaker on so many different topics beyond React. She has been on my radar because of amazing talks like Deep Learning in React and Learning from machines. She works with GitHub in the UK and at React Amsterdam she closes out the General React track at React Amsterdam taking us on a journey into WebGL and how to leverage this journey with Hooks. This talk reminds me of the many things we can do in React that challenge the way we think about what a React application is and what it can do. I first started realizing all the amazing things we could do with React and rendering from Ken Wheeler's talk on building a drum machine or rendering web pages with canvas. &lt;a href="https://github.com/queerviolet" rel="noopener noreferrer"&gt;Ashi&lt;/a&gt; continues to challenge our thinking about React with an amazing live demo using WebGL to paint pixels in React. If I was able to select one talk that I believed mostly encompassed creativity and thinking outside of the box it would be this one. Without giving too much away, she runs through many demos truly artistic in nature that achieve different styles and approaches to painting the screen using WebGL in React.&lt;/p&gt;

&lt;h2&gt;
  
  
  The React Native Track
&lt;/h2&gt;

&lt;p&gt;Although I have "et, slept and breth'd" the General track at React Amsterdam I was not able to get over to the React Native track that often. But I did make a conscious effort to watch some of it. I have never used React Native but I have heard so many great things about it and did catch a few bits and pieces while I was at React Amsterdam. If I could point to one talk specifically that I think helped me understand React native better it would be the presentation given by the React Native core team member &lt;a href="https://github.com/nparashuram" rel="noopener noreferrer"&gt;Parashuram&lt;/a&gt; which just so happens to also be the first talk of this React native track: &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=934s" rel="noopener noreferrer"&gt;Building React Native&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The React Native track &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4" rel="noopener noreferrer"&gt;can be viewed in its entirety on YouTube&lt;/a&gt;. Below is a complete list of all of the talks you might want to hear! If you're more of a web developer and less of a native developer, I would suggest also checking out &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=18906s" rel="noopener noreferrer"&gt;Native Web Apps&lt;/a&gt; by &lt;a href="https://github.com/4ian" rel="noopener noreferrer"&gt;Florian Rival&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the React native track, we saw strong talks on &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=2844s" rel="noopener noreferrer"&gt;Practical Perfomrance&lt;/a&gt; by Anna Doubková and &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=17234s" rel="noopener noreferrer"&gt;Making React Applications Accessible&lt;/a&gt; by Ankita Kulkarni and &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=25644s" rel="noopener noreferrer"&gt;Demystifying The Complex Animations Creation Process&lt;/a&gt; with Vladimir Novick. All were talks I was able to easily follow along not being a React Native developer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=934s" rel="noopener noreferrer"&gt;Building React Native&lt;/a&gt; (Parashuram N)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=2844s" rel="noopener noreferrer"&gt;Practical Performance for React Native&lt;/a&gt; (Anna Doubková)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=6291s" rel="noopener noreferrer"&gt;Sharing Code Between React and React Native&lt;/a&gt;: What Not to Share (Ben Ellerby)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=8150s" rel="noopener noreferrer"&gt;Building for a Bigger World Than Mobile&lt;/a&gt; (Wouter Van Den Broek)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=9801s" rel="noopener noreferrer"&gt;Advice Lounge&lt;/a&gt; (Panel Discussion)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=17234s" rel="noopener noreferrer"&gt;Make Your React Native Apps Accessible&lt;/a&gt; (Ankita Kulkarni)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=18906s" rel="noopener noreferrer"&gt;Native Web Apps&lt;/a&gt;: React and WebAssembly to Rewrite Native Apps (Florian Rival)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=20715s" rel="noopener noreferrer"&gt;Full-Stack React Native&lt;/a&gt; in the Era of Serverless Computing (Nader Dabit)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=25644s" rel="noopener noreferrer"&gt;Demystifying The Complex Animations Creation Process&lt;/a&gt; in React Native (Vladimir Novick)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=27212s" rel="noopener noreferrer"&gt;React Native App Rollout&lt;/a&gt; - an Alternative Approach (Adam Terlson)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Source Awards
&lt;/h2&gt;

&lt;p&gt;Since React Amsterdam at heart is a JavaScript conference, a love for open source is at the heart of every conference run by GitNation, they really do a great job of highlighting and recognizing great open source projects. This year they had several categories and you can watch the awards ceremony for more context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breakthrough of The Year
&lt;/h3&gt;

&lt;p&gt;Taken home by &lt;a href="https://github.com/mweststrate" rel="noopener noreferrer"&gt;Michel Weststrate&lt;/a&gt; a Nederlander and main contributor of &lt;a href="https://github.com/immerjs/immer" rel="noopener noreferrer"&gt;Immer&lt;/a&gt; the popular open source library used to create the next mutatable state by mutating the current state. I have just barely scraped the surface of what this library can help with, but I have used it to make returning state from my reducers in React used to mutate (while keeping immutable) my local component state. I'm sure there are many other great uses for this library and I think it was well deserving of the award. Nominees for this award were &lt;a href="https://github.com/callstack/linaria" rel="noopener noreferrer"&gt;Linaria&lt;/a&gt;, &lt;a href="https://github.com/jaredpalmer/formik" rel="noopener noreferrer"&gt;Formik&lt;/a&gt; and &lt;a href="https://github.com/react-navigation/react-navigation" rel="noopener noreferrer"&gt;React-navigation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Most Exciting Technology
&lt;/h3&gt;

&lt;p&gt;This award was given to the &lt;a href="https://github.com/hshoff/vx" rel="noopener noreferrer"&gt;VX open source library&lt;/a&gt; that makes it easy to combine D3 charts into React to build amazing visual components. A demo can be seen on &lt;a href="https://vx-demo.now.sh/gallery" rel="noopener noreferrer"&gt;vx-demo.now.sh&lt;/a&gt; and shows how easy it is to make both your own reusable chart library or your own slick custom one-off charts. A representative was not available to take t his award home, but many props go out to the VX team for making such an amazing contribution to JS open source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fun Side Project of The Year
&lt;/h3&gt;

&lt;p&gt;The title of the award says it all, this is just an open source contribution that GitNation believed to be fun, light-hearted and amazing in its own right. The nominees for this category were &lt;a href="https://github.com/React95/React95" rel="noopener noreferrer"&gt;React95&lt;/a&gt; (a play on Windows 95) is a React component library with Windows95 style UI. This would have also been my pick although I think both projects are absolutely fantastic. The next nominee was &lt;a href="https://github.com/mohitk05/react-insta-stories" rel="noopener noreferrer"&gt;React-insta-stories&lt;/a&gt; A React component for Instagram like stories. The component responds to actions like a tap on the right side for the next story, on left for previous and tap and hold for pause. The custom time duration for each story can be provided. The winner for this award was React95. Gabriel Daltoso and Alysson Dos Santos (São Paulo - Brazil) both came up on stage to accept this very well deserved award!&lt;/p&gt;

&lt;h3&gt;
  
  
  Most Impactful Contribution to The Community
&lt;/h3&gt;

&lt;p&gt;The winner of this award was &lt;a href="https://github.com/kentcdodds/react-testing-library" rel="noopener noreferrer"&gt;React-testing-library&lt;/a&gt;. Other nominees for this award were &lt;a href="https://github.com/wix/Detox" rel="noopener noreferrer"&gt;Detox&lt;/a&gt; and &lt;a href="https://github.com/react-navigation/react-navigation" rel="noopener noreferrer"&gt;React-navigation&lt;/a&gt;, and &lt;a href="https://github.com/downshift-js/downshift" rel="noopener noreferrer"&gt;Downshift&lt;/a&gt; and are all very impactful in our JS community. It should be and is noted by the announcers on stage that two of these libraries have the main contributor in common with Kent C Dodds. And if he wasn't given an award himself for most impactful and influential person to React Amsterdam, he should as well with a few other speakers who did both workshops and speaking at the conference, it just so happens that kent was able to pull off a trifecta in also winning an open source award, but there were many people wearing many hats speaking, volunteering, teaching workshops and overall just living and breathing this conference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Productivity Booster
&lt;/h3&gt;

&lt;p&gt;The final award category is all about being productive as a developer. The winner is near and dear to my heart as someone who loves to write in Markdown, I'm writing this article now in markdown using VS Code and I use Git to record my progress and iterations of each and every article I write for this blog. As well, I write many presentations and slide decks and love using markdown for those as well. As you can guess, the winner of this award went to &lt;a href="https://github.com/jxnblk/mdx-deck" rel="noopener noreferrer"&gt;MDX Deck&lt;/a&gt; and was accepted by &lt;a href="https://github.com/timneutkens" rel="noopener noreferrer"&gt;Time Neutkens&lt;/a&gt; and delivered to &lt;a href="https://github.com/jxnblk" rel="noopener noreferrer"&gt;Brent jackson&lt;/a&gt;. Other nominees for this category were &lt;a href="https://github.com/jaredpalmer/formik" rel="noopener noreferrer"&gt;Formik&lt;/a&gt;, &lt;a href="https://github.com/react-cosmos/react-cosmos" rel="noopener noreferrer"&gt;React-cosmos&lt;/a&gt;, and &lt;a href="https://github.com/tannerlinsley/react-table" rel="noopener noreferrer"&gt;React-table&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React is Amsterdam
&lt;/h2&gt;

&lt;p&gt;Talk about how Amsterdam is a perfect city for JavaScript and more importantly React developers. Some of the sponsors at the vents were based in or had offices in Amsterdam or Netherlands. The city offers so much in historical, artistic, tech and shopping, so it's obviously a great place to bring the React community and is very relaxed yet highly invigorated at the same time. Given enough time and the ability to travel throughout the city and learn the Metro, Dutch national rail company NS (Nederlandse Spoorwegen) and the various other ferry and tram systems, you can easily move around to the areas that you want to visit and crank up the energy or turn it down by traveling just out of the city's center.&lt;/p&gt;

&lt;p&gt;I stayed in the &lt;a href="https://www.google.com/search?q=Wilbautstraat&amp;amp;rlz=1C1CHBF_enUS841US841&amp;amp;oq=Wilbautstraat" rel="noopener noreferrer"&gt;Wilbautstraat area&lt;/a&gt; just 4 stops off the metro from Central Station at a wonderful hotel that I talk about more in my &lt;a href="https://dev.to/httpjunkie/the-developers-guide-to-react-amsterdam-4h60/"&gt;Developers Guide to React Amsterdam&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React 2020
&lt;/h2&gt;

&lt;p&gt;If you are planning on attending the React Amsterdam 2020 event, mark your calendars now, it will be April 16th and 17th. I know I'm missing other amazing things that happened, but hopefully, this can serve as a guide if you were not able to attend or maybe a tool you can use to convince your boss to go next year. If you do, stop by our booth and talk to me, I will definitely be going back in April of next year!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Why Blazor Grid Templates Will Make You Question Everything</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 18 Apr 2019 11:30:00 +0000</pubDate>
      <link>https://forem.com/progresstelerik/why-blazor-grid-templates-will-make-you-question-everything-1057</link>
      <guid>https://forem.com/progresstelerik/why-blazor-grid-templates-will-make-you-question-everything-1057</guid>
      <description>&lt;p&gt;With native components, the Telerik UI for Blazor Grid templates can fully utilize the the best features of Blazor to highly customize the user experience.&lt;/p&gt;

&lt;p&gt;Using a template in an application implies that you're creating a custom experience for your user by leveraging a component or framework you're working with. Because the &lt;a href="https://www.telerik.com/blazor-ui" rel="noopener noreferrer"&gt;Telerik UI for Blazor&lt;/a&gt; components are native, built from the ground up using the Blazor framework, it can tap directly in to Blazor's best features. Grid component templates can fully utilize the HTML, Razor, and components to completely customize the user experience.&lt;/p&gt;

&lt;p&gt;In this article we'll see an overview of what templates are available and simple use cases. We'll use these as building blocks to see just how dynamic a Blazor grid can be when using templates for advanced ideas like custom editors and master-detail views.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Types
&lt;/h2&gt;

&lt;p&gt;There are currently three types of templates available for the Blazor grid: column Template, Editor Template, and Row Template. Each has very specific uses and are powerful tools for adapting the grid to your specific needs. Let's start with a quick introduction to each template type.&lt;/p&gt;

&lt;h3&gt;
  
  
  Column Template
&lt;/h3&gt;

&lt;p&gt;By default, the grid renders the value of the field in the column exactly as it's provided from the data source. We can override this behavior by using a column &lt;code&gt;Template&lt;/code&gt; which allows us to take control over the rendering of the object within the column. The Template provides the entire object currently bound to the row in which the column exists, and this object is the template's &lt;code&gt;context&lt;/code&gt;. Through the Template we can apply custom formatting, insert additional HTML and images, and display Razor Components using any value from the &lt;code&gt;context&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field="@(nameof(SampleData.Name))" Title="Employee Name"&amp;gt;
    &amp;lt;Template&amp;gt;
       Employee name is: @((context as SampleData).Name)
    &amp;lt;/Template&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The column Template is visible when the current row is not in edit mode. To customize the grid's editing experience we'll use the &lt;code&gt;EditorTemplate&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor Template
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;EditorTemplate&lt;/code&gt; is a template that bound to the editing context. The &lt;code&gt;EditorTemplate&lt;/code&gt; defines the inline template or component that will be rendered when the user is editing the field. Although the &lt;code&gt;EditorTemplate&lt;/code&gt; acts much like the column Template, it is only shown when the given row is in edit mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field=@nameof(Employee.VacationDays) Title="Position"&amp;gt;
    &amp;lt;EditorTemplate&amp;gt;
        @{
            var employeeToUpdate = context as Employee;
&amp;lt;KendoNumericTextBox Decimals="1" Format="#.0 days" Max="15" Min="0" Step="0.5m" Value="@employeeToUpdate.VacationDays" /&amp;gt;
        }
    &amp;lt;/EditorTemplate&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The column and editor templates give excellent control over column rendering in the grid. For even more control we can choose to use a row template and completely customize the grid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Row Template
&lt;/h3&gt;

&lt;p&gt;Unlike the previously mentioned templates, the &lt;code&gt;RowTemplate&lt;/code&gt; spans the entire grid for all columns. The row template allows you to define custom rendering for the entire &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; element for each record. It can be convenient if you want to use templates for most or all of the columns, as it requires less markup than setting individual templates for many columns.&lt;/p&gt;

&lt;p&gt;Since the template isn't bound to a specific column, it can use the &lt;code&gt;Context&lt;/code&gt; attribute of the &lt;code&gt;RowTemplate&lt;/code&gt; to set the name of the context variable. Its type is the model type to which the grid is bound.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;RowTemplate Context="employee"&amp;gt;
    &amp;lt;td&amp;gt;
        &amp;lt;span&amp;gt;@employee.Id&amp;lt;/span&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
        Hired on: @(String.Format("{0:dd MMM yyyy}", employee.HireDate))
    &amp;lt;/td&amp;gt;
&amp;lt;/RowTemplate&amp;gt;
&amp;lt;TelerikGridColumns&amp;gt;
    &amp;lt;TelerikGridColumn Field=@nameof(SampleData.Name) Title="Employee Name" /&amp;gt;
    &amp;lt;TelerikGridColumn Field=@nameof(SampleData.HireDate) Title="Hire Date" /&amp;gt;
&amp;lt;/TelerikGridColumns&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the three template types we can tackle a wide variety of requirements. Let's look at how flexible the &lt;a href="https://docs.telerik.com/blazor/components/grid/overview" rel="noopener noreferrer"&gt;Telerik UI for Blazor Grid&lt;/a&gt; can be - what we can accomplish might just surprise you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Image Template
&lt;/h2&gt;

&lt;p&gt;We'll begin with a simple yet common scenario, embedding an image in a grid column. Let's assume we have a list of users that we need to manage a broad range of details for. It be nice to associate a face with a name, and with a column template we can do just that. Using a column template we can use one or many values from the currently bound item's properties to generate an image element and display an image directly in the column. In this example we'll assume that our product's images are stored on the server with a relative path of &lt;code&gt;/images/&lt;/code&gt;, and each image file name corresponds to the &lt;code&gt;productId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's begin without a template to see how the grid is structured without customization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height="500"&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name"/&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price"/&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt; 

@functions {
    public IEnumerable&amp;lt;Product&amp;gt; GridData { get; set; }

    protected override void OnInit() =&amp;gt; GridData = ... //fetch data;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgrid-plain.jpg%3Fsfvrsn%3Df9fd1feb_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgrid-plain.jpg%3Fsfvrsn%3Df9fd1feb_1" title="grid-plain" alt="grid-plain" width="989" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we have a basic two column grid with just a text display of each Product Name and Unit Price. Using a template we can transform the Product Name column to display an image alongside the product name.&lt;/p&gt;

&lt;p&gt;To access the template, the Product Name column needs to have a &lt;code&gt;TelerikGridColumn&lt;/code&gt; component with matching begin/end tags. Inside the component we'll add a &lt;code&gt;Template&lt;/code&gt; component which will define our custom rendering. Inside of the template we have access to the context object, this is the current &lt;code&gt;Product&lt;/code&gt; in scope. A simple cast of &lt;code&gt;context as Product&lt;/code&gt; will give us access to the proper type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name"&amp;gt;
    &amp;lt;Template&amp;gt;
        @{
            var product = context as Product;
        }
    &amp;lt;/Template&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have our current Product we can render it how we see fit within the column. Let's add an HTML &lt;code&gt;&amp;lt;img&lt;/code&gt; tag and create a path from the &lt;code&gt;ProductId&lt;/code&gt; property. We can apply CSS to the image using standard HTML markup &lt;code&gt;class="rounded-circle"&lt;/code&gt;. Also, since this is Razor, C# string literals are a valid way of formating the path &lt;code&gt;src="@($"/images/{product.ProductId}.jpg")"&lt;/code&gt;. We'll also display the Product Name property along side the image using simple markup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height="500"&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name"&amp;gt;
            &amp;lt;Template&amp;gt;
                @{
                    var product = context as Product;
                    &amp;lt;img class="rounded-circle" src="@($"/images/{product.ProductId}.jpg")" /&amp;gt;
                    &amp;lt;span&amp;gt;@product.ProductName&amp;lt;/span&amp;gt;
                }
            &amp;lt;/Template&amp;gt;
        &amp;lt;/TelerikGridColumn&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price"/&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt; 

@functions ...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fimage-template.jpg%3Fsfvrsn%3D19f2bb74_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fimage-template.jpg%3Fsfvrsn%3D19f2bb74_1" title="image-template" alt="image-template" width="1257" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because the underlying Razor Components framework supports templates and the Telerik UI for Blazor Grid is built using the framework's native architecture, the grid is a fully capable solution to many problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Form
&lt;/h2&gt;

&lt;p&gt;With templates we can fully utilize Blazor's framework features. Inside the template we can add components, logic, and even trigger events. In addition, templates aren't just scoped to the component they're contained in - we can access events and values outside of the template as well. This opens up new possibilities for creating a custom experience.&lt;/p&gt;

&lt;p&gt;Let's assume we want to create a custom edit experience versus using one of the &lt;a href="https://docs.telerik.com/blazor/components/grid/editing/overview.html" rel="noopener noreferrer"&gt;built in grid editors&lt;/a&gt;. This will give us full control over every aspect of the form. The challenge is getting the form to interact with the grid. To make a custom editor we'll need to select an item, place its properties on a form, and save/cancel changes. On the surface this might seem like a complex task, however the framework has extremely flexible data binding mechanics.&lt;/p&gt;

&lt;p&gt;Identifying the currently selected &lt;code&gt;object&lt;/code&gt; would provide most of what we need to accomplish the task since we can bind its properties directly to form elements. The grid's template gives us access to items that are bound to a grid row, all we'll need is a method of selecting the value and creating a reference to the object. Let's start by creating a placeholder for our object reference using a field named &lt;code&gt;selectedProduct&lt;/code&gt;. To create an easy way of selecting a product, a column template with a button will suffice. When the button is clicked, we'll invoke an in-line function to set &lt;code&gt;selectedProduct&lt;/code&gt; to the current context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field=@nameof(Product.ProductId) Title="Id"&amp;gt;
    &amp;lt;Template&amp;gt;
        &amp;lt;TelerikButton Icon="edit" OnClick="@(_=&amp;gt; selectedProduct = (Product)context)"&amp;gt;Edit&amp;lt;/TelerikButton&amp;gt;
    &amp;lt;/Template&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the data referenced we can now add a form to display the information and provide save and cancel actions. The form will exist outside of the grid, since the object reference is now scoped to the &lt;code&gt;page&lt;/code&gt; we can place the form anywhere outside the grid. The form can be hidden or shown based on if an item is selected using a standard Razor &lt;code&gt;@if&lt;/code&gt; block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@if (selectedProduct != null) {
...form
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saving and canceling the edit are also straightforward tasks now. We just need to create buttons with corresponding &lt;code&gt;OnClick&lt;/code&gt; events. To cancel the edit, the &lt;code&gt;selectedProduct&lt;/code&gt; reference is simply reset to &lt;code&gt;null&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height=@Height Pageable="true" PageSize=@PageSize&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductId) Title="Id"&amp;gt;
            &amp;lt;Template&amp;gt;
                &amp;lt;TelerikButton Icon="edit" OnClick="@(_=&amp;gt; selectedProduct = (Product)context)"&amp;gt;Edit&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/Template&amp;gt;
        &amp;lt;/TelerikGridColumn&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name" /&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price" /&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt;
&amp;lt;hr /&amp;gt;
@if (selectedProduct != null)
{
    &amp;lt;div class="form-group "&amp;gt;
        &amp;lt;label class="control-label" for="productName"&amp;gt;
            Product Name
        &amp;lt;/label&amp;gt;
        &amp;lt;input class="form-control" bind="@selectedProduct.ProductName" id="name" name="name" type="text" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="form-group "&amp;gt;
        &amp;lt;label class="control-label" for="unitPrice"&amp;gt;
            Unit Price
        &amp;lt;/label&amp;gt;
        &amp;lt;input class="form-control" bind="@selectedProduct.UnitPrice" id="unitPrice" name="unitPrice" type="number" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="form-group"&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;TelerikButton Icon="save" Class="k-primary" OnClick="@Save"&amp;gt;Save&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;TelerikButton Icon="cancel" OnClick="@(_=&amp;gt; selectedProduct = null)"&amp;gt;Cancel&amp;lt;/TelerikButton&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
}
@functions {
    ...
    Product selectedProduct;

    void Save()
    {
// save logic
        selectedProduct = null;
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcustomeditor.gif%3Fsfvrsn%3Da416540_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcustomeditor.gif%3Fsfvrsn%3Da416540_1" title="CustomEditor" alt="CustomEditor" width="369" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the ability to share state with other components on the page, the opportunities for template driven experiences are unlimited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Master-Detail View
&lt;/h2&gt;

&lt;p&gt;Using templates we can completely transform an entire grid row with custom HTML, Razor, and even components. In this next example we'll look at just how advanced we can get with templates by adding a Master-Detail view to a grid.&lt;/p&gt;

&lt;p&gt;A likely scenario for any application is one where a data point has many properties with varying importance. Some of those properties should always be front and center, while others might be helpful to have just within reach. This is where a master-detail view can be quite handy. This type of view helps keep extended data out of view until it is requested by the user, while keeping critical data up front all of the time.&lt;/p&gt;

&lt;p&gt;Using the &lt;code&gt;RowTemplate&lt;/code&gt; we can define two different states for our row which can easily be toggled by a simple button click. We'll start with the default state which only displays two columns of data. This view is nicely tucked away in a custom component called &lt;code&gt;ProductMasterTemplate&lt;/code&gt; and takes a parameter of &lt;code&gt;Product&lt;/code&gt; to be displayed in a two column format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ProductMasterTemplate Product="@product" /&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition, we'll use a more complex view to reveal all of the data for a given product in a list view. Once again, we'll encapsulate the view in custom component called &lt;code&gt;ProductDetailTemplate&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ProductDetailTemplate Product="@product"/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within each of these custom components are table data cells &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; that contain Razor code for displaying the properties of a given &lt;code&gt;Product&lt;/code&gt;. The contents of the row template must be &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; elements and their number (or total colspan) must match the number of columns defined in the grid. Internally both templates contain markup similar to the following example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;td&amp;gt;@Product.property&amp;lt;/td&amp;gt;
&amp;lt;td colspan="2"&amp;gt;
... some view logic
&amp;lt;/td&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the two states clearly defined as components we can focus on switching between the two. Let's begin by defining which item is selected by creating a variable where we can hold a reference to the selected product. As such, we'll name it &lt;code&gt;SelectedProduct&lt;/code&gt;. To enable the user to toggle between views, we'll need a set of buttons to display for the user. To show the details we'll simply check the &lt;code&gt;SelectedProduct&lt;/code&gt; to see if it matches the current item in the row. Since we're using Blazor, we can easily set the state of &lt;code&gt;SelectedProduct&lt;/code&gt; directly in the event handler with an in-line function, &lt;code&gt;OnClick="@(_=&amp;gt; SelectedProduct = ...)"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;RowTemplate Context="product"&amp;gt;
        @if (SelectedProduct != product)
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Window" OnClick="@(_=&amp;gt; SelectedProduct = product)"&amp;gt;Details&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductMasterTemplate Product="@product" /&amp;gt;
        }
        else
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Close" OnClick="@(_=&amp;gt; SelectedProduct = null)"&amp;gt;Close&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductDetailTemplate Product="@product"/&amp;gt;
        }
    &amp;lt;/RowTemplate&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The completed code below is actually quite simple due to the combination of template and component architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height="@Height"&amp;gt;
    &amp;lt;RowTemplate Context="product"&amp;gt;
        @if (SelectedProduct != product)
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Window" OnClick="@(_=&amp;gt; SelectedProduct = product)"&amp;gt;Details&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductMasterTemplate Product="@product" /&amp;gt;
        }
        else
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Close" OnClick="@(_=&amp;gt; SelectedProduct = null)"&amp;gt;Close&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductDetailTemplate Product="@product"/&amp;gt;
        }
    &amp;lt;/RowTemplate&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Width="100" Field=@nameof(Product.ProductName) Title="Product" /&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name" /&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitsInStock) Title="Unit Price" /&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt;

@functions {
    Product SelectedProduct;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clicking the &lt;code&gt;Details&lt;/code&gt; button gives us a slick UI that allows us to drill into grid data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fmasterdetail.gif%3Fsfvrsn%3Df056b4ab_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fmasterdetail.gif%3Fsfvrsn%3Df056b4ab_1" title="MasterDetail" alt="MasterDetail" width="400" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Because the Telerik UI for Blazor components are native, built from the ground up using the Blazor framework, it can tap directly in to Blazor's best features. Grid component templates can fully utilize the HTML, Razor, and components to completely customize the user experience. Simple templates are useful for formatting or displaying images, while more extensive templates can transform the user interface completely adding entirely new functionality to the grid.&lt;/p&gt;

&lt;p&gt;In this post we focused on the grid, however other components like the &lt;a href="https://docs.telerik.com/blazor/components/dropdownlist/overview" rel="noopener noreferrer"&gt;DropDownList&lt;/a&gt; already feature template fields as well. Make sure you &lt;a href="https://www.telerik.com/download-trial-file/v2-b/ui-for-blazor" rel="noopener noreferrer"&gt;download the latest release&lt;/a&gt; and try the templates for yourself using our &lt;a href="https://github.com/telerik/ui-for-blazor-examples" rel="noopener noreferrer"&gt;demo repository on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.telerik.com/download-trial-file/v2-b/ui-for-blazor" rel="noopener noreferrer"&gt;Try Telerik UI for Blazor&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>blazor</category>
    </item>
    <item>
      <title>Meet the KendoReact Team in Person: Amsterdam, Paris, Salt Lake City</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 10 Apr 2019 16:43:49 +0000</pubDate>
      <link>https://forem.com/progresstelerik/meet-the-kendoreact-team-in-person-amsterdam-paris-salt-lake-city-1j30</link>
      <guid>https://forem.com/progresstelerik/meet-the-kendoreact-team-in-person-amsterdam-paris-salt-lake-city-1j30</guid>
      <description>&lt;p&gt;Behind every person, there’s a story, and we want to know yours! That’s why the KendoReact team is going traveling this year to meet with the React community. You can see which events we’ll be attending at the end of this article, but before that, let me share some of our stories with you, to kick off the conversation.  &lt;/p&gt;

&lt;p&gt;You may have seen &lt;a href="https://twitter.com/carlbergenhem" rel="noopener noreferrer"&gt;Carl’s&lt;/a&gt; unmistakably Nordic beard at previous events, on Twitter, or on the &lt;a href="https://www.telerik.com/blogs/author/carl-bergenhem" rel="noopener noreferrer"&gt;Telerik Blogs&lt;/a&gt; as he’s been with KendoReact since its inception. Don’t ask him where he’s from unless you’ve got a coffee in your hand and a place to sit comfortably. On the other hand, being the KendoReact Product Manager, Carl has a lot to say about the team, how we build our roadmap and all about staying fit while balancing a heap of work responsibilities.&lt;/p&gt;

&lt;p&gt;If you’ve looked for more information about React hooks, &lt;a href="https://twitter.com/httpJunkie" rel="noopener noreferrer"&gt;Eric’s&lt;/a&gt; name has probably showed up in your google search results as he did a popular &lt;a href="https://www.telerik.com/blogs/author/eric-bishard" rel="noopener noreferrer"&gt;series of articles&lt;/a&gt; diving into their intricacies. Beyond hooks, there’s a lot more to know about this React developer who came to Progress from Tesla, landing his first Developer Advocate role (at which he’s a natural!) and is miraculously always present at calls with the Sofia, Bulgaria team despite the 10-hour difference (he's based in California).&lt;/p&gt;

&lt;p&gt;Then I also encourage you to ask &lt;a href="https://twitter.com/kspeyanski" rel="noopener noreferrer"&gt;Kiril&lt;/a&gt; about rebuilding of the previous version of our &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact website&lt;/a&gt; with Gatsby and what this architecture change did to the build time in production. Hint: he managed to decrease both the development and production build times 10x and made the site blazing fast. Yes, he has stories to tell.&lt;/p&gt;

&lt;p&gt;And definitely turn to Stefan if you have a question about how a KendoReact component works – he’s our master solution-finder. He is also the one person on the team whom you can ask about all and any of the KendoReact UI components and get a pro tip. Since he’s one of the most active team members when it comes to answering support tickets, you may even have exchanged emails with him already!&lt;/p&gt;

&lt;p&gt;Then there’s also me, &lt;a href="https://twitter.com/nora_init" rel="noopener noreferrer"&gt;Nora&lt;/a&gt;. Ask me about my favorite joke about functions if you want to lighten up – I laugh every time I tell it. I also have a lot of funny developer stories. Other than that, I’ve been working as a marketing person in IT for more years than you can tell and have a passion for communication, so ask me anything. Don’t worry, there’ll be no marketing talk if you approach me as I find it hard to be anything but straightforward (just ask the team).&lt;/p&gt;

&lt;p&gt;There’s nothing that can substitute for in-person communication when it comes to building relationships or learning what someone is all about. That’s why the KendoReact team, represented by these fine folks just introduced, is going places this summer!&lt;/p&gt;

&lt;p&gt;Come meet us at our booths at the following conferences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://react.amsterdam/" rel="noopener noreferrer"&gt;React Amsterdam&lt;/a&gt; on April 10-12 in (duh) Amsterdam. We’ll be right by the coffee spot, Booth 1, and will be wearing React blue! Carl, who rarely misses a workout, will probably go for a run between the Dutch bikers while we’re there. Ping him if you’d like to boost your sense of well-being with a runner’s high. Also, we'll be having some cool gifts from you, from a raffle for Bose headphones, to T-shirts and more KendoReact sweetness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkendoreact_swag_blog-image-crop.jpg%3Fsfvrsn%3D3bab3e1e_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkendoreact_swag_blog-image-crop.jpg%3Fsfvrsn%3D3bab3e1e_0" title="KendoReact\_SWAG\_Blog-image-crop" alt="KendoReact conference giveaways - t-shirts, stickers" width="720" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.react-europe.org/" rel="noopener noreferrer"&gt;React Europe&lt;/a&gt; on May 21-24 in Paris. Every time I think of Paris, I think of Alison Gopnik’s hilarious comparison, “What's it like to be a baby? Being in love in Paris for the first time after you've had 3 double espressos." I hope I get some new associations as it will be my first time ever in Paris! &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reactloop.com/speakers" rel="noopener noreferrer"&gt;React Loop&lt;/a&gt; on June 21 in Chicago. While we won’t be exhibiting there, make sure you attend Eric’s talk, as he is one of the speakers at Chicago’s first React conference.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.reactrally.com/" rel="noopener noreferrer"&gt;React Rally&lt;/a&gt; on Aug 22-23 in Salt Lake City, UT. There are still a few months to go, but mark your calendar if you’re planning to be there and come meet the KendoReact team! &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking forward to meeting you in person! If you want to suggest other React events for us to visit, drop us a line and we’ll check them out.&lt;/p&gt;

</description>
      <category>react</category>
      <category>kendoreact</category>
      <category>reactevents</category>
    </item>
    <item>
      <title>The Journey of JavaScript: from Downloading Scripts to Execution - Part I</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Sun, 24 Feb 2019 14:30:00 +0000</pubDate>
      <link>https://forem.com/progresstelerik/the-journey-of-javascript-from-downloading-scripts-to-execution---part-i-3a4</link>
      <guid>https://forem.com/progresstelerik/the-journey-of-javascript-from-downloading-scripts-to-execution---part-i-3a4</guid>
      <description>&lt;p&gt;This article will help you understand the internals of JavaScript - even the weird parts. Every line of code that you write in JavaScript will make complete sense once you know how it has been interpreted by the underlying engine. You'll learn multiple ways of downloading scripts based on the use case, and how the parser generates an Abstract Syntax Tree and its heuristics while parsing the code. Let's dive deep into the internals of JavaScript engines - starting from downloading scripts.&lt;/p&gt;

&lt;p&gt;JavaScript is one of the most popular languages today. Gone are the days when people would use JavaScript merely for handling DOM event listeners and for a few undemanding tasks. Today, you can build an entire application from the ground up using JavaScript. JavaScript has taken over the winds, lands and the seas. With Node.js invading the gamut of server-side technologies and the advent of rich and powerful client-side libraries and frameworks like React, Angular and Vue, JavaScript has conquered the web. Applications are shipping a lot of JavaScript over the wires. Almost all of the complicated tasks of an application are now implemented using JavaScript.&lt;/p&gt;

&lt;p&gt;While this is all great, it is disheartening to see that most of these applications lack even the minimal user experience. We keep adding functionalities to our application without taking into effect its performance implications. It is important that we follow proper techniques to deliver optimized code.&lt;/p&gt;

&lt;p&gt;In this series of tutorials, we’ll first understand what is wrong with the conventional techniques and then we’ll dig deeper to learn some of the techniques that’ll help us write optimized code. We’ll also understand how our code gets parsed, interpreted and compiled by the underlying JavaScript engine and what works best for our engines. While the syntax of JavaScript is pretty easy to grasp, understanding its internals is a more daunting task. We’ll start from the very basics and eventually take over the beast. Let’s get going.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Script Tag
&lt;/h2&gt;

&lt;p&gt;Let’s consider a simple HTML file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;script src='./js/first.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/second.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/third.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/fourth.js'&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div&amp;gt;Understanding the script tag&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;first.js includes the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('first.js file')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;second.js includes the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('second.js file')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’ve set up an express server for demonstrating the concepts explained in the article. If you want to experiment along the way, please feel free to clone my &lt;a href="https://github.com/ankita1910/js-internals" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s see what happens when we open this HTML file in the browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Floading-scripts.png%3Fsfvrsn%3D9c36ac48_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Floading-scripts.png%3Fsfvrsn%3D9c36ac48_1" title="loading-scripts" alt="loading-scripts" width="1354" height="460"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The browser starts parsing the HTML code. When it comes across a script tag in the head section, the HTML parsing is paused. An HTTP request is sent to the server to fetch the script. The browser waits until the entire script is downloaded. It then does the work of parsing, interpreting and executing the downloaded script (we’ll get into the details of the entire process later in the article). This happens for each of the four scripts.&lt;/p&gt;

&lt;p&gt;Once this is done, the browser resumes its work of parsing HTML and creating DOM nodes. The user, who is patiently staring at the screen waiting for something to load, doesn’t know most of his time is spent executing JavaScript code (even the code that may not be required during the startup). Script tags are blocking in nature. They block the rendering of the DOM. Your high school teacher might have told you, “Always put the script tags below body.” Now that you know script tags block rendering of the DOM, it makes sense to put them below the HTML. It is better to show non-interactive content (for a few milliseconds until the JavaScript code gets ready) than nothing at all.&lt;/p&gt;

&lt;p&gt;Imagine you have a very big chain of DOM nodes — tens of thousands of them. According to what we’ve learned so far, in this case, the user would see a lot of content but he won’t be able to interact even with the tiniest piece. I’m sure you have visited websites that show you the entire content almost instantly but don’t let you scroll down or even click on any element. The page doesn’t seem to move for a few seconds. Isn’t that frustrating? The next obvious question is: when should we load the scripts — at the start before parsing of HTML or at the end after the HTML? Let’s analyze the problem a bit more.&lt;/p&gt;

&lt;p&gt;Our end goal is clear — to load assets instantly during the startup. Our first approach of parsing scripts first and then the HTML renders a good user experience, but it eats up a lot of the user’s time by showing him blank screen while the content is getting executed. The problem with this approach is that it gets worse with an increase in the number of scripts since waiting time (load time) is directly proportional to the number of scripts. For every script, we make a ride to the server and wait until it gets downloaded.&lt;/p&gt;

&lt;p&gt;Can we dump all of the JavaScript code in one file? This would reduce the number of rides we make to the server. That would mean dumping tens of thousands of lines of JavaScript into one file. I’m definitely not going for this. This would mean compromising with my code ethics.&lt;/p&gt;

&lt;p&gt;Heard of Gulp, webpack? They are nothing but module bundlers in simple terms. Module bundlers, eh? You write your JavaScript code in any number of files (as many modules as you wish). Module bundlers bundle all of your JavaScript files and static assets in one big chunk, and you can simply add this one big file in your HTML.&lt;/p&gt;

&lt;p&gt;Certainly, we reduced the number of HTTP requests to the server. Are we not still downloading, parsing and executing the entire content? Can we do something about it? There’s something called as code splitting. With webpack, you can split your code into different bundles. Dump all the common code in one bundle (like Vendor.js, which has all the common libraries to be used across the project) and others that are specific to modules.&lt;/p&gt;

&lt;p&gt;For example, let’s say you are building an eCommerce website. You have different modules for Store, Transactions History and Payment. It doesn’t make sense to load your payment-specific code on the store-specific page. Bundlers have solved our problem by making fewer HTTP requests to the server.&lt;/p&gt;

&lt;p&gt;Now, let’s consider one use case here. I’ve added Google Analytics to gain insights into how users are interacting with my eCommerce website. Google Analytics script is not required during the startup. We may want to load the app-specific stuff first and then other secondary scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Downloading Scripts Asynchronously
&lt;/h2&gt;

&lt;p&gt;When you add the &lt;em&gt;async&lt;/em&gt; keyword in your script tag, the browser downloads that script asynchronously. The browser doesn’t pause the parsing of DOM when it comes across a script tag with &lt;em&gt;async&lt;/em&gt; keyword. The script is downloaded in another thread without disturbing the main thread, and, once it is downloaded, the browser pauses the parsing of HTML and gets busy in parsing this script code. Once the parsing of this JavaScript code is completed, it is executed in another thread and the browser resumes its work of parsing HTML. We’ve saved the waiting time of the browser while the script is getting downloaded.&lt;/p&gt;

&lt;p&gt;Let’s say we want to download two of our scripts asynchronously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;script async src='./js/first.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script async src='./js/second.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/third.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/fourth.js'&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div&amp;gt;Understanding the script tag&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deferring the Execution of Scripts
&lt;/h2&gt;

&lt;p&gt;When you add &lt;em&gt;defer&lt;/em&gt; keyword in your script tag, the browser doesn’t execute that script until the HTML parsing is completed. Defer simply means the execution of the file is deferred or delayed. The script is downloaded in another thread and is executed only after the HTML parsing is completed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;script defer src='./js/first.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script defer src='./js/second.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/third.js'&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;script src='./js/fourth.js'&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div&amp;gt;Understanding the script tag&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdefer-scripts.png%3Fsfvrsn%3D8df6a065_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdefer-scripts.png%3Fsfvrsn%3D8df6a065_1" title="defer-scripts" alt="defer-scripts" width="916" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can see in the above screenshot, third.js and fourth.js were executed before first.js and second.js.&lt;/p&gt;

&lt;p&gt;Here’s a brief overview of the three techniques of adding scripts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcomparison.jpg%3Fsfvrsn%3D63483a10_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcomparison.jpg%3Fsfvrsn%3D63483a10_1" title="comparison" alt="comparison" width="600" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Until now, we’ve understood how scripts are downloaded and what the most effective ways of downloading scripts are. Let’s understand what happens after a script is downloaded. (We’re considering Chrome browser, although almost all of the popular browsers follow similar steps.)&lt;/p&gt;

&lt;p&gt;Chrome uses V8 as the underlying JavaScript Engine. It consists of the following components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjs-engine.png%3Fsfvrsn%3Ddc2f64eb_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjs-engine.png%3Fsfvrsn%3Ddc2f64eb_1" title="js-engine" alt="js-engine" width="2000" height="1443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Parser&lt;/em&gt; - JavaScript is fed into a Parser, which generates an Abstract Syntax Tree&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Interpreter&lt;/em&gt; - Abstract Syntax Tree is the input for the V8 Ignition Interpreter, which generates the ByteCode&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Compiler&lt;/em&gt; - The Turbofan Compiler of the V8 Engine takes in the ByteCode and generates machine code&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Optimizing Compiler&lt;/em&gt; - It takes ByteCode and some profiling data as the input and generates optimized machine code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ll get into the details of each of these components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parsing JavaScript Code
&lt;/h2&gt;

&lt;p&gt;The JavaScript source code is first converted to tokens. Tokens represent the alphabet of a language. Every unit in the source code is identified by the grammar of the language that you’re using.&lt;/p&gt;

&lt;p&gt;So, something like &lt;code&gt;var a = 1&lt;/code&gt; is a valid JavaScript statement. It can be broken down to tokens (‘var’, ‘a’, ‘=’, ‘1’) that match with the language grammar. However, something like &lt;code&gt;variable a = 2&lt;/code&gt; is not a valid JavaScript statement because its grammar doesn’t specify anything related to the &lt;em&gt;variable&lt;/em&gt; keyword. Now, with the help of these tokens, the parser generates an Abstract Syntax Tree (AST) and scopes. AST, in simple terms, is a data structure that is used for representing the source code. Scopes are also data structures, used for identifying the scope of variables in their defined blocks. For example, a local variable would be accessible in the local scope and not in global scope. These constraints are defined in these scopes data structures.&lt;/p&gt;

&lt;p&gt;Consider this simple JavaScript code snippet -  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;var a = 2&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;I refer &lt;a href="https://astexplorer.net/" rel="noopener noreferrer"&gt;AST Explorer&lt;/a&gt; to check the AST generated for my code. The AST for the above code would look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "type": "Program",
  "start": 0,
  "end": 9,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 0,
      "end": 9,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 4,
          "end": 9,
          "id": {
            "type": "Identifier",
            "start": 4,
            "end": 5,
            "name": "a"
          },
          "init": {
            "type": "Literal",
            "start": 8,
            "end": 9,
            "value": 2,
            "raw": "2"
          }
        }
      ],
      "kind": "var"
    }
  ],
  "sourceType": "module"
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s try to make sense of the above AST. It’s a JavaScript object with properties as &lt;em&gt;type&lt;/em&gt;, &lt;em&gt;start&lt;/em&gt;, &lt;em&gt;end&lt;/em&gt;, &lt;em&gt;body&lt;/em&gt; and &lt;em&gt;sourceType&lt;/em&gt;. &lt;em&gt;start&lt;/em&gt; is the index of the first character, and &lt;em&gt;end&lt;/em&gt; is the length of your code, which is &lt;code&gt;var a = 2&lt;/code&gt; in this case. &lt;em&gt;body&lt;/em&gt; contains the definition of the code. It’s an array with a single object since there is only one statement of the type &lt;code&gt;VariableDeclaration&lt;/code&gt; in our program. Inside &lt;code&gt;VariableDeclaration&lt;/code&gt;, it specifies the identifier &lt;code&gt;a&lt;/code&gt; and its initial value as &lt;code&gt;2&lt;/code&gt;. Check &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;init&lt;/code&gt; objects. The kind of declaration is &lt;code&gt;var&lt;/code&gt;. It can also be &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let’s consider one more example to get better understanding of ASTs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo () {
    let bar = 2
    return bar
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And its AST is as follows -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "type": "Program",
  "start": 0,
  "end": 50,
  "body": [
    {
      "type": "FunctionDeclaration",
      "start": 0,
      "end": 50,
      "id": {
        "type": "Identifier",
        "start": 9,
        "end": 12,
        "name": "foo"
      },
      "expression": false,
      "generator": false,
      "params": [],
      "body": {
        "type": "BlockStatement",
        "start": 16,
        "end": 50,
        "body": [
          {
            "type": "VariableDeclaration",
            "start": 22,
            "end": 33,
            "declarations": [
{
                "type": "VariableDeclarator",
                "start": 26,
                "end": 33,
                "id": {
                  "type": "Identifier",
                  "start": 26,
                  "end": 29,
                  "name": "bar"
                },
                "init": {
                  "type": "Literal",
                  "start": 32,
                  "end": 33,
                  "value": 2,
                  "raw": "2"
                }
}
            ],
            "kind": "let"
          },
          {
            "type": "ReturnStatement",
            "start": 38,
            "end": 48,
            "argument": {
"type": "Identifier",
"start": 45,
"end": 48,
"name": "bar"
            }
          }
        ]
      }
    }
  ],
  "sourceType": "module"
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, it has properties — &lt;em&gt;type&lt;/em&gt;, &lt;em&gt;start&lt;/em&gt;, &lt;em&gt;end&lt;/em&gt;, &lt;em&gt;body&lt;/em&gt; and &lt;em&gt;sourceType&lt;/em&gt;. &lt;em&gt;start&lt;/em&gt; is 0, which means the first character is at position 0, and &lt;em&gt;end&lt;/em&gt; is 50, which means the length of the code is 50. &lt;em&gt;body&lt;/em&gt; is an array with one object of the type &lt;code&gt;FunctionDeclaration&lt;/code&gt;. The name of the function &lt;code&gt;foo&lt;/code&gt; is specified in the &lt;code&gt;id&lt;/code&gt; object. This function doesn’t take any arguments hence &lt;em&gt;params&lt;/em&gt; is an empty array. The body of the &lt;code&gt;FunctionDeclaration&lt;/code&gt; is of type &lt;code&gt;BlockStatement&lt;/code&gt;. &lt;code&gt;BlockStatement&lt;/code&gt; identifies the scope of the function. The body of the &lt;code&gt;BlockStatement&lt;/code&gt; has two objects for &lt;code&gt;VariableDeclaration&lt;/code&gt; and &lt;code&gt;ReturnStatement&lt;/code&gt;. &lt;code&gt;VariableDeclaration&lt;/code&gt; is same as we saw in the previous example. &lt;code&gt;ReturnStatement&lt;/code&gt; contains an argument with name &lt;code&gt;bar&lt;/code&gt;, as &lt;code&gt;bar&lt;/code&gt; is being returned by the function &lt;code&gt;foo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is it. This is how ASTs are generated. When I heard of ASTs the first time, I thought of them as big scary trees with complicated nodes. But now that we’ve got a good hold on what ASTs are, don’t you think they are just a group of nicely designed nodes representing the semantics of a program?&lt;/p&gt;

&lt;p&gt;Parser also takes care of Scopes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let globalVar = 2
function foo () {
    let globalVar = 3
    console.log('globalVar', globalVar)
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Function &lt;code&gt;foo&lt;/code&gt; would print 3 and not 2 because the value of &lt;code&gt;globalVar&lt;/code&gt; in its scope is 3. While parsing the JavaScript code, the parser generates its corresponding scopes as well.&lt;/p&gt;

&lt;p&gt;When a &lt;code&gt;globalVar&lt;/code&gt; is referred in function &lt;code&gt;foo&lt;/code&gt;, we first look for &lt;code&gt;globalVar&lt;/code&gt; in the functional scope. If that variable is not found in the functional scope, we look up to its parent, which in this case is the &lt;em&gt;global&lt;/em&gt; object. Let’s consider one more example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let globalVar = 2
function foo () {
    let localVar = 3
    console.log('localVar', localVar)
    console.log('globalVar', globalVar)
}
console.log('localVar', localVar)
console.log('globalVar', globalVar)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The console statements inside function &lt;code&gt;foo&lt;/code&gt; would print 3 and 2 while the console statements outside function &lt;code&gt;foo&lt;/code&gt; would print &lt;em&gt;undefined&lt;/em&gt; and 3. This is because &lt;code&gt;localVar&lt;/code&gt; is not accessible outside function &lt;code&gt;foo&lt;/code&gt;. It is defined in the scope of function &lt;code&gt;foo&lt;/code&gt; and so a lookup for &lt;code&gt;localVar&lt;/code&gt; outside of it results in &lt;em&gt;undefined&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parsing in V8
&lt;/h2&gt;

&lt;p&gt;V8 uses two parsers for parsing JavaScript code, called as Parser and Pre-Parser. To understand the need of two parsers, let’s consider the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo () {
    console.log('I\'m inside function foo')
}

function bar () {
    console.log('I\'m inside function bar')
}

/* Calling function foo */
foo()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the above code gets parsed, the parser would generate an AST representing the function &lt;em&gt;foo&lt;/em&gt; and function &lt;em&gt;bar&lt;/em&gt;. However, the function &lt;em&gt;bar&lt;/em&gt; is not called anywhere in the program. We’re spending time in parsing and compiling functions that are not used, at least during the startup. &lt;em&gt;bar&lt;/em&gt; may be called at a later stage, maybe on click of a button. But it is clearly not needed during the startup. Can we save this time by not compiling function &lt;em&gt;bar&lt;/em&gt; during the startup? Yes, we can!&lt;/p&gt;

&lt;p&gt;Parser is what we’re doing till now. It parses all of your code, builds ASTs, scopes and finds all the syntax errors. The Pre-Parser is like a fast parser. It only compiles what is needed and skips over the functions that are not called. It builds scopes but doesn’t build an AST. It finds only a restricted set of errors and is approximately twice as fast as the Parser. V8 employs a heuristic approach to determine the parsing technique at runtime.&lt;/p&gt;

&lt;p&gt;Let’s consider one example to understand how V8 parses JavaScript code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(function foo () {
    console.log('I\'m an IIFE function')

    function bar () {
        console.log('I\'m an inner function inside IIFE')
    }

})()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the parser comes across the opening parenthesis, it understands that this is an IIFE and it would be called immediately, so it parses the &lt;code&gt;foo&lt;/code&gt; function using full parser or eager parser. Inside &lt;code&gt;foo&lt;/code&gt;, when it comes across the function &lt;code&gt;bar&lt;/code&gt;, it lazily parses or pre-parses the function &lt;code&gt;bar&lt;/code&gt; because, based on its heuristics, it knows that the function &lt;code&gt;bar&lt;/code&gt; won’t be called immediately. As the function &lt;code&gt;foo&lt;/code&gt; is fully parsed, V8 builds its AST as well as scopes while it doesn’t build an AST for function &lt;code&gt;bar&lt;/code&gt;. It builds only scopes for function &lt;code&gt;bar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Have you encountered this situation ever while writing JavaScript code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fparser-error.png%3Fsfvrsn%3Df08c6652_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fparser-error.png%3Fsfvrsn%3Df08c6652_1" title="parser-error" alt="parser-error" width="1162" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code throws an error only when you call the function &lt;code&gt;fnClickListener&lt;/code&gt;. This is because V8 doesn’t parse this function on the first load. It parses the function &lt;code&gt;fnClickListener&lt;/code&gt; only when you call it.&lt;/p&gt;

&lt;p&gt;Let’s consider a few more examples to better understand the heuristics followed by V8.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function toBeCalled() {}
toBeCalled()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function &lt;code&gt;toBeCalled&lt;/code&gt; is lazily parsed by the V8 engine. When it encounters the call to function &lt;code&gt;toBeCalled&lt;/code&gt;, it now uses a full parser to parse it completely. The time spent in lazily parsing the function &lt;code&gt;toBeCalled&lt;/code&gt; is actually wasted time. While V8 is lazily parsing function &lt;code&gt;toBeCalled&lt;/code&gt;, it doesn’t know that the immediate statement would be a call to this function. To avoid this, you can tell V8 which functions are to be eagerly-parsed (fully-parsed).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(function toBeCalled () {})
toBeCalled()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wrapping a function in parentheses is an indicator to V8 that this function is to be eagerly-parsed. You can also add an exclamation mark before the function declaration to tell V8 to eagerly-parse that function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!function toBeCalled () {}
toBeCalled()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parsing of Inner Functions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function outer () {
    function inner () {}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, V8 lazily parses both the functions, &lt;code&gt;outer&lt;/code&gt; and &lt;code&gt;inner&lt;/code&gt;. When we call &lt;code&gt;outer&lt;/code&gt;, the &lt;code&gt;outer&lt;/code&gt; function is eagerly/fully-parsed and &lt;code&gt;inner&lt;/code&gt; function is again lazily parsed. This means &lt;code&gt;inner&lt;/code&gt; function is lazily parsed twice. It gets even worse when functions are heavily nested.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function outer () {
    function inner () {
        function insideInner () {}
    }
    return inner
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initially, all the three functions &lt;code&gt;outer&lt;/code&gt;, &lt;code&gt;inner&lt;/code&gt; and &lt;code&gt;insideInner&lt;/code&gt; are lazily parsed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let innerFn = outer()
innerFn()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we call function &lt;code&gt;outer&lt;/code&gt;, it is fully-parsed and functions &lt;code&gt;inner&lt;/code&gt; and &lt;code&gt;insideInner&lt;/code&gt; are lazily parsed. Now, when we call &lt;code&gt;inner&lt;/code&gt;, &lt;code&gt;inner&lt;/code&gt; is fully parsed and &lt;code&gt;insideInner&lt;/code&gt; is lazily parsed. That makes &lt;code&gt;insideInner&lt;/code&gt; get parsed thrice. &lt;strong&gt;Don’t use nested functions when they are not required. Use nested functions appropriately!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Parsing of Closures
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(function outer () {
    let a = 2
    let b = 3
    function inner () {
        return a
    }
    return inner
})

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code snippet, since the function &lt;code&gt;outer&lt;/code&gt; is wrapped in parentheses, it is eagerly parsed. Function &lt;code&gt;inner&lt;/code&gt; is lazily parsed. &lt;code&gt;inner&lt;/code&gt; returns variable a, which is in the scope of its &lt;code&gt;outer&lt;/code&gt; function. This is a valid case for closure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let innerFn = outer()
innerFn()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&lt;br&gt;
innerFn&lt;/code&gt; very well returns a value of 2 since it has access to variable a of its parent scope. While parsing the function &lt;code&gt;inner&lt;/code&gt;, when V8 comes across the variable a, it looks up for variable a in the context of &lt;code&gt;inner&lt;/code&gt; function. Since a is not present in the scope of &lt;code&gt;inner&lt;/code&gt;, it checks it in the scope of function &lt;code&gt;outer&lt;/code&gt;. V8 understands that the variable a is to be saved in the function context and is to be preserved even after &lt;code&gt;outer&lt;/code&gt; function has completed its execution. So, variable a is stored in the function context of &lt;code&gt;outer&lt;/code&gt; and is preserved until its dependent function &lt;code&gt;inner&lt;/code&gt; has completed execution. Please note, variable b is not preserved in this case as it is not used in any of the inner functions.&lt;/p&gt;

&lt;p&gt;When we call function &lt;code&gt;innerFn&lt;/code&gt;, the value of a is not found in the call stack, we then look up for its value in the function context. Lookups in function context are costly as compared to lookups in the call stack.&lt;/p&gt;

&lt;p&gt;Let’s check the parsed code generated by V8.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function fnCalled () {
    console.log('Inside fnCalled')
}

function fnNotCalled () {
    console.log('Inside fnNotCalled')
}

fnCalled()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As per our understanding, both of these functions will be lazily parsed and when we make a function call to &lt;code&gt;fnCalled&lt;/code&gt;, it would be fully parsed and print &lt;em&gt;Inside fnCalled&lt;/em&gt;. Let’s see this in action. Run the file containing the above code as &lt;code&gt;node --trace_parse parse.js&lt;/code&gt;. If you’ve cloned my &lt;a href="https://github.com/ankita1910/js-internals" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, you’ll find this file under public/js folder. &lt;code&gt;parse.js&lt;/code&gt; is the name of the file, and &lt;code&gt;--trace_parse&lt;/code&gt; serves as an indicator to the runtime of nodejs to print the parsed output. This command would generate a dump of parsing logs. I’ll save the output of this command in a file &lt;a href="https://github.com/ankita1910/js-internals/blob/master/parsedOutput.txt" rel="noopener noreferrer"&gt;parsedOutput.txt&lt;/a&gt;. For now, all that makes sense is the below screenshot of the dump.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fparsed-output.png%3Fsfvrsn%3D4c64e1d6_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fparsed-output.png%3Fsfvrsn%3D4c64e1d6_1" title="parsed-output" alt="parsed-output" width="940" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Function &lt;code&gt;fnCalled&lt;/code&gt; is parsed, but function &lt;code&gt;fnNotCalled&lt;/code&gt; is not parsed. Try searching for &lt;code&gt;fnNotCalled&lt;/code&gt; in the &lt;a href="https://github.com/ankita1910/js-internals/blob/master/parsedOutput.txt" rel="noopener noreferrer"&gt;dump&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script Streaming
&lt;/h2&gt;

&lt;p&gt;Now that we know how parsing works in V8, let’s understand one concept related to Script Streaming. Script Streaming is effective from Chrome version 41.&lt;/p&gt;

&lt;p&gt;From what we’ve learned till now, we know it’s the main thread that parses the JavaScript code (even with async and defer keywords). With Script Streaming in place, now the parsing can happen in another thread. While the script is still getting downloaded by the main thread, the parser thread can start parsing the script. This means that the parsing would be completed in line with the download. This technique proves very helpful for large scripts and slow network connections. Check out the below image to understand how the browser operates with Script Streaming and without Script Streaming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fstreaming.png%3Fsfvrsn%3D709711b0_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fstreaming.png%3Fsfvrsn%3D709711b0_1" title="streaming" alt="streaming" width="590" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, we learned multiple ways of downloading scripts based on the use case. We learned how the parser generates an Abstract Syntax Tree and its heuristics while parsing the code. Later in the article, we learned about Script Streaming. In the next article, we’ll learn how parsing code gets compiled by the V8 compiler.&lt;/p&gt;

&lt;h2&gt;
  
  
  For More on Building Apps with jQuery:
&lt;/h2&gt;

&lt;p&gt;Want to learn more about creating great user interfaces with jQuery? Check out &lt;a href="https://www.telerik.com/kendo-jquery-ui" rel="noopener noreferrer"&gt;Kendo UI for jQuery&lt;/a&gt; - our complete UI component library that allows you to quickly build high-quality, responsive apps. It includes all the components you’ll need, from grids and charts to schedulers and dials.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>scripts</category>
      <category>parsing</category>
    </item>
    <item>
      <title>Telerik UI for Blazor: Grid Component Basics</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Tue, 19 Feb 2019 18:13:45 +0000</pubDate>
      <link>https://forem.com/progresstelerik/telerik-ui-for-blazor-grid-component-basics-3180</link>
      <guid>https://forem.com/progresstelerik/telerik-ui-for-blazor-grid-component-basics-3180</guid>
      <description>&lt;p&gt;The Telerik UI for Blazor data grid features functionality like paging, sorting, templates, and themes out of the box. Learn how to get started with the grid's basic features today.&lt;/p&gt;

&lt;p&gt;Telerik UI for Blazor is a brand new library of UI components for the Razor Components and Blazor frameworks. Even though Telerik UI for Blazor is in an "Early Preview" stage it ships with one of the most popular and versatile UI components, the data grid. The data grid features out-of-the-box functionality like paging, sorting, templates, and themes. In this article we will focus how to get started with the grid's basic features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjnf5sei.gif%3Fsfvrsn%3D8f4eab1_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjnf5sei.gif%3Fsfvrsn%3D8f4eab1_1" title="Grid component" alt="Grid animated showing paging and sorting" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Since the ASP.NET Preview's are moving at a rapid place, it's best to update your bits. Make sure you're on the current version of Razor Components (server-side) and Blazor (client-side) since we'll be working with both. Detailed installation instructions for both frameworks can be found on the &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/razor-components/get-started?view=aspnetcore-3.0&amp;amp;tabs=visual-studio" rel="noopener noreferrer"&gt;Blazor getting started page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also be sure that you have enabled the &lt;a href="https://www.telerik.com/download-trial-file/v2-b/ui-for-blazor" rel="noopener noreferrer"&gt;Telerik UI for Blazor free early preview&lt;/a&gt;. Even if you have previously enrolled in the preview you may need to revisit this page for the latest version to appear in your feed. With this free account you'll be able to add the &lt;a href="https://docs.telerik.com/aspnet-mvc/getting-started/nuget-install#set-up-nuget-package-source" rel="noopener noreferrer"&gt;Telerik NuGet Package Source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before we begin, you may wonder why the &lt;strong&gt;Kendo&lt;/strong&gt; namespace appears when using Telerik UI for Blazor. That's because the Telerik UI for Blazor shares web resources (HTML &amp;amp; CSS) with our  &lt;strong&gt;Kendo UI&lt;/strong&gt; brand of components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Installing Telerik UI for Blazor requires just a few simple steps. First we'll need to install the package binaries. We'll be using the Telerik NuGet Package Source to install the package. If you don't have the Telerik Package Source already please see the &lt;strong&gt;Prerequisites&lt;/strong&gt; section above.&lt;/p&gt;

&lt;p&gt;If you have multiple solutions in your project, install the package to the project which contains the "Pages" folder. These are the views for your application.&lt;/p&gt;

&lt;p&gt;We can use the Package Manager dialog, command line, or directly edit the .csproj file of the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NuGet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Ftelerik-blazor-nuget.jpg%3Fsfvrsn%3D48d9e6d_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Ftelerik-blazor-nuget.jpg%3Fsfvrsn%3D48d9e6d_1" title="Telerik UI for Blazor Nuget" alt="Telerik UI for Blazor Nuget" width="1618" height="899"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command line&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ dotnet add package Telerik.UI.for.Blazor

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Edit .csproj&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;PackageReference Include="Telerik.UI.for.Blazor" Version="0.2.0" /&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the Telerik UI for Blazor package has been installed, we'll need to make a reference to the components in the package. This will act as a global &lt;code&gt;using&lt;/code&gt; statement for our application. Open the root _ViewImports file and add the &lt;code&gt;@addTagHelper *, Kendo.Blazor&lt;/code&gt; directive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;_ViewImports.cshtml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@addTagHelper *,Kendo.Blazor

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also need to register the the library with dependency injection. This will resolve any dependencies needed by the components. In the same solution, open the &lt;code&gt;Startup&lt;/code&gt; class and register the &lt;code&gt;AddKendoBlazor&lt;/code&gt; service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.AddKendoBlazor();

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we'll need to add the CSS theme files to the application. At the time of writing Telerik UI for Blazor supports three of the Kendo UI themes: Default, Bootstrap 4, and Material Design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgrid-themes.jpg%3Fsfvrsn%3Ddf1127bb_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgrid-themes.jpg%3Fsfvrsn%3Ddf1127bb_1" title="Grid themes" alt="Grid themes" width="968" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have multiple solutions in your project, find the project which contains the "wwwroot" folder. These are the static resources for your application. In the root of the project, add a file named &lt;code&gt;libman.json&lt;/code&gt;. LibMan is a client-side library manager built into Visual Stuido (with CLI support) that will fetch static resources and save them to your project.&lt;/p&gt;

&lt;p&gt;Add the following configuration to your &lt;code&gt;libman.json&lt;/code&gt; file. Save the file and all three component themes will be copied to your &lt;code&gt;wwwroot&lt;/code&gt; folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "version": "1.0",
  "defaultProvider": "unpkg",
  "libraries": [
    {
      "library": "@progress/kendo-theme-default@3.0.0",
      "destination": "wwwroot/css/kendo-themes/default",
      "files": [
        "dist/all.css"
      ]
    },
    {
      "library": "@progress/kendo-theme-bootstrap@3.0.0",
      "destination": "wwwroot/css/kendo-themes/bootstrap",
      "files": [
        "dist/all.css"
      ]
    },
    {
      "library": "@progress/kendo-theme-material@2.0.0",
      "destination": "wwwroot/css/kendo-themes/material",
      "files": [
        "dist/all.css"
      ]
    }
  ]
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the themes installed, reference the desired theme from your application's &lt;code&gt;index.html&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;wwwroot/Index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;head&amp;gt;
    ...
    &amp;lt;!-- &amp;lt;link rel="stylesheet" href="/css/kendo-themes/material/dist/all.css" /&amp;gt;
    &amp;lt;link rel="stylesheet" href="/css/kendo-themes/default/dist/all.css" /&amp;gt; --&amp;gt;
    &amp;lt;link rel="stylesheet" href="/css/kendo-themes/bootstrap/dist/all.css" /&amp;gt;
&amp;lt;/head&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Now we're ready to begin building Razor Components or Blazor applications using Telerik UI for Blazor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grid Component
&lt;/h2&gt;

&lt;p&gt;The The Telerik UI for Blazor KendoGrid (Grid) is a data grid component that is compatible with both Razor Components and client-side Blazor. Thanks to these new breakthrough frameworks, the Grid does &lt;strong&gt;not&lt;/strong&gt; require any JavaScript. The grid component is simple to implement, yet has a robust set of features like data binding, paging, sorting and templates. In addition, Razor Components and Blazor offer unique capabilities for bringing data into the grid. Depending on the mode of operation the data source can pull directly from Entity Framework (Razor Components), or via remote HTTP request (Blazor).&lt;/p&gt;

&lt;p&gt;The basic Grid is made up of a few components that define the grid and its columns. The grid itself and its columns have parameters which are used to enable/disable functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;KendoGrid parameters...&amp;gt;
    &amp;lt;RowTemplate/&amp;gt;
    &amp;lt;KendoGridColumns&amp;gt;
       &amp;lt;KendoGridColumn parameters.../&amp;gt;
    &amp;lt;/KendoGridColumns&amp;gt;
&amp;lt;/KendoGrid&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's start with the basic properties and then we'll learn about the different data sources we can use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Properties
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Height&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When the height of the Grid is set, it calculates the appropriate height of its scrollable data area, so that the sum of the header rows, filter row, data, footer, and pager is equal to the expected height of the component. If the height of the Grid is changed through code after it's created the Grid it recalculates the height of its data area.&lt;/p&gt;

&lt;p&gt;In some special scenarios it is possible to set a height style to the scrollable data area of the Grid by external CSS, which is a &lt;code&gt;div.k-grid-content&lt;/code&gt; element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;KendoGrid Height=@Height ... &amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Grid's data plays a central role in practically all web applications built with Telerik UI for Blazor. The Data parameter accepts any data source that implements the IEnumerable interface. The data may be supplied from sources such as Entity Framework, local arrays and lists, and remote sources like HTTP requests via &lt;code&gt;HttpClient&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@inject WeatherForecastService ForecastService
&amp;lt;KendoGrid Data=@GridData ... &amp;gt;
    &amp;lt;KendoGridColumns&amp;gt;
    ...
    &amp;lt;/KendoGridColumns&amp;gt;
&amp;lt;/KendoGrid&amp;gt;

@functions {
    public IEnumerable&amp;lt;WeatherForecast&amp;gt; GridData { get; set; }
    protected override async Task OnInitAsync()
    {
        GridData = await ForecastService.GetForecastAsync(DateTime.Now);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Columns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;KendoGridColumns&lt;/code&gt; component is the root level configuration of the grid columns. Nested beneath &lt;code&gt;KendoGridColumns&lt;/code&gt; are individual &lt;code&gt;KendoGridColumn&lt;/code&gt; components. These components are interpreted as column configurations where the &lt;code&gt;Field&lt;/code&gt; parameter is a string to which the column is bound. The column will use the property name as the column header by default, but this can be explicitly set using the &lt;code&gt;Title&lt;/code&gt; parameter. In the example below, the &lt;code&gt;nameof&lt;/code&gt; operator is used to get the string representation of the &lt;code&gt;ProductName&lt;/code&gt; property. Since we're dealing with C#, the &lt;code&gt;nameof&lt;/code&gt; operator provides better tooling support for refactoring.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;KendoGrid parameters...&amp;gt;
     &amp;lt;KendoGridColumns&amp;gt;
       &amp;lt;KendoGridColumn Field=@nameof(Product.ProductName) Title="Product Name"/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Ftitle-set.jpg%3Fsfvrsn%3D57d16ac4_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Ftitle-set.jpg%3Fsfvrsn%3D57d16ac4_1" title="Title-set" alt="Title-set" width="368" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sortable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To enable sorting on all Grid columns, simply set the &lt;code&gt;Sortable&lt;/code&gt; parameter. When the &lt;code&gt;Sortable&lt;/code&gt; parameter is set to &lt;code&gt;true&lt;/code&gt;, users can easily click the column headers to change how the data is sorted in the Grid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;KendoGrid Sortable=bool parameters...&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Paging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the Grid we have full control over the Pager. The pager can be enabled/disabled through the &lt;code&gt;Pageable&lt;/code&gt; parameter. We can also define a &lt;code&gt;PageSize&lt;/code&gt; and set the initial &lt;code&gt;Page&lt;/code&gt; value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;KendoGrid Pageable=bool PageSize=int Page=int parameters...&amp;gt;`

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fpager.jpg%3Fsfvrsn%3Dd70ff853_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fpager.jpg%3Fsfvrsn%3Dd70ff853_1" title="pager" alt="pager" width="1015" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Templates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we would like more flexibility in how our data is displayed, we can tap into the template features of the Grid. Within any column we can simply open a &lt;code&gt;Template&lt;/code&gt; component and access an object reference to the current item bound to a given row. The &lt;code&gt;Template&lt;/code&gt; content can contain HTML markup, Razor code, or even other Components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;KendoGrid Data=@GridData&amp;gt;
    &amp;lt;KendoGridColumns&amp;gt;
        &amp;lt;KendoGridColumn Field=@nameof(Product.ProductId) Title="Id"/&amp;gt;
        &amp;lt;KendoGridColumn Field=@nameof(Product.ProductName) Title="Product Name"/&amp;gt;
        &amp;lt;KendoGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price"&amp;gt;
            &amp;lt;Template&amp;gt;
                @(String.Format("{0:C2}", (context as Product).UnitPrice))
            &amp;lt;/Template&amp;gt;
        &amp;lt;/KendoGridColumn&amp;gt;
    &amp;lt;/KendoGridColumns&amp;gt;
&amp;lt;/KendoGrid&amp;gt;

@functions {
    public IEnumerable&amp;lt;Product&amp;gt; GridData { get; set; }

    protected override async Task OnInitAsync()
    {
        GridData = await nwContext.Products.ToListAsync();
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Data
&lt;/h2&gt;

&lt;p&gt;Because the Grid uses the IEnumerable interface for its data source, it has very flexible data binding. Depending on what context your application runs in, either Razor Components (server-side) or Blazor (client-side), you may have different requirements for connecting to data. Let's look at how dependency injection helps connect our Grid to a data source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Razor Components (server-side operation)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since Razor Components run in the context of the server, we can connect to directly to data through Entity Framework. One of the benefits to working with Razor Components is that our application doesn't need to create an HTTP request to connect to data.&lt;/p&gt;

&lt;p&gt;We'll be using dependency injection to reference an instance of our database context, so we will need to register our service on startup. In the ConfigureServices method of the Startup class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    var connection = "my-connection-string";
    var options = new DbContextOptionsBuilder&amp;lt;NorthwindContext&amp;gt;()
                        .UseSqlServer(connection)
                        .Options;
    services.AddSingleton(new NorthwindContext(options));
    ...
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With our DbContext registered with dependency injection we can now inject the context on our page using the &lt;code&gt;@inject&lt;/code&gt; directive. Inject will resolve a reference to an instance of the NorthwindContext and assign it to the &lt;code&gt;nwContext&lt;/code&gt; variable. When the page initializes we call &lt;code&gt;ToListAsync&lt;/code&gt; on the Products data set and update the GridData property with the results. Since the GridData property is bound to the Grid it will update when &lt;code&gt;OnInitAsync&lt;/code&gt; completes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@using TelerikBlazor.App.Models // Product is defined here
@inject NorthwindContext nwContext

&amp;lt;KendoGrid Data=@GridData&amp;gt;
    &amp;lt;KendoGridColumns&amp;gt;
        &amp;lt;KendoGridColumn Field=@nameof(Product.ProductId) Title="Id"/&amp;gt;
        &amp;lt;KendoGridColumn Field=@nameof(Product.ProductName) Title="Product Name"/&amp;gt;
        &amp;lt;KendoGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price"&amp;gt;
            &amp;lt;Template&amp;gt;
                @(String.Format("{0:C2}", (context as Product).UnitPrice))
            &amp;lt;/Template&amp;gt;
        &amp;lt;/KendoGridColumn&amp;gt;
    &amp;lt;/KendoGridColumns&amp;gt;
&amp;lt;/KendoGrid&amp;gt;

@functions {
    public IEnumerable&amp;lt;Product&amp;gt; GridData { get; set; }
    int PageSize = 10;
    bool Pageable = false;
    bool Sortable = false;
    decimal Height = 400;

    protected override async Task OnInitAsync()
    {
        GridData = await nwContext.Products.ToListAsync();
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we've seen how server-side operation works, let's take a look at using the Grid with Blazor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blazor (client-side operation)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Telerik UI for Blazor is compatible on the client, but currently has a known issue which requires disabling the Blazor IL Linker. Without digging into IL Linking too deep, the result of disabling it only results in a larger payload size. This is a temporary situation that will be resolved in later versions of the framework.&lt;/p&gt;

&lt;p&gt;To disable IL Linker, open the .csproj file and add &lt;code&gt;&amp;lt;BlazorLinkOnBuild&amp;gt;false&amp;lt;/BlazorLinkOnBuild&amp;gt;&lt;/code&gt; to the top most property group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;PropertyGroup&amp;gt;
    ...
    &amp;lt;LangVersion&amp;gt;7.3&amp;lt;/LangVersion&amp;gt;
    &amp;lt;!-- add the line below to disable IL Linker --&amp;gt;
    &amp;lt;BlazorLinkOnBuild&amp;gt;false&amp;lt;/BlazorLinkOnBuild&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar to server-side operation, we'll be using the &lt;code&gt;@inject&lt;/code&gt; directive. On the client our app is disconnected from the database and we'll need to make an HTTP request for data. Instead of injecting our DbContext we will instead resolve an instance of HttpClient. When the page initializes we'll make an HTTP request using &lt;code&gt;GetJsonAsync&lt;/code&gt; and update the GridData property with the results. Since the GridData property is bound to the Grid it will update when &lt;code&gt;OnInitAsync&lt;/code&gt; completes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@using WebApplication6.Shared // WeatherForecast is defined here
@inject HttpClient Http

&amp;lt;KendoGrid Data=@forecasts&amp;gt;
    &amp;lt;KendoGridColumns&amp;gt;
        &amp;lt;KendoGridColumn Field="@nameof(WeatherForecast.TemperatureC)" Title="Temp. ℃"/&amp;gt;
        &amp;lt;KendoGridColumn Field="@nameof(WeatherForecast.Summary)"/&amp;gt;
    &amp;lt;/KendoGridColumns&amp;gt;
&amp;lt;/KendoGrid&amp;gt;

@functions {
    WeatherForecast[] forecasts;

    protected override async Task OnInitAsync()
    {
        forecasts = await Http.GetJsonAsync&amp;lt;WeatherForecast[]&amp;gt;("api/SampleData/WeatherForecasts");
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Grid works with both Razor Components and Blazor using the same markup. The only aspect of the code that changes is how the data is retrieved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The Telerik UI for Blazor Early Preview kicked off with one of the most popular and powerful components, the Grid. We saw how the Grid can quickly make use of paging, sorting, templates, and themes. Leveraging the Razor Components or Blazor frameworks, we can fetch data directly from our database or HTTP and easily bind the data source.&lt;/p&gt;

&lt;p&gt;We covered just the basic features of the Grid, but there's much more we can do with templates. In an upcoming article we'll take a closer look at row and column templates to see what is possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgithub-examples.jpg%3Fsfvrsn%3D1b20b3d_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgithub-examples.jpg%3Fsfvrsn%3D1b20b3d_1" title="GitHub-examples" alt="GitHub-examples" width="1377" height="862"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're ready to try Razor Components and Blazor then create an account for the &lt;a href="https://www.telerik.com/download-trial-file/v2-b/ui-for-blazor" rel="noopener noreferrer"&gt;Telerik UI for Blazor free early preview&lt;/a&gt;. Once you've signed up feel free to explore our extensive &lt;a href="https://github.com/telerik/ui-for-blazor-examples" rel="noopener noreferrer"&gt;examples on GitHub&lt;/a&gt;, and happy coding.&lt;/p&gt;

</description>
      <category>telerik</category>
      <category>blazor</category>
      <category>datagrid</category>
    </item>
  </channel>
</rss>
