Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Demystifying React for Symfony developers
Search
Titouan Galopin
November 22, 2019
Programming
870
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Demystifying React for Symfony developers
SymfonyCon Amsterdam 2019
Titouan Galopin
November 22, 2019
More Decks by Titouan Galopin
See All by Titouan Galopin
Concevoir son API pour le futur
tgalopin
2
1.9k
Content editing in Symfony
tgalopin
3
1.2k
Symfony UX: a new JavaScript ecosystem for Symfony
tgalopin
4
4.2k
[SymfonyLive Paris 2020] Pragmatic frontend for Symfony developers
tgalopin
2
1.3k
SymfonyInsight: How to setup quality processes in Symfony apps
tgalopin
2
450
Symfony 5 - AFUP Day Lille 2020
tgalopin
1
1.1k
Pragmatic frontend for Symfony developers
tgalopin
2
1.4k
Symfony 5
tgalopin
1
760
Plongée dans l'injection de dépendances de Symfony
tgalopin
3
1.3k
Other Decks in Programming
See All in Programming
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.7k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
140
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
170
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
240
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
130
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
980
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
170
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
22
22k
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
360
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
380
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
570
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
870
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
270
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Chasing Engaging Ingredients in Design
codingconduct
0
350
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Transcript
Demystifying React for Symfony developers Titouan GALOPIN
2 Titouan Galopin Product Manager SymfonyInsight insight.symfony.com
Agenda 1. What’s React? 2. Components 3. Symfony integration with
Webpack Encore 3
4 1. What’s React?
5 How should we structure Javascript applications?
6 AngularJS Vue Backbone.js Dart Ember.js Dojo Meteor ...
7 There is a consensus here: MVC, or MVVM, or
MVW, ...
8 Models
9 { firstName: 'Titouan', lastName: 'Galopin', email: '
[email protected]
' }
10 Models = Observable objects
11 Bidirectional data-binding An change in the model updates the
view An change in the view updates the model
12 Two data sources Model View
13 This encourages mutations
14 { firstName: 'Tito', lastName: 'Galopin', email: '
[email protected]
' } Model
{ firstName: 'Titouan''Tito', lastName: 'Galopin', email: '
[email protected]
' } View { firstName: 'Tito' } Mutation
15 But mutations are complex
16 Complex to apply Complex to reproduce Complex to debug
17 What if we could do better?
18 The simplest way to build views is to avoid
mutations altogether
19 React does not use mutations at all
20 Instead, it has a single data source
21 Model View Observable model Two-way data flow
22 Model Observable model Two-way data flow View React One-way
data flow Model Dispatcher View
View 23 Model Observable model Two-way data flow View React
One-way data flow Model Dispatcher View
24 Model Observable model Two-way data flow View React One-way
data flow Model Dispatcher View
25 But isn’t that super slow? What about user inputs?
26 We want the benefits to blow the view away
and re-render it ... … while dealing properly with every edge cases
27 That’s React
28 React is a Javascript library for building User Interfaces
29 React is declarative render(data: array) => view: string
30 React re-renders all your view when data changes
31 2. Components
32 React’s main concept is Components
33 A component = A description of a part of
your UI that depends on your current model
34 It’s more than a template though
35 Store Dispatcher View Each component has its own model
and behavior This is component
36 The aim? Abstract away the implementation details of parts
of the UI
37
38 <Autocomplete source="/api/users" onSelect={this.handleUserSelected} />
39 <Autocomplete source="/api/users" onSelect={this.handleUserSelected} /> Property
40 But how does it work?
41 A component = A state + A way to
display that state
42 Store (Model) Dispatcher View React handles the Dispatcher and
the Store You only implement the view and define the structure of the Store
43 The state is a single Javascript object
44 The view is described by a single render() function
45 Store (state) Initial state
46 render Store (state) View (components) Initial state
47
48 class Autocomplete extends Component { constructor() { this.state =
{ results: [] }; } }
49 class Autocomplete extends Component { // ... render() {
return ( <ul> {this.state.results.map(function(result) { return ( <li>{result.name}</li> ); })} </ul> ); } }
50 class Autocomplete extends Component { // ... render() {
return ( <ul> {this.state.results.map(function(result) { return ( <li>{result.name}</li> ); })} </ul> ); } } Use of the state
51 class Autocomplete extends Component { // ... render() {
return ( <ul> {this.state.results.map(function(result) { return ( <li>{result.name}</li> ); })} </ul> ); } } Use of the state To use a property: this.props.source
State = Local data that will change over time Props
= Non-local data, read-only for the component 52
If either the state or the properties change, the component
will be re-rendered 53
54 class Autocomplete extends Component { // ... render() {
return ( <ul> {this.state.results.map(function(result) { return ( <li>{result.name}</li> ); })} </ul> ); } }
55 class Autocomplete extends Component { // ... render() {
return ( <ul> {this.state.results.map(function(result) { return ( <li>{result.name}</li> ); })} </ul> ); } } What’s that?!
56 JSX is a formatting language used by React to
express a representation of views
57 It is compiled to Javascript <li className="hello"> becomes React.DOM.li({
className: 'hello'})
58 class Autocomplete extends Component { // ... render() {
return ( <ul> {this.state.results.map(function(result) { return ( <li>{result.name}</li> ); })} </ul> ); } } Not real HTML tags but components
59 render() returns a tree of components
60 You usually create your own tree of components RegistrationForm
CityAutocompleteInput PhoneNumberInput HTMLTextInput HTMLTelInput
61 Now, how to update the view?
62 Instead of updates (mutations) React uses reconciliation
63 setState()
64 React compares the view representations and apply the changes
to the DOM
Tree of components before change Tree of components after change
setState
66 Tree of components before change Tree of components after
change setState render render View before View after
67 Tree of components before change Tree of components after
change setState render render View before View after React compares both and apply only needed changes to the DOM
68 class Autocomplete extends Component { // ... handleChange(event) {
api.fetchResults(event.target.value).then(results => { this.setState({ results: results }) }); } // ... render() { return ( <div> <input type="text" onChange={this.handleChange} /> // ... </div> ); } }
69 setState() merges the current state and the given data
...
70 … then calls recursively render() on the component and
all its children
71 render Store (state) View (components) Initial state
72 Dispatcher (React) setState render Store (state) View (components) Initial
state
73 Dispatcher (React) setState render Handled by React Store (state)
View (components) Initial state
74 Now you know React!
75 3. Symfony integration with Webpack Encore
76 Webpack is a build tool It lets you manipulate
your Javascript and CSS before using it in production (JSX, minification, …)
77 Webpack Encore wraps Webpack around a nice API to
improve its Developer Experience
78 Webpack Encore is awesome to compile React apps to
normal Javascript
79 composer req --dev webpack yarn install https://symfony.com/doc/current/frontend.html
80 yarn add @babel/preset-react react react-dom prop-types
81 // webpack.config.js const Encore = require( '@symfony/webpack-encore' ); Encore
// ... .enableReactPreset(); module.exports = Encore.getWebpackConfig();
82 Once Webpack Encore is ready, you can use it
in Twig to load React
83 // index.html.twig ... <div id="portfolio"></div> … // Output proper
<script src="..."> tags {{ encore_entry_script_tags('app') }}
84 // app.js import ReactDOM from 'react-dom'; import {App} from
'./App.js'; ReactDOM.render( <App />, document.getElementById('portfolio') );
85 // app.js import ReactDOM from 'react-dom'; import {App} from
'./App.js'; ReactDOM.render( <App />, document.getElementById('portfolio') ); Tree of components
86 And that’s all! You can now use React into
Symfony
87 Conclusion
Thanks! 88 For any question: ▪ @titouangalopin on Twitter ▪
titouan.galopin @symfony.com