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
Forget What You Know
Search
Christopher Pitt
September 22, 2016
Programming
200
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Forget What You Know
Just React things...
Christopher Pitt
September 22, 2016
More Decks by Christopher Pitt
See All by Christopher Pitt
Making Robots (PHP Unicorn Conf)
chrispitt
1
250
Transforming Magento (NomadMage 2017)
chrispitt
2
140
Monads In PHP → php[tek]
chrispitt
3
590
Breaking The Enigma → php[tek]
chrispitt
0
290
Turn on the Generator!
chrispitt
0
210
Implementing Languages (FluentConf)
chrispitt
1
390
Async PHP (Sunshine)
chrispitt
0
540
Helpful Robot
chrispitt
0
180
Async PHP
chrispitt
14
7.5k
Other Decks in Programming
See All in Programming
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3k
残高管理から台帳サービスへの進化
artoy
1
210
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
140
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
180
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.8k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
230
Next.js: The final boss of Web Performance
guaca
0
340
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
380
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
120
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7k
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
210
Featured
See All Featured
KATA
mclloyd
PRO
35
16k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
740
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
380
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Done Done
chrislema
187
17k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
First, design no harm
axbom
PRO
2
1.4k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Transcript
FORGET WHAT YOU KNOW
WHAT I LEARNED ABOUT REACT THOUGH I MOSTLY DO SERVER-SIDE
AND A LITTLE BIT OF "WELL THAT WORKS WELL ENOUGH" JAVASCRIPT
None
const $issues = $(".issues") $.ajax({ "url": "https://api.github.com/repos/facebook/react/issues", "success": function(issues) {
issues.forEach(function(issue) { $issues.append(` <li class="issue"> <a class="title">${issue.title}</a> <div class="extract">${issue.body}</div> </li> `) }) } })
$issues.on("click", ".title", function(e) { const $title = $(this) $title.parent(".issue").toggleClass("highlight") $title.siblings(".extract").toggle()
})
None
"success": function(issues) { issues.forEach(function(issue) { $issues.append(` <li class="issue"> <a class="title">${issue.title}</a>
<a class="hide" data-id="${issue.id}">hide</a> <div class="extract">${issue.body}</div> </li> `) }) }
let hidden = [] $issues.on("click", ".hide", function(e) { const $hide
= $(this) const id = $hide.data("id") hidden.includes(id) || hidden.push(id) });
$.ajax({ "url": "https://api.github.com/repos/facebook/react/issues", "success": function(issues) { issues.forEach(function(issue) { $issues.append(`...`) })
} })
const render = function(issues) { $issues.empty() issues .filter(function(issue) { return
! hidden.includes(issue.id) }) .forEach(function(issue) { $issues.append(`...`) }) }
const fetch = function() { $.ajax({ "url": "https://api.github.com/repos/facebook/react/issues", "success": render
}) } fetch()
let hidden = [] try { hidden = JSON.parse(localStorage["hidden"]) }
catch (e) { console.warn("could not load hidden ids from local storage") }
$issues.on("click", ".hide", function(e) { const $hide = $(this) const id
= $hide.data("id") hidden.includes(id) || hidden.push(id) localStorage["hidden"] = JSON.stringify(hidden) fetch() });
OTHER THINGS WE COULD IMPROVE...
IMPERATIVE CODE ▸ make ajax request ▸ render list of
items ▸ do a thing on click ▸ persist ui state for refresh
IMPERATIVE CODE this is how to make things look like
I want
DECLARATIVE CODE this is what I want things to look
like given any state
<ul class="issues"> <li class="issue" ng-repeat="issue in issues" ng-if="visible"> <a class="title">{{
issue.title }}</a> <a class="hide" data-id="{{ issue.id }}">hide</a> <div class="extract">{{ issue.body }}</div> </li> </ul>
const Issues = ({ issues }) => { return (
<ul className="issues"> {issues.forEach((issue, key) => { if (!issue.visible) { return } return <Issue {...issue} key={key} /> }) </ul> ) }
class Issues extends React.Component { render() { return ( <ul
className="issues"> {this.props.issues.forEach((issue, key) => { if (!issue.visible) { return } return <Issue {...issue} key={key} /> }) </ul> ) } }
WHY IS DECLARATIVE CODE SOMETIMES BETTER?
REACT IS SCARY
USE FUNCTIONS INSTEAD OF CLASSES WHERE POSSIBLE
class Issues extends React.Component { componentWillMount() { // do something
before the component mounts } componentWillReceiveProps() { // do something after the component mounts } shouldComponentUpdate() { // return false if the component shouldn't re-render } }
class Issues extends React.Component { constructor(...params) { super(...params) this.state =
{ "text": "...list issues", } } async componentDidMount() { const response = await fetch("http://codepen.io/assertchris/pen/rrjKPN.css") const text = await response.text() this.setState({ ...this.state, "length": text.length, }) } render() { if (this.state.length) { return <span>{ this.state.text } ! { this.state.length }</span> } return <span>{ this.state.text }</span> } }
USE IMMUTABLE DATA WHERE POSSIBLE
this.setState({ ...this.state, "length": text.length, }) return [ ...items, "new item",
]
let state1 = Immutable.Map({ "text": "...list items", "length": 0, })
let state2 = map1.set("length", 43) state1.get("length") // 0 state2.get("length") // 43 state1.equals(state2) // false
https://facebook.github.io/immutable-js
YOU DON'T ALWAYS NEED FLUX OR REDUX OR REFLUX...
https://medium.com/@dan_abramov/ you-might-not-need-redux-be46360cf367
USE SERVICE LOCATION FOR PLUGIN ARCHITECTURE
// ...the code you write ! import { Ioc }
from "adonis-fold" import { hiddenReducer, highlightedReducer } from "path/to/core" Ioc.bind("reducers", function() { return [ hiddenReducer, highlightedReducer, ] })
// ...the code others write ! import { Ioc }
from "adonis-fold" import { pluginReducer } from "path/to/plugin" const previous = Ioc.use("reducers") Ioc.bind("reducers", function() { return [ ...previous, pluginReducer, ] })
const Issues = (props) => { const globals = Ioc.use("global-issues")
if (globals.length) { return ( <ul className="Issues"> { renderGlobalIssues(globals) } { renderIssues(props.issues) } </ul> ) } return ( <ul className="Issues"> { renderIssues(props.issues) } </ul> ) }
http://adonisjs.com/docs/3.0/overview#ioc-container
https://www.amazon.com/dp/B01BSTEDJ0
Thanks https://speakerdeck.com/chrispitt/forget-what-you-know @assertchris