SlideShare ist ein Scribd-Unternehmen logo
1 von 39
© 2017 Sencha Inc. • CONFIDENTIAL •
Introducing ExtReact:Adding
Powerful Sencha Components
to ReactApps
Mark Brocato
Engineering Director, Sencha
@mockaroodev
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext JS
Ext JS
Components
Ext JS Framework
© 2017 Sencha Inc. • CONFIDENTIAL •
React: A Component Framework w/o Components
Ext JS
Components
Ext JS Framework
ExtReact
React.js
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact
Use All Ext JS Components in React
© 2017 Sencha Inc. • CONFIDENTIAL •
Motivation for ExtReact
• No complete component libraries available for React
• Dependency fatigue
• Form without function
• Head start
• Data-driven, enterprise apps
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact: 100+ Components
• Grid
• List
• Tree
• Calendar
• Layouts
• Form Fields
• Animations
• Charts
• D3 Visualizations
© 2017 Sencha Inc. • CONFIDENTIAL •
@extjs/reactor
GitHub: extjs-reactor
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact vs Ext JS + React
ExtReact
• Separate license from Ext JS (annual
subscription, perpetual distribution
rights)
• Streamlined installation (NPM)
• Modern toolkit only (Ext JS 6.5)
Ext JS + Reactor
• Use your existing Ext JS license
• Traditional Ext JS installation process
• Modern + Classic toolkits
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact Grid
<Grid title="Stock Prices" store={this.store}>
<Column text="Company" dataIndex="name"/>
<Column text="Price" dataIndex="price" formatter='usMoney'/>
<Column text="Change" dataIndex="priceChange"/>
<Column text="% Change" dataIndex="priceChangePct"/>
<Column text="Last Updated" dataIndex="lastChange" formatter='date("m/d/Y")'/>
</Grid>
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact for Ext JS Developers
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true
});
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
itemtap: function(list, index, target, record) {
console.log(`Tapped ${record.get('name')}`)
}
}
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
itemtap: function(list, index, target, record) {
console.log(`Tapped ${record.get('name')}`)
}
}
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
onItemTap={(list, index, target, record) => {
console.log(`Tapped ${record.get('name')}`)
}}
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
itemtap: function(list, index, target, record) {
console.log(`Tapped ${record.get('name')}`)
},
show: {
single: true,
fn: function() {
// load store
}
}
}
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
onItemTap={(list, index, target, record) => {
console.log(`Tapped ${record.get('name')}`)
}}
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
itemtap: function(list, index, target, record) {
console.log(`Tapped ${record.get('name')}`)
},
show: {
single: true,
fn: function() {
// load store
}
}
}
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
onItemTap={(list, index, target, record) => {
console.log(`Tapped ${record.get('name')}`)
}}
onShow={{
single: true,
fn: () => {
// load store
}
}}
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
itemtap: function(list, index, target, record) {
console.log(`Tapped ${record.get('name')}`)
},
show: {
single: true,
fn: function() {
// load store
}
}
},
itemTpl: (
'<div>' +
'<div>{firstName} {lastName}</div>' +
'<div>{title}</div>' +
'</div>'
)
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
onItemTap={(list, index, target, record) => {
console.log(`Tapped ${record.get('name')}`)
}}
onShow={{
single: true,
fn: () => {
// load store
}
}}
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
itemtap: function(list, index, target, record) {
console.log(`Tapped ${record.get('name')}`)
},
show: {
single: true,
fn: function() {
// load store
}
}
},
itemTpl: (
'<div>' +
'<div>{firstName} {lastName}</div>' +
'<div>{title}</div>' +
'</div>'
)
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
onItemTap={(list, index, target, record) => {
console.log(`Tapped ${record.get('name')}`)
}}
onShow={{
single: true,
fn: () => {
// load store
}
}}
itemTpl={data => (
<div>
<div>{data.firstName} {data.lastName}</div>
<div>{data.title}</div>
</div>
)}
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
...
},
itemTpl: (
'<div>' +
'<div>{firstName} {lastName}</div>' +
'<div>{title}</div>' +
'</div>'
)
items: [{
xtype: 'toolbar',
docked: 'top'
items: [{
xtype: 'button',
text: 'Refresh'
}]
}]
});
import { List } from '@extjs/ext-react';
<List
store={contacts}
grouped
onItemTap={(list, index, target, record) => {
console.log(`Tapped ${record.get('name')}`)
}}
onShow={{
single: true,
fn: () => {
// load store
}
}}
itemTpl={data => (
<div>
<div>{data.firstName} {data.lastName}</div>
<div>{data.title}</div>
</div>
)}
/>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
Ext.create({
xtype: 'list',
store: contacts,
grouped: true,
listeners: {
...
},
itemTpl: (
'<div>' +
'<div>{firstName} {lastName}</div>' +
'<div>{title}</div>' +
'</div>'
)
items: [{
xtype: 'toolbar',
docked: 'top'
items: [{
xtype: 'button',
text: 'Refresh'
}]
}]
});
20
import { List, Toolbar, Button } from '@extjs/ext-react';
<List
store={contacts}
grouped
...
itemTpl={data => (
<div>
<div>{firstName} {lastName}</div>
<div>{title}</div>
</div>
)}
>
<Toolbar>
<Button
text="Refresh"
/>
</Toolbar>
</List>
Ext JS ExtReact
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact Components are Themable
• Each can be extended using SASS or Sencha Themer
Triton Material iOS
© 2017 Sencha Inc. • CONFIDENTIAL •
Sencha Themer
22
© 2017 Sencha Inc. • CONFIDENTIAL •
FAQ
• Controllers
• ViewModels
How much of the Ext JS framework will I use?
Components
Stores
Models
Grid, Tree, Calendar, etc…
Flux (Redux, MobX, et al...)
© 2017 Sencha Inc. • CONFIDENTIAL •
Components Virtual DOM DOMExtReact?
Ext JS
FAQ
Does ExtReact use the Virtual DOM?
© 2017 Sencha Inc. • CONFIDENTIAL •
FAQ
Can I reuse components from pure Ext JS apps?
import { reactify } from '@extjs/reactor';
const MyCustomComponent = reactify(MyPackage.MyCustomComponent);
...
render() {
return <MyCustomComponent ... />
}
© 2017 Sencha Inc. • CONFIDENTIAL •
ExtReact: Getting Set Up
© 2017 Sencha Inc. • CONFIDENTIAL •
Sign up for a trial at sencha.com
npm login --registry=http://npm.sencha.com --scope=@extjs
© 2017 Sencha Inc. • CONFIDENTIAL •
Use Yeoman to create new apps
npm install –g yo @extjs/generator-ext-react
yo @extjs/ext-react
© 2017 Sencha Inc. • CONFIDENTIAL •
GitHub: sencha/extjs-reactor
packages/reactor-modern-boilerplate
packages/reactor-classic-boilerplate
© 2017 Sencha Inc. • CONFIDENTIAL •
Adding ExtReact to an Existing React App
• npm install --save @extjs/reactor @extjs/ext-react
• npm install --save-dev @extjs/reactor-webpack-plugin @extjs/reactor-babel-plugin
© 2017 Sencha Inc. • CONFIDENTIAL •
Adding Ext JS to an Existing React App
• npm install --save @extjs/reactor
• npm install --save-dev @extjs/reactor-webpack-plugin @extjs/reactor-babel-plugin
• Download and unzip Ext JS from sencha.com
© 2017 Sencha Inc. • CONFIDENTIAL •
Webpack
import ExtReactWebpackPlugin from '@extjs/reactor-webpack-plugin’
...
plugins: [
new ExtReactWebpackPlugin({
theme: 'theme-material'
}),
]
© 2017 Sencha Inc. • CONFIDENTIAL •
Webpack
import ExtReactWebpackPlugin from '@extjs/reactor-webpack-plugin’
...
plugins: [
new ExtReactWebpackPlugin({
theme: 'theme-material',
// not needed for ExtReact
sdk: '/path/to/extjs',
toolkit: 'modern'
packages: ['charts']
}),
]
© 2017 Sencha Inc. • CONFIDENTIAL •
Babel
.babelrc
{
"plugins": [
"@extjs/reactor-babel-plugin"
]
}
© 2017 Sencha Inc. • CONFIDENTIAL •
React App Launch
import React from ’react';
import App from './App'; // app components
import { launch } from '@extjs/reactor';
launch(<App/>); // replaces ReactDOM.render(<App/>, document.getElementById(‘root’))
© 2017 Sencha Inc. • CONFIDENTIAL •
Live Demos
© 2017 Sencha Inc. • CONFIDENTIAL •
Sencha Fiddle
https://fiddle.sencha.com/?extreact
© 2017 Sencha Inc. • CONFIDENTIAL •
Q&A
© 2017 Sencha Inc. • CONFIDENTIAL •
Thank You!

