Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
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
270
Turn on the Generator!
chrispitt
0
200
Implementing Languages (FluentConf)
chrispitt
1
380
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
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
210
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
100
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
3
1.9k
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
500
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
380
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
240
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
620
Android CLI
fornewid
0
240
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.8k
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
210
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
How STYLIGHT went responsive
nonsquared
100
6.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
480
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
210
Discover your Explorer Soul
emna__ayadi
2
1.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
エンジニアに許された特別な時間の終わり
watany
108
250k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
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