SlideShare a Scribd company logo
AND INTRO TO HOOKS
Nir Hadassi
Software Engineer @ Soluto
REACT NEW FEATURES
This talk was supposed to be about...
High-Order-Components
and Recompose
But then...
And then...
@TheRealMohaz
About Myself
Nir Hadassi
4years
working at
Soluto
3years
working with
React
nirsky
What are React Hooks?
“Hooks lets you use state and
other React features without
writing a class.”
Introduced on React v16.7.0-alpha
Why?
CLASSES ARE
BAD
Why classes are bad?
● Complex components become hard to understand
● Classes confuse people (notorious this..)
● Classes confuse machines (don’t minify well)
● It’s hard to reuse stateful logic between classes
Agenda
1. Hooks Intro
a. useState
b. useRef
c. useContext
d. useEffect
2. Memo
3. Lazy
useState
Class with state
class CounterButton extends Component {
constructor() {
super();
this.state = {
count: 0
}
}
render() {
return <button onClick={() => this.setState(prevState => ({ count: prevState.count + 1
}))}>
{ this.state.count }
</button>
}
}
With useState
import React, { useState } from 'react';
const Counter = props => {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>
{ count }
</button>
}
With useState
import React, { useState } from 'react';
const Counter = props => {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>
{ count }
</button>
}
With useState
import React, { useState } from 'react';
const Counter = props => {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>
{ count }
</button>
}
With useState
import React, { useState } from 'react';
const Counter = props => {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>
{ count }
</button>
}
Multiple State Variables
const Player = props => {
const [volume, setVolume] = useState(0);
const [position, setPosition] = useState(0);
const [paused, setPaused] = useState(true);
const onClick = () => {
setPosition(0);
setPaused(false);
}
}
Multiple State Variables
const Player = props => {
const [state, setState] = useState({
volume: 0,
position: 0,
paused: true
});
const onClick = () => {
setState({
...state,
position: 0,
paused: false
})
}
}
useContext
Using context without hooks
import { ThemeContext } from './context';
const Counter = props => {
const [count, setCount] = useState(0);
return (
<ThemeContext.Consumer>
{theme => (
<Button theme={theme} onClick={...}>
{count}
</Button>
)}
</ThemeContext.Consumer>
)
}
useContext hook
import React, { useContext } from 'react';
import { ThemeContext } from './context';
const Counter = props => {
const [count, setCount] = useState(0);
const theme = useContext(ThemeContext)
return (
<Button theme={theme} onClick={...}>
{count}
</Button>
)
}
useContext hook
import React, { useContext } from 'react';
import { ThemeContext } from './context';
const Counter = props => {
const [count, setCount] = useState(0);
const theme = useContext(ThemeContext)
return (
<Button theme={theme} onClick={...}>
{count}
</Button>
)
}
useRef
useRef
const TextInputWithFocusButton = (props) => {
const inputRef = useRef();
return (
<>
<input ref={inputRef} type="text" />
<button onClick={() => inputRef.current.focus()}>
Focus the input
</button>
</>
);
}
useRef
const TextInputWithFocusButton = (props) => {
const inputRef = useRef();
return (
<>
<input ref={inputRef} type="text" />
<button onClick={() => inputRef.current.focus()}>
Focus the input
</button>
</>
);
}
useRef
const TextInputWithFocusButton = (props) => {
const inputRef = useRef();
return (
<>
<input ref={inputRef} type="text" />
<button onClick={() => inputRef.current.focus()}>
Focus the input
</button>
</>
);
}
useRef
const TextInputWithFocusButton = (props) => {
const inputRef = useRef();
return (
<>
<input ref={inputRef} type="text" />
<button onClick={() => inputRef.current.focus()}>
Focus the input
</button>
</>
);
}
Rules of Hooks
● Only Call Hooks at the Top Level!
○ Don’t call Hooks inside loops, conditions, or nested functions
○ Order Matters!
● Only Call Hooks from React Functions
○ Or from custom hooks
Under the hood
MyComponent
Memoized State Array
Hooks
Dispatcher
MyComponent
- Initial Render
useState()
useRef()
useState()
State hook
Ref hook
State hook
Slot 0
Slot 1
Slot 2
Under the hood
MyComponent
Memoized State Array
Hooks
Dispatcher
useState()
useRef()
useState()
State hook
Ref hook
State hook
useState()
Search on Slot 0
MyComponent
- Initial Render
MyComponent
- 2nd Render
Under the hood
MyComponent
Memoized State Array
Hooks
Dispatcher
useState()
useRef()
useState()
State hook
Ref hook
State hook
useState()
useRef()
useState()
Search on Slot 1MyComponent
- 2nd Render
MyComponent
- Initial Render
useEffect
Executing something on every render using lifecycle
class CounterButton extends Component {
constructor() {
super();
this.state = {count: 0}
}
componentDidMount() {
console.log(`The count is now ${this.state.count}`)
}
componentDidUpdate() {
console.log(`The count is now ${this.state.count}`)
}
render() {
return <button onClick={() => this.setState(prevState => ({ count: prevState.count + 1 }))}>
{ this.state.count }
</button>
}
}
Executing something on every render using useEffect
const Counter = props => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`The count is now ${count}`)
});
return <button onClick={() => setCount(count + 1)}>
{ count }
</button>
}
Executing something on every render using useEffect
const Counter = props => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`The count is now ${count}`)
});
return <button onClick ={() => setCount(count + 1)}>
{ count }
</button>
}
Effects with Cleanup
useEffect(() => {
console.log(`The count is now ${count}`);
return function cleanup() {
console.log('cleaning up');
}
});
Effects with Cleanup
useEffect(() => {
console.log(`The count is now ${count}`);
return function cleanup() {
console.log('cleaning up');
}
});
Should my effect run on
every render?
Consider the next scenario...
//timer changes every 100ms
const Counter = ({timer}) => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`The count is now ${count}`)
});
return <MyComponent onClick={() => setCount(count + 1)} timer={timer}>
{ count }
</MyComponent>
}
useEffect 2nd parameter
useEffect(() => {
console.log(`The count is now ${count}`)
}, [count]);
componentWillReceiveProps
componentWillReceiveProps(nextProps) {
if (this.props.timer !== nextProps.timer) {
console.log(`The timer is now ${nextProps.timer}`)
}
}
componentWillReceiveProps - hooks version
useEffect(() => {
console.log(`Timer is now ${props.timer}`);
}, [props.timer]);
componentDidMount - hooks version
useEffect(() => {
console.log(`I just mounted!`)
}, []);
componentWillUnmount - hooks version
useEffect(() => {
return function cleanup(){
console.log(`I'm unmounting!`)
}
}, []);
Let’s combine what
we learned so far
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage =
this.onNewMessage.bind(this);
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
onNewMessage(message) {
this.setState({
messages: [...this.state.messages, message]
})
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
componentDidMount () {
SocketClient.subscribeForNewMessages (
this.props.roomId,
this.onNewMessage
);
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
componentWillUnmount () {
SocketClient.unsubscribe(
this.props.roomId
);
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
componentWillReceiveProps(nextProps) {
if (nextProps.roomId !== this.props.roomId) {
this.setState({ messages: [] });
SocketClient.unsubscribe(this.props.roomId);
SocketClient.subscribeForNewMessages(
nextProps.roomId,
this.onNewMessage
);
}
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
render() {
return this.state.messages
.map((text, i) =>
<div key={i}>{text}</div>
)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([...messages, message]);
SocketClient.subscribeForNewMessages (roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([ ...messages, message]);
SocketClient.subscribeForNewMessages(roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([ ...messages, message]);
SocketClient.subscribeForNewMessages(roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([ ...messages, message]);
SocketClient.subscribeForNewMessages(roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([...messages, message]);
SocketClient.subscribeForNewMessages(roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([ ...messages, message]);
SocketClient.subscribeForNewMessages (roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
const ChatPage = ({ roomId }) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([ ...messages, message]);
SocketClient.subscribeForNewMessages(roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages.map((text, i) => <div key={i}>{text}</div>)
}
Custom Hooks
What are Custom Hooks?
● Basically functions that run hooks
● Like any other function - they can can take any args and return
whatever you want
● By convention - custom hook name start with “use”
● Like any other hook - must be called on the top level of our
components
This is the custom hook:
const useChatMessages = (roomId) => {
const [messages, setMessages] = useState([]);
useEffect(() => {
setMessages([]);
const onNewMessage = (message) => setMessages([...messages, message]);
SocketClient.subscribeForNewMessages(roomId, onNewMessage);
return () => SocketClient.unsubscribe(roomId);
}, [roomId]);
return messages;
}
This is the (very short) component:
const ChatPage = ({ roomId }) => {
const messages = useChatMessages(roomId);
return messages.map((text, i) =>
<div key={i}>{text}</div>)
}
class ChatPage extends Component {
constructor() {
super();
this.state = {
messages: []
}
this.onNewMessage = this.onNewMessage. bind(this);
}
componentDidMount () {
SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage );
}
componentWillUnmount () {
SocketClient. unsubscribe (this.props.roomId);
}
componentWillReceiveProps (nextProps ) {
if (nextProps .roomId !== this.props.roomId) {
this.setState ({ messages: [] });
SocketClient. unsubscribe (this.props.roomId);
SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage );
}
}
onNewMessage (message) {
this.setState ({ messages: [...this.state.messages , message] })
}
render() {
return this.state.messages. map((text, i) => <div key={i}>{text}</div>)
}
}
Remember how it used to look?28 lines vs. 5 with custom hook
Custom Hooks allow us to..
● Easily share code
● Keep our components clean and readable
● Use Hooks from npm packages
Other hooks
● useReducer
● useCallback
● useMemo
● useImperativeMethods
● useLayoutEffect
Memo
React.memo
PureComponent for function components
import React, {memo} from 'react';
const MyComponent = props => { ... }
export default memo(MyComponent);
Introduced on React 16.6
React.memo
PureComponent for function components
import React, {memo} from 'react';
const MyComponent = props => { ... }
const areEqual = (prevProps, nextProps) => { ... }
export default memo(MyComponent, areEqual);
Introduced on React 16.6
<MyComponent x={1} y={2}/>
DOM
render
x=1
y=2
Memo
Cache
<MyComponent x={2} y={2}/>
render
x=2
y=2
<MyComponent x={2} y={3}/>
1
2
3
Rendering “MyComponent” with Memo
x=1
y=2
x=2
y=2
areEqual = (prev, next) => prev.x === next.x
Suspense + Lazy
Lazy
Code-Splitting
import React, { lazy } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent' ));
const MyComponent = (props) =>
<div>
<OtherComponent/>
</div>
Introduced on React 16.6
Lazy
Code-Splitting
import React, { lazy } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const MyComponent = (props) =>
<div>
<OtherComponent/>
</div>
Introduced on React 16.6
Lazy
Code-Splitting
import React, { lazy } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent' ));
const MyComponent = (props) =>
<div>
<OtherComponent/>
</div>
Introduced on React 16.6
Lazy
Code-Splitting
import React, { lazy } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const MyComponent = (props) =>
<div>
<OtherComponent/>
</div>
Introduced on React 16.6
Lazy + Suspense
Code-Splitting
import React, { lazy, Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent' ));
const MyComponent = (props) =>
<div>
<Suspense fallback={<div>Loading..</div>}>
<OtherComponent />
</Suspense>
</div>
Introduced on React 16.6
Lazy + Suspense
Code-Splitting
import React, { lazy, Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const MyComponent = (props) =>
<div>
<Suspense fallback ={<div>Loading..</div>}>
<OtherComponent />
</Suspense>
</div>
Introduced on React 16.6
Lazy + Suspense
Code-Splitting
import React, { lazy, Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const MyComponent = (props) =>
<div>
<Suspense fallback={<div>Loading..</div>}>
<OtherComponent />
</Suspense>
</div>
Introduced on React 16.6
const Home = lazy(() => import('./components/Home ));
const Posts = lazy(() => import('./components/Posts' ));
const App = () => (
<Router>
<Suspense fallback={<Loading />}>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/posts" component={Posts} />
</Switch>
</Suspense>
</Router>
)
Hook me up with
Questions
nirsky
Nir_Hadassi
THANKS!
nirsky
Nir_Hadassi

More Related Content

What's hot

Introduction to React Hooks
Introduction to React HooksIntroduction to React Hooks
Introduction to React Hooks
Felicia O'Garro
 
React Hooks
React HooksReact Hooks
React Hooks
Joao Marins
 
Basics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdfBasics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdf
Knoldus Inc.
 
React workshop
React workshopReact workshop
React workshop
Imran Sayed
 
React js use contexts and useContext hook
React js use contexts and useContext hookReact js use contexts and useContext hook
React js use contexts and useContext hook
Piyush Jamwal
 
Important React Hooks
Important React HooksImportant React Hooks
Important React Hooks
Knoldus Inc.
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
Nikolaus Graf
 
Redux workshop
Redux workshopRedux workshop
Redux workshop
Imran Sayed
 
React-JS Component Life-cycle Methods
React-JS Component Life-cycle MethodsReact-JS Component Life-cycle Methods
React-JS Component Life-cycle Methods
ANKUSH CHAVAN
 
What is component in reactjs
What is component in reactjsWhat is component in reactjs
What is component in reactjs
manojbkalla
 
React state
React  stateReact  state
React state
Ducat
 
React js programming concept
React js programming conceptReact js programming concept
React js programming concept
Tariqul islam
 
Intro to React
Intro to ReactIntro to React
Intro to React
Justin Reock
 
react redux.pdf
react redux.pdfreact redux.pdf
react redux.pdf
Knoldus Inc.
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
Ignacio Martín
 
Workshop 21: React Router
Workshop 21: React RouterWorkshop 21: React Router
Workshop 21: React Router
Visual Engineering
 
React JS: A Secret Preview
React JS: A Secret PreviewReact JS: A Secret Preview
React JS: A Secret Preview
valuebound
 
React web development
React web developmentReact web development
React web development
Rully Ramanda
 
An introduction to React.js
An introduction to React.jsAn introduction to React.js
An introduction to React.js
Emanuele DelBono
 

What's hot (20)

Introduction to React Hooks
Introduction to React HooksIntroduction to React Hooks
Introduction to React Hooks
 
React Hooks
React HooksReact Hooks
React Hooks
 
Basics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdfBasics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdf
 
React workshop
React workshopReact workshop
React workshop
 
React js use contexts and useContext hook
React js use contexts and useContext hookReact js use contexts and useContext hook
React js use contexts and useContext hook
 
Important React Hooks
Important React HooksImportant React Hooks
Important React Hooks
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
React js
React jsReact js
React js
 
Redux workshop
Redux workshopRedux workshop
Redux workshop
 
React-JS Component Life-cycle Methods
React-JS Component Life-cycle MethodsReact-JS Component Life-cycle Methods
React-JS Component Life-cycle Methods
 
What is component in reactjs
What is component in reactjsWhat is component in reactjs
What is component in reactjs
 
React state
React  stateReact  state
React state
 
React js programming concept
React js programming conceptReact js programming concept
React js programming concept
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
react redux.pdf
react redux.pdfreact redux.pdf
react redux.pdf
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
Workshop 21: React Router
Workshop 21: React RouterWorkshop 21: React Router
Workshop 21: React Router
 
React JS: A Secret Preview
React JS: A Secret PreviewReact JS: A Secret Preview
React JS: A Secret Preview
 
React web development
React web developmentReact web development
React web development
 
An introduction to React.js
An introduction to React.jsAn introduction to React.js
An introduction to React.js
 

Similar to React new features and intro to Hooks

Road to react hooks
Road to react hooksRoad to react hooks
Road to react hooks
Younes (omar) Meliani
 
Recompacting your react application
Recompacting your react applicationRecompacting your react application
Recompacting your react application
Greg Bergé
 
JS Fest 2019. Glenn Reyes. With great power comes great React hooks!
JS Fest 2019. Glenn Reyes. With great power comes great React hooks!JS Fest 2019. Glenn Reyes. With great power comes great React hooks!
JS Fest 2019. Glenn Reyes. With great power comes great React hooks!
JSFestUA
 
N Things You Don't Want to Repeat in React Native
N Things You Don't Want to Repeat in React NativeN Things You Don't Want to Repeat in React Native
N Things You Don't Want to Repeat in React Native
Anton Kulyk
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
Ignacio Martín
 
How do we use hooks
How do we use hooksHow do we use hooks
How do we use hooks
Jim Liu
 
Battle of React State Managers in frontend applications
Battle of React State Managers in frontend applicationsBattle of React State Managers in frontend applications
Battle of React State Managers in frontend applications
Evangelia Mitsopoulou
 
Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019
Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019
Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019
Codemotion
 
React JS Hooks Sheet .pdf
React JS Hooks Sheet .pdfReact JS Hooks Sheet .pdf
React JS Hooks Sheet .pdf
nishant078cs23
 
This is a C# project . I am expected to create as this image shows. .pdf
This is a C# project . I am expected to create as this image shows. .pdfThis is a C# project . I am expected to create as this image shows. .pdf
This is a C# project . I am expected to create as this image shows. .pdf
indiaartz
 
Higher Order Components and Render Props
Higher Order Components and Render PropsHigher Order Components and Render Props
Higher Order Components and Render Props
Nitish Phanse
 
react-hooks.pdf
react-hooks.pdfreact-hooks.pdf
react-hooks.pdf
chengbo xu
 
Workshop 19: ReactJS Introduction
Workshop 19: ReactJS IntroductionWorkshop 19: ReactJS Introduction
Workshop 19: ReactJS Introduction
Visual Engineering
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners
Varun Raj
 
React Back to the Future
React Back to the FutureReact Back to the Future
React Back to the Future
500Tech
 
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
indeedeng
 
React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...
React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...
React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...
Edureka!
 
JavaScript Refactoring
JavaScript RefactoringJavaScript Refactoring
JavaScript Refactoring
Krzysztof Szafranek
 
React + Redux. Best practices
React + Redux.  Best practicesReact + Redux.  Best practices
React + Redux. Best practices
Clickky
 
Creating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdfCreating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdf
ShaiAlmog1
 

Similar to React new features and intro to Hooks (20)

Road to react hooks
Road to react hooksRoad to react hooks
Road to react hooks
 
Recompacting your react application
Recompacting your react applicationRecompacting your react application
Recompacting your react application
 
JS Fest 2019. Glenn Reyes. With great power comes great React hooks!
JS Fest 2019. Glenn Reyes. With great power comes great React hooks!JS Fest 2019. Glenn Reyes. With great power comes great React hooks!
JS Fest 2019. Glenn Reyes. With great power comes great React hooks!
 
N Things You Don't Want to Repeat in React Native
N Things You Don't Want to Repeat in React NativeN Things You Don't Want to Repeat in React Native
N Things You Don't Want to Repeat in React Native
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
How do we use hooks
How do we use hooksHow do we use hooks
How do we use hooks
 
Battle of React State Managers in frontend applications
Battle of React State Managers in frontend applicationsBattle of React State Managers in frontend applications
Battle of React State Managers in frontend applications
 
Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019
Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019
Matteo Antony Mistretta - Refactoring into React hooks - Codemotion Rome 2019
 
React JS Hooks Sheet .pdf
React JS Hooks Sheet .pdfReact JS Hooks Sheet .pdf
React JS Hooks Sheet .pdf
 
This is a C# project . I am expected to create as this image shows. .pdf
This is a C# project . I am expected to create as this image shows. .pdfThis is a C# project . I am expected to create as this image shows. .pdf
This is a C# project . I am expected to create as this image shows. .pdf
 
Higher Order Components and Render Props
Higher Order Components and Render PropsHigher Order Components and Render Props
Higher Order Components and Render Props
 
react-hooks.pdf
react-hooks.pdfreact-hooks.pdf
react-hooks.pdf
 
Workshop 19: ReactJS Introduction
Workshop 19: ReactJS IntroductionWorkshop 19: ReactJS Introduction
Workshop 19: ReactJS Introduction
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners
 
React Back to the Future
React Back to the FutureReact Back to the Future
React Back to the Future
 
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
 
React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...
React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...
React ES5 to ES6 | React ES5 vs ES6 | React Tutorial for Beginners | React on...
 
JavaScript Refactoring
JavaScript RefactoringJavaScript Refactoring
JavaScript Refactoring
 
React + Redux. Best practices
React + Redux.  Best practicesReact + Redux.  Best practices
React + Redux. Best practices
 
Creating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdfCreating a Facebook Clone - Part XXIX - Transcript.pdf
Creating a Facebook Clone - Part XXIX - Transcript.pdf
 

More from Soluto

Solving trust issues at scale - AppSec California
Solving trust issues at scale - AppSec CaliforniaSolving trust issues at scale - AppSec California
Solving trust issues at scale - AppSec California
Soluto
 
Solving trust issues at scale
Solving trust issues at scaleSolving trust issues at scale
Solving trust issues at scale
Soluto
 
Things I wish someone had told me about Istio, Omer Levi Hevroni
Things I wish someone had told me about Istio, Omer Levi HevroniThings I wish someone had told me about Istio, Omer Levi Hevroni
Things I wish someone had told me about Istio, Omer Levi Hevroni
Soluto
 
Can Kubernetes Keep a Secret? - Women in AppSec Webinar
Can Kubernetes Keep a Secret? - Women in AppSec WebinarCan Kubernetes Keep a Secret? - Women in AppSec Webinar
Can Kubernetes Keep a Secret? - Women in AppSec Webinar
Soluto
 
FTRD - Can Kubernetes Keep a Secret?
FTRD -  Can Kubernetes Keep a Secret?FTRD -  Can Kubernetes Keep a Secret?
FTRD - Can Kubernetes Keep a Secret?
Soluto
 
The Dark Side of Monitoring
The Dark Side of MonitoringThe Dark Side of Monitoring
The Dark Side of Monitoring
Soluto
 
Hacking like a FED
Hacking like a FEDHacking like a FED
Hacking like a FED
Soluto
 
Monitoria@Icinga camp berlin
Monitoria@Icinga camp berlinMonitoria@Icinga camp berlin
Monitoria@Icinga camp berlin
Soluto
 
Can Kubernetes Keep a Secret?
Can Kubernetes Keep a Secret?Can Kubernetes Keep a Secret?
Can Kubernetes Keep a Secret?
Soluto
 
Kamus intro
Kamus introKamus intro
Kamus intro
Soluto
 
Secure Your Pipeline
Secure Your PipelineSecure Your Pipeline
Secure Your Pipeline
Soluto
 
Secure the Pipeline - OWASP Poland Day 2018
Secure the Pipeline - OWASP Poland Day 2018Secure the Pipeline - OWASP Poland Day 2018
Secure the Pipeline - OWASP Poland Day 2018
Soluto
 
Monitoria@reversim
Monitoria@reversimMonitoria@reversim
Monitoria@reversim
Soluto
 
Languages don't matter anymore!
Languages don't matter anymore!Languages don't matter anymore!
Languages don't matter anymore!
Soluto
 
Security Testing for Containerized Applications
Security Testing for Containerized ApplicationsSecurity Testing for Containerized Applications
Security Testing for Containerized Applications
Soluto
 
Owasp glue
Owasp glueOwasp glue
Owasp glue
Soluto
 
Unify logz with fluentd
Unify logz with fluentdUnify logz with fluentd
Unify logz with fluentd
Soluto
 
Storing data in Redis like a pro
Storing data in Redis like a proStoring data in Redis like a pro
Storing data in Redis like a pro
Soluto
 
Monitor all the thingz slideshare
Monitor all the thingz slideshareMonitor all the thingz slideshare
Monitor all the thingz slideshare
Soluto
 
Authentication without Authentication - AppSec California
Authentication without Authentication - AppSec CaliforniaAuthentication without Authentication - AppSec California
Authentication without Authentication - AppSec California
Soluto
 

More from Soluto (20)

Solving trust issues at scale - AppSec California
Solving trust issues at scale - AppSec CaliforniaSolving trust issues at scale - AppSec California
Solving trust issues at scale - AppSec California
 
Solving trust issues at scale
Solving trust issues at scaleSolving trust issues at scale
Solving trust issues at scale
 
Things I wish someone had told me about Istio, Omer Levi Hevroni
Things I wish someone had told me about Istio, Omer Levi HevroniThings I wish someone had told me about Istio, Omer Levi Hevroni
Things I wish someone had told me about Istio, Omer Levi Hevroni
 
Can Kubernetes Keep a Secret? - Women in AppSec Webinar
Can Kubernetes Keep a Secret? - Women in AppSec WebinarCan Kubernetes Keep a Secret? - Women in AppSec Webinar
Can Kubernetes Keep a Secret? - Women in AppSec Webinar
 
FTRD - Can Kubernetes Keep a Secret?
FTRD -  Can Kubernetes Keep a Secret?FTRD -  Can Kubernetes Keep a Secret?
FTRD - Can Kubernetes Keep a Secret?
 
The Dark Side of Monitoring
The Dark Side of MonitoringThe Dark Side of Monitoring
The Dark Side of Monitoring
 
Hacking like a FED
Hacking like a FEDHacking like a FED
Hacking like a FED
 
Monitoria@Icinga camp berlin
Monitoria@Icinga camp berlinMonitoria@Icinga camp berlin
Monitoria@Icinga camp berlin
 
Can Kubernetes Keep a Secret?
Can Kubernetes Keep a Secret?Can Kubernetes Keep a Secret?
Can Kubernetes Keep a Secret?
 
Kamus intro
Kamus introKamus intro
Kamus intro
 
Secure Your Pipeline
Secure Your PipelineSecure Your Pipeline
Secure Your Pipeline
 
Secure the Pipeline - OWASP Poland Day 2018
Secure the Pipeline - OWASP Poland Day 2018Secure the Pipeline - OWASP Poland Day 2018
Secure the Pipeline - OWASP Poland Day 2018
 
Monitoria@reversim
Monitoria@reversimMonitoria@reversim
Monitoria@reversim
 
Languages don't matter anymore!
Languages don't matter anymore!Languages don't matter anymore!
Languages don't matter anymore!
 
Security Testing for Containerized Applications
Security Testing for Containerized ApplicationsSecurity Testing for Containerized Applications
Security Testing for Containerized Applications
 
Owasp glue
Owasp glueOwasp glue
Owasp glue
 
Unify logz with fluentd
Unify logz with fluentdUnify logz with fluentd
Unify logz with fluentd
 
Storing data in Redis like a pro
Storing data in Redis like a proStoring data in Redis like a pro
Storing data in Redis like a pro
 
Monitor all the thingz slideshare
Monitor all the thingz slideshareMonitor all the thingz slideshare
Monitor all the thingz slideshare
 
Authentication without Authentication - AppSec California
Authentication without Authentication - AppSec CaliforniaAuthentication without Authentication - AppSec California
Authentication without Authentication - AppSec California
 

Recently uploaded

一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
bakpo1
 
Cosmetic shop management system project report.pdf
Cosmetic shop management system project report.pdfCosmetic shop management system project report.pdf
Cosmetic shop management system project report.pdf
Kamal Acharya
 
Courier management system project report.pdf
Courier management system project report.pdfCourier management system project report.pdf
Courier management system project report.pdf
Kamal Acharya
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
Robbie Edward Sayers
 
ethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.pptethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.ppt
Jayaprasanna4
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
Massimo Talia
 
Automobile Management System Project Report.pdf
Automobile Management System Project Report.pdfAutomobile Management System Project Report.pdf
Automobile Management System Project Report.pdf
Kamal Acharya
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
JoytuBarua2
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Dr.Costas Sachpazis
 
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
AJAYKUMARPUND1
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
karthi keyan
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
MdTanvirMahtab2
 
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&BDesign and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Sreedhar Chowdam
 
MCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdfMCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdf
Osamah Alsalih
 
addressing modes in computer architecture
addressing modes  in computer architectureaddressing modes  in computer architecture
addressing modes in computer architecture
ShahidSultan24
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
TeeVichai
 
Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.
PrashantGoswami42
 
weather web application report.pdf
weather web application report.pdfweather web application report.pdf
weather web application report.pdf
Pratik Pawar
 
Event Management System Vb Net Project Report.pdf
Event Management System Vb Net  Project Report.pdfEvent Management System Vb Net  Project Report.pdf
Event Management System Vb Net Project Report.pdf
Kamal Acharya
 
The role of big data in decision making.
The role of big data in decision making.The role of big data in decision making.
The role of big data in decision making.
ankuprajapati0525
 

Recently uploaded (20)

一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
一比一原版(SFU毕业证)西蒙菲莎大学毕业证成绩单如何办理
 
Cosmetic shop management system project report.pdf
Cosmetic shop management system project report.pdfCosmetic shop management system project report.pdf
Cosmetic shop management system project report.pdf
 
Courier management system project report.pdf
Courier management system project report.pdfCourier management system project report.pdf
Courier management system project report.pdf
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 
ethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.pptethical hacking-mobile hacking methods.ppt
ethical hacking-mobile hacking methods.ppt
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
 
Automobile Management System Project Report.pdf
Automobile Management System Project Report.pdfAutomobile Management System Project Report.pdf
Automobile Management System Project Report.pdf
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
 
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
 
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&BDesign and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
 
MCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdfMCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdf
 
addressing modes in computer architecture
addressing modes  in computer architectureaddressing modes  in computer architecture
addressing modes in computer architecture
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
 
Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.
 
weather web application report.pdf
weather web application report.pdfweather web application report.pdf
weather web application report.pdf
 
Event Management System Vb Net Project Report.pdf
Event Management System Vb Net  Project Report.pdfEvent Management System Vb Net  Project Report.pdf
Event Management System Vb Net Project Report.pdf
 
The role of big data in decision making.
The role of big data in decision making.The role of big data in decision making.
The role of big data in decision making.
 

React new features and intro to Hooks

  • 1. AND INTRO TO HOOKS Nir Hadassi Software Engineer @ Soluto REACT NEW FEATURES
  • 2. This talk was supposed to be about... High-Order-Components and Recompose
  • 5. @TheRealMohaz About Myself Nir Hadassi 4years working at Soluto 3years working with React nirsky
  • 6. What are React Hooks? “Hooks lets you use state and other React features without writing a class.” Introduced on React v16.7.0-alpha
  • 8. Why classes are bad? ● Complex components become hard to understand ● Classes confuse people (notorious this..) ● Classes confuse machines (don’t minify well) ● It’s hard to reuse stateful logic between classes
  • 9. Agenda 1. Hooks Intro a. useState b. useRef c. useContext d. useEffect 2. Memo 3. Lazy
  • 11.
  • 12. Class with state class CounterButton extends Component { constructor() { super(); this.state = { count: 0 } } render() { return <button onClick={() => this.setState(prevState => ({ count: prevState.count + 1 }))}> { this.state.count } </button> } }
  • 13. With useState import React, { useState } from 'react'; const Counter = props => { const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}> { count } </button> }
  • 14. With useState import React, { useState } from 'react'; const Counter = props => { const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}> { count } </button> }
  • 15. With useState import React, { useState } from 'react'; const Counter = props => { const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}> { count } </button> }
  • 16. With useState import React, { useState } from 'react'; const Counter = props => { const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}> { count } </button> }
  • 17. Multiple State Variables const Player = props => { const [volume, setVolume] = useState(0); const [position, setPosition] = useState(0); const [paused, setPaused] = useState(true); const onClick = () => { setPosition(0); setPaused(false); } }
  • 18. Multiple State Variables const Player = props => { const [state, setState] = useState({ volume: 0, position: 0, paused: true }); const onClick = () => { setState({ ...state, position: 0, paused: false }) } }
  • 20. Using context without hooks import { ThemeContext } from './context'; const Counter = props => { const [count, setCount] = useState(0); return ( <ThemeContext.Consumer> {theme => ( <Button theme={theme} onClick={...}> {count} </Button> )} </ThemeContext.Consumer> ) }
  • 21. useContext hook import React, { useContext } from 'react'; import { ThemeContext } from './context'; const Counter = props => { const [count, setCount] = useState(0); const theme = useContext(ThemeContext) return ( <Button theme={theme} onClick={...}> {count} </Button> ) }
  • 22. useContext hook import React, { useContext } from 'react'; import { ThemeContext } from './context'; const Counter = props => { const [count, setCount] = useState(0); const theme = useContext(ThemeContext) return ( <Button theme={theme} onClick={...}> {count} </Button> ) }
  • 24. useRef const TextInputWithFocusButton = (props) => { const inputRef = useRef(); return ( <> <input ref={inputRef} type="text" /> <button onClick={() => inputRef.current.focus()}> Focus the input </button> </> ); }
  • 25. useRef const TextInputWithFocusButton = (props) => { const inputRef = useRef(); return ( <> <input ref={inputRef} type="text" /> <button onClick={() => inputRef.current.focus()}> Focus the input </button> </> ); }
  • 26. useRef const TextInputWithFocusButton = (props) => { const inputRef = useRef(); return ( <> <input ref={inputRef} type="text" /> <button onClick={() => inputRef.current.focus()}> Focus the input </button> </> ); }
  • 27. useRef const TextInputWithFocusButton = (props) => { const inputRef = useRef(); return ( <> <input ref={inputRef} type="text" /> <button onClick={() => inputRef.current.focus()}> Focus the input </button> </> ); }
  • 28. Rules of Hooks ● Only Call Hooks at the Top Level! ○ Don’t call Hooks inside loops, conditions, or nested functions ○ Order Matters! ● Only Call Hooks from React Functions ○ Or from custom hooks
  • 29. Under the hood MyComponent Memoized State Array Hooks Dispatcher MyComponent - Initial Render useState() useRef() useState() State hook Ref hook State hook Slot 0 Slot 1 Slot 2
  • 30. Under the hood MyComponent Memoized State Array Hooks Dispatcher useState() useRef() useState() State hook Ref hook State hook useState() Search on Slot 0 MyComponent - Initial Render MyComponent - 2nd Render
  • 31. Under the hood MyComponent Memoized State Array Hooks Dispatcher useState() useRef() useState() State hook Ref hook State hook useState() useRef() useState() Search on Slot 1MyComponent - 2nd Render MyComponent - Initial Render
  • 33. Executing something on every render using lifecycle class CounterButton extends Component { constructor() { super(); this.state = {count: 0} } componentDidMount() { console.log(`The count is now ${this.state.count}`) } componentDidUpdate() { console.log(`The count is now ${this.state.count}`) } render() { return <button onClick={() => this.setState(prevState => ({ count: prevState.count + 1 }))}> { this.state.count } </button> } }
  • 34. Executing something on every render using useEffect const Counter = props => { const [count, setCount] = useState(0); useEffect(() => { console.log(`The count is now ${count}`) }); return <button onClick={() => setCount(count + 1)}> { count } </button> }
  • 35. Executing something on every render using useEffect const Counter = props => { const [count, setCount] = useState(0); useEffect(() => { console.log(`The count is now ${count}`) }); return <button onClick ={() => setCount(count + 1)}> { count } </button> }
  • 36. Effects with Cleanup useEffect(() => { console.log(`The count is now ${count}`); return function cleanup() { console.log('cleaning up'); } });
  • 37. Effects with Cleanup useEffect(() => { console.log(`The count is now ${count}`); return function cleanup() { console.log('cleaning up'); } });
  • 38. Should my effect run on every render? Consider the next scenario...
  • 39. //timer changes every 100ms const Counter = ({timer}) => { const [count, setCount] = useState(0); useEffect(() => { console.log(`The count is now ${count}`) }); return <MyComponent onClick={() => setCount(count + 1)} timer={timer}> { count } </MyComponent> }
  • 40.
  • 41. useEffect 2nd parameter useEffect(() => { console.log(`The count is now ${count}`) }, [count]);
  • 42. componentWillReceiveProps componentWillReceiveProps(nextProps) { if (this.props.timer !== nextProps.timer) { console.log(`The timer is now ${nextProps.timer}`) } }
  • 43. componentWillReceiveProps - hooks version useEffect(() => { console.log(`Timer is now ${props.timer}`); }, [props.timer]);
  • 44. componentDidMount - hooks version useEffect(() => { console.log(`I just mounted!`) }, []);
  • 45. componentWillUnmount - hooks version useEffect(() => { return function cleanup(){ console.log(`I'm unmounting!`) } }, []);
  • 46. Let’s combine what we learned so far
  • 47.
  • 48. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } }
  • 49. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage.bind(this); }
  • 50. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } onNewMessage(message) { this.setState({ messages: [...this.state.messages, message] }) }
  • 51. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } componentDidMount () { SocketClient.subscribeForNewMessages ( this.props.roomId, this.onNewMessage ); }
  • 52. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } componentWillUnmount () { SocketClient.unsubscribe( this.props.roomId ); }
  • 53. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } componentWillReceiveProps(nextProps) { if (nextProps.roomId !== this.props.roomId) { this.setState({ messages: [] }); SocketClient.unsubscribe(this.props.roomId); SocketClient.subscribeForNewMessages( nextProps.roomId, this.onNewMessage ); } }
  • 54. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } render() { return this.state.messages .map((text, i) => <div key={i}>{text}</div> ) }
  • 55. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([...messages, message]); SocketClient.subscribeForNewMessages (roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 56. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([ ...messages, message]); SocketClient.subscribeForNewMessages(roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 57. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([ ...messages, message]); SocketClient.subscribeForNewMessages(roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 58. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([ ...messages, message]); SocketClient.subscribeForNewMessages(roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 59. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([...messages, message]); SocketClient.subscribeForNewMessages(roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 60. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([ ...messages, message]); SocketClient.subscribeForNewMessages (roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 61. const ChatPage = ({ roomId }) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([ ...messages, message]); SocketClient.subscribeForNewMessages(roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 63. What are Custom Hooks? ● Basically functions that run hooks ● Like any other function - they can can take any args and return whatever you want ● By convention - custom hook name start with “use” ● Like any other hook - must be called on the top level of our components
  • 64. This is the custom hook: const useChatMessages = (roomId) => { const [messages, setMessages] = useState([]); useEffect(() => { setMessages([]); const onNewMessage = (message) => setMessages([...messages, message]); SocketClient.subscribeForNewMessages(roomId, onNewMessage); return () => SocketClient.unsubscribe(roomId); }, [roomId]); return messages; }
  • 65. This is the (very short) component: const ChatPage = ({ roomId }) => { const messages = useChatMessages(roomId); return messages.map((text, i) => <div key={i}>{text}</div>) }
  • 66. class ChatPage extends Component { constructor() { super(); this.state = { messages: [] } this.onNewMessage = this.onNewMessage. bind(this); } componentDidMount () { SocketClient. subscribeForNewMessages (this.props.roomId, this.onNewMessage ); } componentWillUnmount () { SocketClient. unsubscribe (this.props.roomId); } componentWillReceiveProps (nextProps ) { if (nextProps .roomId !== this.props.roomId) { this.setState ({ messages: [] }); SocketClient. unsubscribe (this.props.roomId); SocketClient. subscribeForNewMessages (nextProps .roomId, this.onNewMessage ); } } onNewMessage (message) { this.setState ({ messages: [...this.state.messages , message] }) } render() { return this.state.messages. map((text, i) => <div key={i}>{text}</div>) } } Remember how it used to look?28 lines vs. 5 with custom hook
  • 67. Custom Hooks allow us to.. ● Easily share code ● Keep our components clean and readable ● Use Hooks from npm packages
  • 68.
  • 69. Other hooks ● useReducer ● useCallback ● useMemo ● useImperativeMethods ● useLayoutEffect
  • 70. Memo
  • 71. React.memo PureComponent for function components import React, {memo} from 'react'; const MyComponent = props => { ... } export default memo(MyComponent); Introduced on React 16.6
  • 72. React.memo PureComponent for function components import React, {memo} from 'react'; const MyComponent = props => { ... } const areEqual = (prevProps, nextProps) => { ... } export default memo(MyComponent, areEqual); Introduced on React 16.6
  • 73. <MyComponent x={1} y={2}/> DOM render x=1 y=2 Memo Cache <MyComponent x={2} y={2}/> render x=2 y=2 <MyComponent x={2} y={3}/> 1 2 3 Rendering “MyComponent” with Memo x=1 y=2 x=2 y=2 areEqual = (prev, next) => prev.x === next.x
  • 75. Lazy Code-Splitting import React, { lazy } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent' )); const MyComponent = (props) => <div> <OtherComponent/> </div> Introduced on React 16.6
  • 76. Lazy Code-Splitting import React, { lazy } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent')); const MyComponent = (props) => <div> <OtherComponent/> </div> Introduced on React 16.6
  • 77. Lazy Code-Splitting import React, { lazy } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent' )); const MyComponent = (props) => <div> <OtherComponent/> </div> Introduced on React 16.6
  • 78. Lazy Code-Splitting import React, { lazy } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent')); const MyComponent = (props) => <div> <OtherComponent/> </div> Introduced on React 16.6
  • 79. Lazy + Suspense Code-Splitting import React, { lazy, Suspense } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent' )); const MyComponent = (props) => <div> <Suspense fallback={<div>Loading..</div>}> <OtherComponent /> </Suspense> </div> Introduced on React 16.6
  • 80. Lazy + Suspense Code-Splitting import React, { lazy, Suspense } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent')); const MyComponent = (props) => <div> <Suspense fallback ={<div>Loading..</div>}> <OtherComponent /> </Suspense> </div> Introduced on React 16.6
  • 81. Lazy + Suspense Code-Splitting import React, { lazy, Suspense } from 'react'; const OtherComponent = React.lazy(() => import('./OtherComponent')); const MyComponent = (props) => <div> <Suspense fallback={<div>Loading..</div>}> <OtherComponent /> </Suspense> </div> Introduced on React 16.6
  • 82. const Home = lazy(() => import('./components/Home )); const Posts = lazy(() => import('./components/Posts' )); const App = () => ( <Router> <Suspense fallback={<Loading />}> <Switch> <Route exact path="/" component={Home} /> <Route path="/posts" component={Posts} /> </Switch> </Suspense> </Router> )
  • 83.
  • 84. Hook me up with Questions nirsky Nir_Hadassi