Weitere ähnliche Inhalte

Was ist angesagt?

Coder Presentation Szeged
Coder Presentation SzegedCoder Presentation Szeged
Coder Presentation Szeged
Doug Green
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Paulo Ragonha
 

Was ist angesagt? (20)

Drupal 8 Services And Dependency Injection
Drupal 8 Services And Dependency InjectionDrupal 8 Services And Dependency Injection
Drupal 8 Services And Dependency Injection
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
 
CodeIgniter 3.0
CodeIgniter 3.0CodeIgniter 3.0
CodeIgniter 3.0
 
AngularJS Basics with Example
AngularJS Basics with ExampleAngularJS Basics with Example
AngularJS Basics with Example
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
 
AngularJS Directives
AngularJS DirectivesAngularJS Directives
AngularJS Directives
 
Coder Presentation Szeged
Coder Presentation SzegedCoder Presentation Szeged
Coder Presentation Szeged
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorial
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Getting Into Drupal 8 Configuration
Getting Into Drupal 8 ConfigurationGetting Into Drupal 8 Configuration
Getting Into Drupal 8 Configuration
 
Intro to Angular.JS Directives
Intro to Angular.JS DirectivesIntro to Angular.JS Directives
Intro to Angular.JS Directives
 
Build Amazing Add-ons for Atlassian JIRA and Confluence
Build Amazing Add-ons for Atlassian JIRA and ConfluenceBuild Amazing Add-ons for Atlassian JIRA and Confluence
Build Amazing Add-ons for Atlassian JIRA and Confluence
 
