OOP
Stateful Class
FP
Pure
Function
React Component is described mostly by
React Today and Tomorrow React conf 2018
What in React still sucks
What in React still sucks
- giant component
- confusing class
- reuse logic
Giant Component
class ActInfo extends Component {
componentDidMount() {
this.fetchActInfo()
this.startTimer()
this.fixWindow()
}
componentWillUnmount() {
this.cancelFetchActInfo()
this.clearTimer()
this.unFixWindow()
}
componentDidUpdate(prevProps) {
if(this.props.aaa !== prevProps.aaa) {
...
}
}
}
- logic is separated in mount and update lifecycle
- watch some props in update lifecycle
What in React still suck
- giant component
- confusing class
- reuse logic
Confusing class
- binding this in class is confusing for beginner
- function component to class component
- hard to optimize for compiler
What in React still suck
- giant component
- confusing class
- reuse logic
React Reuse Logic Pattern
- createClass and Mixins
- higher order component
- render props
Problems happen when these pattern scale
const App = React.createClass({
// Use the mixin!
mixins: [
MouseMixin,
toolTipsMixin,
popUpMixin
],
render() {
const { x, y } = this.state
return (
<div
style={{ height: '100%' }}
onMouseMove={this.handleMouseMove}
>
<h1>The mouse position is ({x}, {y})</h1>
</div>
)
}
})
createClass and mixins
- ECMAScript 2015 class not support
- where attribute coming from is confusing
- lifecycle hijack
- attribute naming conflict and override
Mixins Consider Harmful
Dan Abramov in react official blog
Higher Order Component
const ComponentA = ({ doSomeThing }) => (
<div onClick={doSomeThing} />
)
compose(
withRouter
withContext
connect
withI13n
withI18n
)(ComponentA)
- where props coming from is confusing
- props naming conflict and override
Never write another Hoc
by Michael Jackson Phoenix React meetup
Render Props
const App = () => (
<Tooltip>
{(renderToolTip) => (
<MouseHover>
{(handleMouseHover, isMouseHover) => (
<div
onMouseHover={handleMouseHover}
className={
isMouseHover ? style.active : style.normal
}
>
{renderToolTip()}
</div>
)}
<MouseHover>
)}
</Tooltip>
)
What in react still sucks
- giant Component
- logic is separated in mount and update lifecycle
- watch some props in update lifecycle
- confusing class
- this binding is confusing for beginner
- hard for compiler optimize
- functional component to class component
- reuse logic
- declarative and explicit dependency
- naming conflict
- wrapper hell + multiple createElement call
What are React hooks
make Function Component great again
useState hooks
const Cmp = () => {
const [state, setState] = useState(initialValue)
return (
<div onClick={() => setState(value)}>
{state}
</div>
)
}
useEffect hooks
const Cmp = () => {
useEffect(() => {
const timeout = setTimeout(() => {}, 10000)
return () => clearTimeout(timeout)
})
return (
<div>
{state}
</div>
)
}
rewrite a Carousel Example
custom hook demo
minify comparison
hoc
babel loose compile 3.8KB
minify 2.5KB
0.66%
hooks
babel loose compile 1.4KB
minify 684 Byte
0.48%
What in react still sucks
- giant Component
- logic is separated in mount and update lifecycle
- watch some props in update lifecycle
- confusing class
- this binding is confusing for beginner
- hard for compiler optimize
- functional component => class component
- reuse logic
- wrapper hell + multiple createElement call
- declarative and explicit dependency
- naming conflict
😀
😀
😀
😀
😀
😀
😀
😀
More hooks
-
Basic Hooks
- useState
- useEffect
- useContext
-
Additional Hooks
- useReducer
- useCallback
- useMemo
- useRef
- useImperativeMethods
- useDebugValue
- useLayoutEffect
How hooks work
pseudo code
let hooks = null;
export function useHook() {
hooks.push(hookData);
}
function reactInternalRenderAComponentMethod(component) {
hooks = [];
component();
let hooksForThisComponent = hooks;
hooks = null;
}
Rule of hooks
- hooks should be the same order in every rendering
- no conditional hook
- only call hooks inside component and custom hooks
- eslint-plugin-react-hooks
state linked list
setter linked list
State 1
setter 1
State 2
setter 2
State 3
setter 3
function with hook vs
Class Component
an Apply job example
function in Component capture all props and state for it own render
useCallback & useEffect
useEffect(() => {
}, [listenOuter1, listenOuter2])
const memoizedCallback = useCallback(() => {
}, [listenOuter1, listenOuter2])
Frequently Asked Questions
How to learn hooks?
❌
✅
how about testing
🚧 Enzyme
class Component is bad and will be deprecated
rewrite everything with hooks?
will hooks replace redux?
will context api replace redux?
React-Redux v7 is rewritten in hooks
One more thing
OOP
Stateful Class
FP
Pure
Function
React Component is described mostly by
Stateful Class Model
🤔 receive props
🤔 pure render
🤔 no direct instantiation
Pure Function Model
🤔 local mutable state
class Item extends Component {
state = { isOn: false }
}
const Item = ({ text }) => (
<div>{text}</div>
)
OOP
stateful
Class
FP
pure
function
React Component is described mostly by
React Hooks and Component
By Tarun Sharma
React Hooks and Component
- 287