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
180
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
580
Breaking The Enigma → php[tek]
chrispitt
0
280
Turn on the Generator!
chrispitt
0
200
Implementing Languages (FluentConf)
chrispitt
1
390
Async PHP (Sunshine)
chrispitt
0
530
Helpful Robot
chrispitt
0
180
Async PHP
chrispitt
14
7.5k
Other Decks in Programming
See All in Programming
App Intentsのビルドプロセスを支える技術
kntkymt
0
380
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
190
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
120
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
550
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
wkhtmltopdfの次どうするか問題2026
willnet
1
110
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
250
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
710
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
150
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
230
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
620
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.1k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
240
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.8k
We Have a Design System, Now What?
morganepeng
55
8.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
Side Projects
sachag
456
43k
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