Becoming A Drupal Master Builder
Becoming A Drupal Master BuilderBecoming A Drupal Master Builder
Becoming A Drupal Master Builder
 
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginDrupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
 
Oleksandr Tolstykh
Oleksandr TolstykhOleksandr Tolstykh
Oleksandr Tolstykh
 
Django
DjangoDjango
Django
 
Advanced Tips & Tricks for using Angular JS
Advanced Tips & Tricks for using Angular JSAdvanced Tips & Tricks for using Angular JS
Advanced Tips & Tricks for using Angular JS
 
Academy PRO: React native - navigation
Academy PRO: React native - navigationAcademy PRO: React native - navigation
Academy PRO: React native - navigation
 
Getting the Most Out of jQuery Widgets
Getting the Most Out of jQuery WidgetsGetting the Most Out of jQuery Widgets
Getting the Most Out of jQuery Widgets
 
Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!
 

Andere mochten auch

Andere mochten auch (16)

Sencha Roadshow 2017: BufferedStore Internals featuring eyeworkers interactiv...
Sencha Roadshow 2017: BufferedStore Internals featuring eyeworkers interactiv...Sencha Roadshow 2017: BufferedStore Internals featuring eyeworkers interactiv...
Sencha Roadshow 2017: BufferedStore Internals featuring eyeworkers interactiv...
 
Sencha Roadshow 2017: Mobile First or Desktop First
Sencha Roadshow 2017: Mobile First or Desktop FirstSencha Roadshow 2017: Mobile First or Desktop First
Sencha Roadshow 2017: Mobile First or Desktop First
 
SenchaCon 2016: Improve Workflow Driven Applications with Ext JS Draw Package...
SenchaCon 2016: Improve Workflow Driven Applications with Ext JS Draw Package...SenchaCon 2016: Improve Workflow Driven Applications with Ext JS Draw Package...
SenchaCon 2016: Improve Workflow Driven Applications with Ext JS Draw Package...
 
Leveraging React and GraphQL to Create a Performant, Scalable Data Grid
Leveraging React and GraphQL to Create a Performant, Scalable Data GridLeveraging React and GraphQL to Create a Performant, Scalable Data Grid
Leveraging React and GraphQL to Create a Performant, Scalable Data Grid
 
Sencha Roadshow 2017: Sencha Best Practices: Coworkee App
Sencha Roadshow 2017: Sencha Best Practices: Coworkee App Sencha Roadshow 2017: Sencha Best Practices: Coworkee App
Sencha Roadshow 2017: Sencha Best Practices: Coworkee App
 
Building Ext JS Using HATEOAS - Jeff Stano
Building Ext JS Using HATEOAS - Jeff StanoBuilding Ext JS Using HATEOAS - Jeff Stano
Building Ext JS Using HATEOAS - Jeff Stano
 
Sencha Roadshow 2017: Innovations in Ext JS 6.5 and Beyond
Sencha Roadshow 2017: Innovations in Ext JS 6.5 and BeyondSencha Roadshow 2017: Innovations in Ext JS 6.5 and Beyond
Sencha Roadshow 2017: Innovations in Ext JS 6.5 and Beyond
 
Sencha Roadshow 2017: Sencha Upgrades - The Good. The Bad. The Ugly - Eva Luc...
Sencha Roadshow 2017: Sencha Upgrades - The Good. The Bad. The Ugly - Eva Luc...Sencha Roadshow 2017: Sencha Upgrades - The Good. The Bad. The Ugly - Eva Luc...
Sencha Roadshow 2017: Sencha Upgrades - The Good. The Bad. The Ugly - Eva Luc...
 
SenchaCon 2016: Expect the Unexpected - Dealing with Errors in Web Apps
SenchaCon 2016: Expect the Unexpected - Dealing with Errors in Web AppsSenchaCon 2016: Expect the Unexpected - Dealing with Errors in Web Apps
SenchaCon 2016: Expect the Unexpected - Dealing with Errors in Web Apps
 
SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...
SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...
SenchaCon 2016: Add Magic to Your Ext JS Apps with D3 Visualizations - Vitaly...
 
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
 
Learn Key Insights from The State of Web Application Testing Research Report
Learn Key Insights from The State of Web Application Testing Research ReportLearn Key Insights from The State of Web Application Testing Research Report
Learn Key Insights from The State of Web Application Testing Research Report
 
Sencha Roadshow 2017: Best Practices for Implementing Continuous Web App Testing
Sencha Roadshow 2017: Best Practices for Implementing Continuous Web App TestingSencha Roadshow 2017: Best Practices for Implementing Continuous Web App Testing
Sencha Roadshow 2017: Best Practices for Implementing Continuous Web App Testing
 
Sencha Roadshow 2017: Build Progressive Web Apps with Ext JS and Cmd
Sencha Roadshow 2017: Build Progressive Web Apps with Ext JS and Cmd Sencha Roadshow 2017: Build Progressive Web Apps with Ext JS and Cmd
Sencha Roadshow 2017: Build Progressive Web Apps with Ext JS and Cmd
 
SenchaCon 2016: Mobile First? Desktop First? Or Should you Think Universal Ap...
SenchaCon 2016: Mobile First? Desktop First? Or Should you Think Universal Ap...SenchaCon 2016: Mobile First? Desktop First? Or Should you Think Universal Ap...
SenchaCon 2016: Mobile First? Desktop First? Or Should you Think Universal Ap...
 
Sencha Roadshow 2017: What's New in Sencha Test
Sencha Roadshow 2017: What's New in Sencha TestSencha Roadshow 2017: What's New in Sencha Test
Sencha Roadshow 2017: What's New in Sencha Test
 

Ähnlich wie Introducing ExtReact: Adding Powerful Sencha Components to React Apps

Developing components and extensions for ext js
Developing components and extensions for ext jsDeveloping components and extensions for ext js
Developing components and extensions for ext js
Mats Bryntse
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
Ankur Dongre
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
Ankur Dongre
 

Ähnlich wie Introducing ExtReact: Adding Powerful Sencha Components to React Apps (20)

Introduction to Spring Boot.pdf
Introduction to Spring Boot.pdfIntroduction to Spring Boot.pdf
Introduction to Spring Boot.pdf
 
ReactJS Tutorial For Beginners | ReactJS Redux Training For Beginners | React...
ReactJS Tutorial For Beginners | ReactJS Redux Training For Beginners | React...ReactJS Tutorial For Beginners | ReactJS Redux Training For Beginners | React...
ReactJS Tutorial For Beginners | ReactJS Redux Training For Beginners | React...
 
React native app with type script tutorial
React native app with type script tutorialReact native app with type script tutorial
React native app with type script tutorial
 
Developing components and extensions for ext js
Developing components and extensions for ext jsDeveloping components and extensions for ext js
Developing components and extensions for ext js
 
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
 
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
 
Building Content Recommendation Systems Using Apache MXNet and Gluon - MCL402...
Building Content Recommendation Systems Using Apache MXNet and Gluon - MCL402...Building Content Recommendation Systems Using Apache MXNet and Gluon - MCL402...
Building Content Recommendation Systems Using Apache MXNet and Gluon - MCL402...
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrived
 
Stencil: The Time for Vanilla Web Components has Arrived
Stencil: The Time for Vanilla Web Components has ArrivedStencil: The Time for Vanilla Web Components has Arrived
Stencil: The Time for Vanilla Web Components has Arrived
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
 
Dive Into Azure Data Lake - PASS 2017
Dive Into Azure Data Lake - PASS 2017Dive Into Azure Data Lake - PASS 2017
Dive Into Azure Data Lake - PASS 2017
 
reactjs-quiz..docs.pdf
reactjs-quiz..docs.pdfreactjs-quiz..docs.pdf
reactjs-quiz..docs.pdf
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
 
React mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche EheReact mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche Ehe
 
Real World MVC
Real World MVCReal World MVC
Real World MVC
 
Kite SDK: Working with Datasets
Kite SDK: Working with DatasetsKite SDK: Working with Datasets
Kite SDK: Working with Datasets
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
 
Ejb3 Struts Tutorial En
Ejb3 Struts Tutorial EnEjb3 Struts Tutorial En
Ejb3 Struts Tutorial En
 
Automating Performance Monitoring at Microsoft
Automating Performance Monitoring at MicrosoftAutomating Performance Monitoring at Microsoft
Automating Performance Monitoring at Microsoft
 

Mehr von Sencha

Mehr von Sencha (10)

Breathe New Life into Your Existing JavaScript Applications with Web Components
Breathe New Life into Your Existing JavaScript Applications with Web ComponentsBreathe New Life into Your Existing JavaScript Applications with Web Components
Breathe New Life into Your Existing JavaScript Applications with Web Components
 
Ext JS 6.6 Highlights
Ext JS 6.6 HighlightsExt JS 6.6 Highlights
Ext JS 6.6 Highlights
 
SenchaCon 2016: Developing and Delivering Quality Code, Frequently - Neil Manvar
SenchaCon 2016: Developing and Delivering Quality Code, Frequently - Neil ManvarSenchaCon 2016: Developing and Delivering Quality Code, Frequently - Neil Manvar
SenchaCon 2016: Developing and Delivering Quality Code, Frequently - Neil Manvar
 
SenchaCon 2016: Creating a Flexible and Usable Industry Specific Solution - D...
SenchaCon 2016: Creating a Flexible and Usable Industry Specific Solution - D...SenchaCon 2016: Creating a Flexible and Usable Industry Specific Solution - D...
SenchaCon 2016: Creating a Flexible and Usable Industry Specific Solution - D...
 
SenchaCon 2016: JavaScript is Great but Stop Writing It - Rory Hardy
SenchaCon 2016: JavaScript is Great but Stop Writing It - Rory HardySenchaCon 2016: JavaScript is Great but Stop Writing It - Rory Hardy
SenchaCon 2016: JavaScript is Great but Stop Writing It - Rory Hardy
 
SenchaCon 2016: Accessibility, Teamwork & Ext JS: A Customer Success Story - ...
SenchaCon 2016: Accessibility, Teamwork & Ext JS: A Customer Success Story - ...SenchaCon 2016: Accessibility, Teamwork & Ext JS: A Customer Success Story - ...
SenchaCon 2016: Accessibility, Teamwork & Ext JS: A Customer Success Story - ...
 
SenchaCon 2016: Using Ext JS 6 for Cross-Platform Development on Mobile - And...
SenchaCon 2016: Using Ext JS 6 for Cross-Platform Development on Mobile - And...SenchaCon 2016: Using Ext JS 6 for Cross-Platform Development on Mobile - And...
SenchaCon 2016: Using Ext JS 6 for Cross-Platform Development on Mobile - And...
 
SenchaCon 2016: Handling Undo-Redo in Sencha Applications - Nickolay Platonov
SenchaCon 2016: Handling Undo-Redo in Sencha Applications - Nickolay PlatonovSenchaCon 2016: Handling Undo-Redo in Sencha Applications - Nickolay Platonov
SenchaCon 2016: Handling Undo-Redo in Sencha Applications - Nickolay Platonov
 
SenchaCon 2016: Turbocharge your Ext JS App - Per Minborg, Anselm McClain, Jo...
SenchaCon 2016: Turbocharge your Ext JS App - Per Minborg, Anselm McClain, Jo...SenchaCon 2016: Turbocharge your Ext JS App - Per Minborg, Anselm McClain, Jo...
SenchaCon 2016: Turbocharge your Ext JS App - Per Minborg, Anselm McClain, Jo...
 
SenchaCon 2016: Integrating Geospatial Maps & Big Data Using CartoDB via Ext ...
SenchaCon 2016: Integrating Geospatial Maps & Big Data Using CartoDB via Ext ...SenchaCon 2016: Integrating Geospatial Maps & Big Data Using CartoDB via Ext ...
SenchaCon 2016: Integrating Geospatial Maps & Big Data Using CartoDB via Ext ...
 

Kürzlich hochgeladen

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Kürzlich hochgeladen (20)

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 

Introducing ExtReact: Adding Powerful Sencha Components to React Apps

  • 1. © 2017 Sencha Inc. • CONFIDENTIAL • Introducing ExtReact:Adding Powerful Sencha Components to ReactApps Mark Brocato Engineering Director, Sencha @mockaroodev
  • 2. © 2017 Sencha Inc. • CONFIDENTIAL • Ext JS Ext JS Components Ext JS Framework
  • 3. © 2017 Sencha Inc. • CONFIDENTIAL • React: A Component Framework w/o Components Ext JS Components Ext JS Framework ExtReact React.js
  • 4. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact Use All Ext JS Components in React
  • 5. © 2017 Sencha Inc. • CONFIDENTIAL • Motivation for ExtReact • No complete component libraries available for React • Dependency fatigue • Form without function • Head start • Data-driven, enterprise apps
  • 6. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact: 100+ Components • Grid • List • Tree • Calendar • Layouts • Form Fields • Animations • Charts • D3 Visualizations
  • 7. © 2017 Sencha Inc. • CONFIDENTIAL • @extjs/reactor GitHub: extjs-reactor
  • 8. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact vs Ext JS + React ExtReact • Separate license from Ext JS (annual subscription, perpetual distribution rights) • Streamlined installation (NPM) • Modern toolkit only (Ext JS 6.5) Ext JS + Reactor • Use your existing Ext JS license • Traditional Ext JS installation process • Modern + Classic toolkits
  • 9. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact Grid <Grid title="Stock Prices" store={this.store}> <Column text="Company" dataIndex="name"/> <Column text="Price" dataIndex="price" formatter='usMoney'/> <Column text="Change" dataIndex="priceChange"/> <Column text="% Change" dataIndex="priceChangePct"/> <Column text="Last Updated" dataIndex="lastChange" formatter='date("m/d/Y")'/> </Grid>
  • 10. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact for Ext JS Developers
  • 11. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true }); Ext JS ExtReact
  • 12. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped /> Ext JS ExtReact
  • 13. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { itemtap: function(list, index, target, record) { console.log(`Tapped ${record.get('name')}`) } } }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped /> Ext JS ExtReact
  • 14. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { itemtap: function(list, index, target, record) { console.log(`Tapped ${record.get('name')}`) } } }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped onItemTap={(list, index, target, record) => { console.log(`Tapped ${record.get('name')}`) }} /> Ext JS ExtReact
  • 15. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { itemtap: function(list, index, target, record) { console.log(`Tapped ${record.get('name')}`) }, show: { single: true, fn: function() { // load store } } } }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped onItemTap={(list, index, target, record) => { console.log(`Tapped ${record.get('name')}`) }} /> Ext JS ExtReact
  • 16. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { itemtap: function(list, index, target, record) { console.log(`Tapped ${record.get('name')}`) }, show: { single: true, fn: function() { // load store } } } }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped onItemTap={(list, index, target, record) => { console.log(`Tapped ${record.get('name')}`) }} onShow={{ single: true, fn: () => { // load store } }} /> Ext JS ExtReact
  • 17. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { itemtap: function(list, index, target, record) { console.log(`Tapped ${record.get('name')}`) }, show: { single: true, fn: function() { // load store } } }, itemTpl: ( '<div>' + '<div>{firstName} {lastName}</div>' + '<div>{title}</div>' + '</div>' ) }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped onItemTap={(list, index, target, record) => { console.log(`Tapped ${record.get('name')}`) }} onShow={{ single: true, fn: () => { // load store } }} /> Ext JS ExtReact
  • 18. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { itemtap: function(list, index, target, record) { console.log(`Tapped ${record.get('name')}`) }, show: { single: true, fn: function() { // load store } } }, itemTpl: ( '<div>' + '<div>{firstName} {lastName}</div>' + '<div>{title}</div>' + '</div>' ) }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped onItemTap={(list, index, target, record) => { console.log(`Tapped ${record.get('name')}`) }} onShow={{ single: true, fn: () => { // load store } }} itemTpl={data => ( <div> <div>{data.firstName} {data.lastName}</div> <div>{data.title}</div> </div> )} /> Ext JS ExtReact
  • 19. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { ... }, itemTpl: ( '<div>' + '<div>{firstName} {lastName}</div>' + '<div>{title}</div>' + '</div>' ) items: [{ xtype: 'toolbar', docked: 'top' items: [{ xtype: 'button', text: 'Refresh' }] }] }); import { List } from '@extjs/ext-react'; <List store={contacts} grouped onItemTap={(list, index, target, record) => { console.log(`Tapped ${record.get('name')}`) }} onShow={{ single: true, fn: () => { // load store } }} itemTpl={data => ( <div> <div>{data.firstName} {data.lastName}</div> <div>{data.title}</div> </div> )} /> Ext JS ExtReact
  • 20. © 2017 Sencha Inc. • CONFIDENTIAL • Ext.create({ xtype: 'list', store: contacts, grouped: true, listeners: { ... }, itemTpl: ( '<div>' + '<div>{firstName} {lastName}</div>' + '<div>{title}</div>' + '</div>' ) items: [{ xtype: 'toolbar', docked: 'top' items: [{ xtype: 'button', text: 'Refresh' }] }] }); 20 import { List, Toolbar, Button } from '@extjs/ext-react'; <List store={contacts} grouped ... itemTpl={data => ( <div> <div>{firstName} {lastName}</div> <div>{title}</div> </div> )} > <Toolbar> <Button text="Refresh" /> </Toolbar> </List> Ext JS ExtReact
  • 21. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact Components are Themable • Each can be extended using SASS or Sencha Themer Triton Material iOS
  • 22. © 2017 Sencha Inc. • CONFIDENTIAL • Sencha Themer 22
  • 23. © 2017 Sencha Inc. • CONFIDENTIAL • FAQ • Controllers • ViewModels How much of the Ext JS framework will I use? Components Stores Models Grid, Tree, Calendar, etc… Flux (Redux, MobX, et al...)
  • 24. © 2017 Sencha Inc. • CONFIDENTIAL • Components Virtual DOM DOMExtReact? Ext JS FAQ Does ExtReact use the Virtual DOM?
  • 25. © 2017 Sencha Inc. • CONFIDENTIAL • FAQ Can I reuse components from pure Ext JS apps? import { reactify } from '@extjs/reactor'; const MyCustomComponent = reactify(MyPackage.MyCustomComponent); ... render() { return <MyCustomComponent ... /> }
  • 26. © 2017 Sencha Inc. • CONFIDENTIAL • ExtReact: Getting Set Up
  • 27. © 2017 Sencha Inc. • CONFIDENTIAL • Sign up for a trial at sencha.com npm login --registry=http://npm.sencha.com --scope=@extjs
  • 28. © 2017 Sencha Inc. • CONFIDENTIAL • Use Yeoman to create new apps npm install –g yo @extjs/generator-ext-react yo @extjs/ext-react
  • 29. © 2017 Sencha Inc. • CONFIDENTIAL • GitHub: sencha/extjs-reactor packages/reactor-modern-boilerplate packages/reactor-classic-boilerplate
  • 30. © 2017 Sencha Inc. • CONFIDENTIAL • Adding ExtReact to an Existing React App • npm install --save @extjs/reactor @extjs/ext-react • npm install --save-dev @extjs/reactor-webpack-plugin @extjs/reactor-babel-plugin
  • 31. © 2017 Sencha Inc. • CONFIDENTIAL • Adding Ext JS to an Existing React App • npm install --save @extjs/reactor • npm install --save-dev @extjs/reactor-webpack-plugin @extjs/reactor-babel-plugin • Download and unzip Ext JS from sencha.com
  • 32. © 2017 Sencha Inc. • CONFIDENTIAL • Webpack import ExtReactWebpackPlugin from '@extjs/reactor-webpack-plugin’ ... plugins: [ new ExtReactWebpackPlugin({ theme: 'theme-material' }), ]
  • 33. © 2017 Sencha Inc. • CONFIDENTIAL • Webpack import ExtReactWebpackPlugin from '@extjs/reactor-webpack-plugin’ ... plugins: [ new ExtReactWebpackPlugin({ theme: 'theme-material', // not needed for ExtReact sdk: '/path/to/extjs', toolkit: 'modern' packages: ['charts'] }), ]
  • 34. © 2017 Sencha Inc. • CONFIDENTIAL • Babel .babelrc { "plugins": [ "@extjs/reactor-babel-plugin" ] }
  • 35. © 2017 Sencha Inc. • CONFIDENTIAL • React App Launch import React from ’react'; import App from './App'; // app components import { launch } from '@extjs/reactor'; launch(<App/>); // replaces ReactDOM.render(<App/>, document.getElementById(‘root’))
  • 36. © 2017 Sencha Inc. • CONFIDENTIAL • Live Demos
  • 37. © 2017 Sencha Inc. • CONFIDENTIAL • Sencha Fiddle https://fiddle.sencha.com/?extreact
  • 38. © 2017 Sencha Inc. • CONFIDENTIAL • Q&A
  • 39. © 2017 Sencha Inc. • CONFIDENTIAL • Thank You!