Core React: State of A Component Is An Object That Holds Some Information That
Core React: State of A Component Is An Object That Holds Some Information That
Core React: State of A Component Is An Object That Holds Some Information That
handleClick() {
How to create refs?
// ... There are two approaches
} This is a recently added approach. Refs are created
}
using React.createRef() method and attached to React elements via
Public class fields syntax: If you don't like to use bind approach
the ref attribute. In order to use refs throughout the component, just
then public class fields syntax can be used to correctly bind callbacks.
handleClick = () => { assign the ref to the instance property within constructor.
console.log('this is:', this) class MyComponent extends React.Component {
} constructor(props) {
<button onClick={this.handleClick}> super(props)
{'Click me'} this.myRef = React.createRef()
</button> }
render() {
Arrow functions in callbacks: You can use arrow functions directly in return <div ref={this.myRef} />
the callbacks. }
<button onClick={(event) => this.handleClick(event)}> }
{'Click me'} You can also use ref callbacks approach regardless of React version.
</button>
For example, the search bar component's input element accessed as
Note: If the callback is passed as prop to child components, those
follows,
components might do an extra re-rendering. In those cases, it is class SearchBar extends Component {
preferred to go with .bind() or public class fields syntax approach constructor(props) {
considering performance. super(props);
this.txtSearch = null;
How to pass a parameter to an event handler or this.state = { term: '' };
this.setInputSearchRef = e => {
callback? this.txtSearch = e;
}
You can use an arrow function to wrap around an event handler and }
pass parameters: onInputChange(event) {
<button onClick={() => this.handleClick(id)} /> this.setState({ term: this.txtSearch.value });
This is an equivalent to calling .bind: }
render() {
<button onClick={this.handleClick.bind(this, id)} />
return (
What are synthetic events in React? <input
value={this.state.term}
SyntheticEvent is a cross-browser wrapper around the browser's native onChange={this.onInputChange.bind(this)}
event. It's API is same as the browser's native event, ref={this.setInputSearchRef} />
);
including stopPropagation() and preventDefault(), except the events
}
work identically across all browsers. }
What is inline conditional expressions? You can also use refs in function components using closures. Note:
You can use either if statements or ternary expressions which are You can also use inline ref callbacks even though it is not a
available from JS to conditionally render expressions. Apart from recommended approach
these approaches, you can also embed any expressions in JSX by What are forward refs?
Ref forwarding is a feature that lets some components take a ref they Whenever any underlying data changes, the entire UI is re-rendered in
receive, and pass it further down to a child. Virtual DOM
const ButtonElement = React.forwardRef((props, ref) => (
<button ref={ref} className="CustomButton">
{props.children}
</button>
));
render() {
return <div />
}
only the things that have actually changed.
} What is the difference between Shadow DOM and
The recommended approach is:
class MyComponent extends Component { Virtual DOM?
componentDidMount() { The Shadow DOM is a browser technology designed primarily for
this.node.scrollIntoView()
} scoping variables and CSS in web components. The Virtual DOM is a
concept implemented by libraries in JavaScript on top of browser
render() { APIs.
return <div ref={node => this.node = node} />
} What is React Fiber?
}
Fiber is the new reconciliation engine or reimplementation of core
Why are String Refs legacy? algorithm in React v16. The goal of React Fiber is to increase its
If you worked with React before, you might be familiar with an older suitability for areas like animation, layout, gestures, ability to pause,
API where the ref attribute is a string, like ref={'textInput'}, and the abort, or reuse work and assign priority to different types of updates;
DOM node is accessed as this.refs.textInput. We advise against it and new concurrency primitives.
because string refs have below issues, and are considered legacy.
String refs were removed in React v16.
What is the main goal of React Fiber?
The goal of React Fiber is to increase its suitability for areas like
They force React to keep track of currently executing component. This
is problematic because it makes react module stateful, and thus animation, layout, and gestures. Its headline feature is incremental
rendering: the ability to split rendering work into chunks and spread it
causes weird errors when react module is duplicated in the bundle.
out over multiple frames.
They are not composable — if a library puts a ref on the passed child,
the user can't put another ref on it. Callback refs are perfectly What are controlled components?
composable. A component that controls the input elements within the forms on
They don't work with static analysis like Flow. Flow can't guess the subsequent user input is called Controlled Component, i.e, every state
magic that framework does to make the string ref appear mutation will have an associated handler function.
on this.refs, as well as its type (which could be different). Callback For example, to write all the names in uppercase letters, we use
refs are friendlier to static analysis. handleChange as below,
It doesn't work as most people would expect with the "render handleChange(event) {
this.setState({value: event.target.value.toUpperCase()})
callback" pattern (e.g. ) }
class MyComponent extends Component {
renderRow = (index) => { What are uncontrolled components?
// This won't work. Ref will get attached to DataTable rather than The Uncontrolled Components are the ones that store their own state
MyComponent:
return <input ref={'input-' + index} />; internally, and you query the DOM using a ref to find its current value
when you need it. This is a bit more like traditional HTML.
// This would work though! Callback refs are awesome.
return <input ref={input => this['input-' + index] = input} />;
In the below UserProfile component, the name input is accessed using
} ref.
class UserProfile extends React.Component {
render() { constructor(props) {
return <DataTable data={this.props.data} renderRow={this.renderRow} /> super(props)
} this.handleSubmit = this.handleSubmit.bind(this)
} this.input = React.createRef()
}
What is Virtual DOM?
The Virtual DOM (VDOM) is an in-memory representation of Real handleSubmit(event) {
alert('A name was submitted: ' + this.input.current.value)
DOM. The representation of a UI is kept in memory and synced with event.preventDefault()
the "real" DOM. It's a step that happens between the render function }
being called and the displaying of elements on the screen. This entire
render() {
process is called reconciliation. return (
How Virtual DOM works? <form onSubmit={this.handleSubmit}>
<label>
The Virtual DOM works in three simple steps. {'Name:'}
<input type="text" ref={this.input} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
In most cases, it's recommend to use controlled components to
implement forms.
What is the difference between createElement and shouldComponentUpdate: Determines if the component will be
updated or not. By default it returns true. If you are sure that the
cloneElement? component doesn't need to render after state or props are updated,
JSX elements will be transpiled to React.createElement() functions to you can return false value. It is a great place to improve performance
create React elements which are going to be used for the object as it allows you to prevent a re-render if component receives new
representation of UI. Whereas cloneElement is used to clone an prop.
element and pass it new props. getSnapshotBeforeUpdate: Executed right before rendered output is
What is Lifting State Up in React? committed to the DOM. Any value returned by this will be passed
When several components need to share the same changing data then into componentDidUpdate(). This is useful to capture information from
it is recommended to lift the shared state up to their closest common the DOM i.e. scroll position.
ancestor. That means if two child components share the same data componentDidUpdate: Mostly it is used to update the DOM in
from its parent, then move the state to parent instead of maintaining response to prop or state changes. This will not fire
local state in both of the child components. if shouldComponentUpdate() returns false.
What are the different phases of component componentWillUnmount It will be used to cancel any outgoing
network requests, or remove all event listeners associated with the
lifecycle? component.
The component lifecycle has three distinct lifecycle phases: Before 16.3
Mounting: The component is ready to mount in the browser DOM. componentWillMount: Executed before rendering and is used for App
This phase covers initialization level configuration in your root component.
from constructor(), getDerivedStateFromProps(), render(), componentDidMount: Executed after first rendering and here all AJAX
and componentDidMount() lifecycle methods. requests, DOM or state updates, and set up event listeners should
Updating: In this phase, the component get updated in two ways, occur.
sending the new props and updating the state either componentWillReceiveProps: Executed when particular prop updates
from setState() or forceUpdate(). This phase to trigger state transitions.
covers getDerivedStateFromProps(), shouldComponentUpdate(), render(), get shouldComponentUpdate: Determines if the component will be
SnapshotBeforeUpdate() and componentDidUpdate() lifecycle methods. updated or not. By default it returns true. If you are sure that the
Unmounting: In this last phase, the component is not needed and get component doesn't need to render after state or props are updated,
unmounted from the browser DOM. This phase you can return false value. It is a great place to improve performance
includes componentWillUnmount() lifecycle method. as it allows you to prevent a re-render if component receives new
It's worth mentioning that React internally has a concept of phases prop.
when applying changes to the DOM. They are separated as follows componentWillUpdate: Executed before re-rendering the component
Render The component will render without any side-effects. This when there are props & state changes confirmed
applies for Pure components and in this phase, React can pause, by shouldComponentUpdate() which returns true.
abort, or restart the render. componentDidUpdate: Mostly it is used to update the DOM in
Pre-commit Before the component actually applies the changes to the response to prop or state changes.
DOM, there is a moment that allows React to read from the DOM componentWillUnmount: It will be used to cancel any outgoing
through the getSnapshotBeforeUpdate(). network requests, or remove all event listeners associated with the
Commit React works with the DOM and executes the final lifecycles component.
respectively componentDidMount() for mounting, componentDidUpdate() for What are Higher-Order Components?
updating, and componentWillUnmount() for unmounting.
A higher-order component (HOC) is a function that takes a component
React 16.3+ Phases (or an interactive version)
and returns a new component. Basically, it's a pattern that is derived
from React's compositional nature.
We call them pure components because they can accept any
dynamically provided child component but they won't modify or copy
any behavior from their input components.
const EnhancedComponent = higherOrderComponent(WrappedComponent)
HOC can be used for many use cases:
Code reuse, logic and bootstrap abstraction.
Render hijacking.
State abstraction and manipulation.
Props manipulation.
How to create props proxy for HOC component?
You can add/edit props passed to the component using props
Before React 16.3
proxy pattern like this:
function HOC(WrappedComponent) {
return class Test extends Component {
render() {
const newProps = {
title: 'New Header',
footer: false,
showFeatureX: false,
showFeatureY: true
}
then placed inside a page body as part of the server response. On the This lifecycle method along with componentDidUpdate() covers all the
client side, React detects the pre-rendered content and seamlessly use cases of componentWillUpdate().
picks up where it left off. What is the difference between createElement()
How to enable production mode in React? and cloneElement() methods?
You should use Webpack's DefinePlugin method to In JSX the React element is transpiled to React.createElement() which
set NODE_ENV to production, by which it strip out things like propType represents an UI element. Whereas React.cloneElement() is used in
validation and extra warnings. Apart from this, if you minify the code, order to clone an element and pass it new props.
for example, Uglify's dead-code elimination to strip out development What is the recommended way for naming
only code and comments, it will drastically reduce the size of your
bundle. components?
It is recommended to name the component by reference instead of
What is CRA and its benefits?
using displayName.
The create-react-app CLI tool allows you to quickly create & run React
Using displayName for naming component:
applications with no configuration step. export default React.createClass({
Let's create Todo App using CRA: displayName: 'TodoApp',
# Installation // ...
$ npm install -g create-react-app })
The recommended approach:
# Create new project export default class TodoApp extends React.Component {
$ create-react-app todo-app // ...
$ cd todo-app }
after a component is instantiated as well as before it is re-rendered. It return <Handler {...props} />
can return an object to update state, or null to indicate that the new }
props do not require any state updates. // The keys of the PAGES object can be used in the prop types to catch
class MyComponent extends React.Component { dev-time errors.
static getDerivedStateFromProps(props, state) { Page.propTypes = {
// ... page: PropTypes.oneOf(Object.keys(PAGES)).isRequired
} }
}
This lifecycle method along with componentDidUpdate() covers all the Why we need to pass a function to setState()?
use cases of componentWillReceiveProps(). The reason behind for this is that setState() is an asynchronous
What is the purpose operation. React batches state changes for performance reasons, so
the state may not change immediately after setState() is called. That
of getSnapshotBeforeUpdate() lifecycle means you should not rely on the current state when
method? calling setState() since you can't be sure what that state will be. The
solution is to pass a function to setState(), with the previous state as
an argument. By doing this you can avoid issues with the user getting onPointerDown
onPointerMove
the old state value on access due to the asynchronous nature onPointerUp
of setState(). onPointerCancel
onGotPointerCapture
Let's say the initial count value is zero. After three consecutive onLostPointerCaptur
increment operations, the value is going to be incremented only by onPointerEnter
one. onPointerLeave
// assuming this.state.count === 0 onPointerOver
this.setState({ count: this.state.count + 1 }) onPointerOut
this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
Why should component names start with capital
// this.state.count === 1, not 3 letter?
If we pass a function to setState(), the count gets incremented If you are rendering your component using JSX, the name of that
correctly. component has to begin with a capital letter otherwise React will
this.setState((prevState, props) => ({
count: prevState.count + props.increment throw an error as unrecognized tag. This convention is because only
})) HTML elements and SVG tags can begin with a lowercase letter.
// this.state.count === 3 as expected
You can define component class which name starts with lowercase
What is strict mode in React? letter, but when it's imported it should have capital letter. Here
React.StrictMode is an useful component for highlighting potential lowercase is fine:
problems in an application. Just like <Fragment>, <StrictMode> does not class myComponent extends Component {
render() {
render any extra DOM elements. It activates additional checks and return <div />
warnings for its descendants. These checks apply for development }
mode only. }
import React from 'react'
export default myComponent
function ExampleApplication() { While when imported in another file it should start with capital letter:
return ( import MyComponent from './MyComponent'
<div>
<Header /> Are custom DOM attributes supported in React
<React.StrictMode>
<div> v16?
<ComponentOne /> Yes. In the past, React used to ignore unknown DOM attributes. If you
<ComponentTwo />
</div>
wrote JSX with an attribute that React doesn't recognize, React would
</React.StrictMode> just skip it. For example, this:
<Footer /> <div mycustomattribute={'something'} />
</div> Would render an empty div to the DOM with React v15:
) <div />
}
In React v16 any unknown attributes will end up in the DOM:
In the example above, the strict mode checks apply <div mycustomattribute='something' />
to <ComponentOne> and <ComponentTwo> components only. This is useful for supplying browser-specific non-standard attributes,
What are React Mixins? trying new DOM APIs, and integrating with opinionated third-party
Mixins are a way to totally separate components to have a common libraries.
functionality. Mixins are should not be used and can be replaced What is the difference between constructor and
with higher-order components or decorators.
One of the most commonly used mixins is PureRenderMixin. You might
getInitialState?
be using it in some components to prevent unnecessary re-renders You should initialize state in the constructor when using ES6 classes,
when the props and state are shallowly equal to the previous props and getInitialState() method when using React.createClass().
and state: Using ES6 classes:
class MyComponent extends React.Component {
const PureRenderMixin = require('react-addons-pure-render-mixin')
constructor(props) {
super(props)
const Button = React.createClass({
this.state = { /* initial state */ }
mixins: [PureRenderMixin],
}
// ...
}
})
Using React.createClass():
Why is isMounted() an anti-pattern and what is const MyComponent = React.createClass({
getInitialState() {
the proper solution? return { /* initial state */ }
The primary use case for isMounted() is to avoid calling setState() after }
})
a component has been unmounted, because it will emit a warning.
if (this.isMounted()) {
Note: React.createClass() is deprecated and removed in React v16.
this.setState({...}) Use plain JavaScript classes instead.
}
Checking isMounted() before calling setState() does eliminate the Can you force a component to re-render without
warning, but it also defeats the purpose of the warning. calling setState?
Using isMounted() is a code smell because the only reason you would By default, when your component's state or props change, your
check is because you think you might be holding a reference after the component will re-render. If your render() method depends on some
component has unmounted. other data, you can tell React that the component needs re-rendering
An optimal solution would be to find places where setState() might be by calling forceUpdate().
called after a component has unmounted, and fix them. Such component.forceUpdate(callback)
situations most commonly occur due to callbacks, when a component It is recommended to avoid all uses of forceUpdate() and only read
is waiting for some data and gets unmounted before the data arrives. from this.props and this.state in render().
Ideally, any callbacks should be canceled in componentWillUnmount(), What is the difference
prior to unmounting.
between super() and super(props) in React
What are the Pointer Events supported in React? using ES6 classes?
Pointer Events provide a unified way of handling all input events. In
When you want to access this.props in constructor() then you should
the olden days we have a mouse and respective event listeners to
pass props to super() method.
handle them but nowadays we have many devices which don't
Using super(props):
correlate to having a mouse, like phones with touch surface or pens. class MyComponent extends React.Component {
We need to remember that these events will only work in browsers constructor(props) {
that support the Pointer Eventsspecification. super(props)
console.log(this.props) // { name: 'John', ... }
The following event types are now available in React DOM: }
} If you try to render a <label> element bound to a text input using the
Using super(): standard for attribute, then it produces HTML missing that attribute
class MyComponent extends React.Component {
constructor(props) { and prints a warning to the console.
super() <label for={'user'}>{'User'}</label>
console.log(this.props) // undefined <input type={'text'} id={'user'} />
} Since for is a reserved keyword in JavaScript, use htmlFor instead.
} <label htmlFor={'user'}>{'User'}</label>
Outside constructor() both will display same value for this.props. <input type={'text'} id={'user'} />
How to loop inside JSX? How to combine multiple inline style objects?
You can simply use Array.prototype.map with ES6 arrow You can use spread operator in regular React:
<button style={{...styles.panel.button,
function syntax. For example, the items array of objects is mapped ...styles.panel.submitButton}}>{'Submit'}</button>
into an array of components: If you're using React Native then you can use the array notation:
<tbody> <button style={[styles.panel.button,
{items.map(item => <SomeComponent key={item.id} name={item.name} />)} styles.panel.submitButton]}>{'Submit'}</button>
</tbody>
You can't iterate using for loop: How to re-render the view when the browser is
<tbody>
for (let i = 0; i < items.length; i++) { resized?
<SomeComponent key={items[i].id} name={items[i].name} /> You can listen to the resize event in componentDidMount() and then
}
</tbody>
update the dimensions (width and height). You should remove the
This is because JSX tags are transpiled into function calls, and you listener in componentWillUnmount() method.
class WindowDimensions extends React.Component {
can't use statements inside expressions. This may change thanks componentWillMount() {
to do expressions which are stage 1 proposal. this.updateDimensions()
}
How do you access props in attribute quotes?
React (or JSX) doesn't support variable interpolation inside an componentDidMount() {
window.addEventListener('resize', this.updateDimensions)
attribute value. The below representation won't work: }
<img className='image' src='images/{this.props.image}' />
But you can put any JS expression inside curly braces as the entire componentWillUnmount() {
window.removeEventListener('resize', this.updateDimensions)
attribute value. So the below expression works: }
<img className='image' src={'images/' + this.props.image} />
Using template strings will also work: updateDimensions() {
<img className='image' src={`images/${this.props.image}`} /> this.setState({width: $(window).width(), height: $(window).height()})
}
What is React proptype array with shape?
If you want to pass an array of objects to a component with a render() {
return <span>{this.state.width} x {this.state.height}</span>
particular shape then use React.PropTypes.shape() as an argument }
to React.PropTypes.arrayOf(). }
ReactComponent.propTypes = {
arrayWithShape: React.PropTypes.arrayOf(React.PropTypes.shape({ What is the difference
color: React.PropTypes.string.isRequired,
fontSize: React.PropTypes.number.isRequired
between setState() and replaceState() met
})).isRequired
}
hods?
When you use setState() the current and previous states are
How conditionally apply class attributes? merged. replaceState() throws out the current state, and replaces it
You shouldn't use curly braces inside quotes because it is going to be with only what you provide. Usually setState() is used unless you
evaluated as a string. really need to remove all previous keys for some reason. You can also
<div className="btn-panel {this.props.visible ? 'show' : 'hidden'}">
Instead you need to move curly braces outside (don't forget to include set state to false/null in setState() instead of using replaceState().
spaces between class names): How to listen to state changes?
<div className={'btn-panel ' + (this.props.visible ? 'show' : The following lifecycle methods will be called when state changes.
'hidden')}>
You can compare provided state and props values with current state
Template strings will also work:
<div className={`btn-panel ${this.props.visible ? 'show' : and props to determine if something meaningful changed.
'hidden'}`}> componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
What is the difference between React and What is the recommended approach of removing
ReactDOM? an array element in React state?
The react package
The better approach is to use Array.prototype.filter() method.
contains React.createElement(), React.Component, React.Children, and
For example, let's create a removeItem() method for updating the state.
other helpers related to elements and component classes. You can removeItem(index) {
think of these as the isomorphic or universal helpers that you need to this.setState({
build components. The react-dom package contains ReactDOM.render(), data: this.state.data.filter((item, i) => i !== index)
})
and in react-dom/server we have server-side rendering support }
with ReactDOMServer.renderToString() and ReactDOMServer.renderToStatic
Markup().
Is it possible to use React without rendering
Why ReactDOM is separated from React? HTML?
It is possible with latest version (>=16.2). Below are the possible
The React team worked on extracting all DOM-related features into a
options:
separate library called ReactDOM. React v0.14 is the first release in render() {
which the libraries are split. By looking at some of the return false
packages, react-native, react-art, react-canvas, and react-three, it has }
render() {
become clear that the beauty and essence of React has nothing to do return null
with browsers or the DOM. To build more environments that React }
render() {
can render to, React team planned to split the main React package return []
into two: reactand react-dom. This paves the way to writing }
components that can be shared between the web version of React render() {
return <React.Fragment></React.Fragment>
and React Native. }
How to use React label element? render() {
return <></>
}
Returning undefined won't work. ReactDOM.render(
<div>{`React version: ${REACT_VERSION}`}</div>,
How to pretty print JSON with React? document.getElementById('app')
)
We can use <pre> tag so that the formatting of the JSON.stringify() is
retained: What are the approaches to include polyfills in
const data = { name: 'John', age: 42 }
your create-react-app?
class User extends React.Component { Manual import from core-js:
render() {
return (
Create a file called (something like) polyfills.js and import it into
<pre> root index.js file. Run npm install core-js or yarn add core-js and
{JSON.stringify(data, null, 2)} import your specific required features.
</pre> import 'core-js/fn/array/find'
) import 'core-js/fn/array/includes'
} import 'core-js/fn/number/is-nan'
}
Using Polyfill service:
React.render(<User />, document.getElementById('container')) Use the polyfill.io CDN to retrieve custom, browser-specific polyfills
Why you can't update props in React? by adding this line to index.html:
<script
The React philosophy is that props should be immutable and top- src='https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array
down. This means that a parent can send any prop values to a child, .prototype.includes'></script>
but the child can't modify received props. In the above script we had to explicitly request
the Array.prototype.includes feature as it is not included in the default
How to focus an input element on page load? feature set.
You can do it by creating ref for input element and using it
in componentDidMount(): How to use https instead of http in create-react-
class App extends React.Component{
componentDidMount() {
app?
this.nameInput.focus() You just need to use HTTPS=true configuration. You can edit
} your package.json scripts section:
"scripts": {
render() {
"start": "set HTTPS=true && react-scripts start"
return (
}
<div>
<input or just run set HTTPS=true && npm start
defaultValue={'Won\'t focus'}
/> How to avoid using relative path imports in create-
<input
ref={(input) => this.nameInput = input}
react-app?
defaultValue={'Will focus'} Create a file called .env in the project root and write the import path:
/> NODE_PATH=src/app
</div> After that restart the development server. Now you should be able to
)
} import anything inside src/app without relative paths.
}
How to add Google Analytics for React Router?
ReactDOM.render(<App />, document.getElementById('app')) Add a listener on the history object to record each page view:
history.listen(function (location) {
What are the possible ways of updating objects in window.ga('set', 'page', location.pathname + location.search)
state? window.ga('send', 'pageview', location.pathname + location.search)
})
Calling setState() with an object to merge with state:
Using Object.assign() to create a copy of the object:
How to update a component every second?
const user = Object.assign({}, this.state.user, { age: 42 }) You need to use setInterval() to trigger the change, but you also need
this.setState({ user }) to clear the timer when the component unmounts to prevent errors
Using spread operator: and memory leaks.
const user = { ...this.state.user, age: 42 } componentDidMount() {
this.setState({ user }) this.interval = setInterval(() => this.setState({ time: Date.now() }),
Calling setState() with a function: 1000)
this.setState(prevState => ({ }
user: {
...prevState.user, componentWillUnmount() {
age: 42 clearInterval(this.interval)
} }
}))
How do you apply vendor prefixes to inline styles
Why function is preferred over object in React?
for setState()? React does not apply vendor prefixes automatically. You need to add
React may batch multiple setState() calls into a single update for vendor prefixes manually.
performance. Because this.props and this.statemay be updated <div style={{
transform: 'rotate(90deg)',
asynchronously, you should not rely on their values for calculating the WebkitTransform: 'rotate(90deg)', // note the capital 'W' here
next state. msTransform: 'rotate(90deg)' // 'ms' is the only lowercase vendor
This counter example will fail to update as expected: prefix
// Wrong }} />
this.setState({
counter: this.state.counter + this.props.increment,
How to import and export components using React
}) and ES6?
The preferred approach is to call setState() with function rather than You should use default for exporting the components
object. That function will receive the previous state as the first import React from 'react'
argument, and the props at the time the update is applied as the import User from 'user'
second argument. export default class MyProfile extends React.Component {
// Correct render(){
this.setState((prevState, props) => ({ return (
counter: prevState.counter + props.increment <User type="customer">
})) //...
How can we find the version of React at runtime in </User>
)
the browser? }
}
You can use React.version to get the version.
const REACT_VERSION = React.version
With the export specifier, the MyProfile is going to be the member React Transition Group and React Motion are popular animation
and exported to this module and the same can be imported without packages in React ecosystem.
mentioning the name in other components. What is the benefit of styles modules?
Why React component names must begin with a It is recommended to avoid hard coding style values in components.
capital letter? Any values that are likely to be used across different UI components
In JSX, lowercase tag names are considered to be HTML tags. should be extracted into their own modules.
However, capitalized and lowercase tag names with a dot (property For example, these styles could be extracted into a separate
accessors) aren't. component:
export const colors = {
<component /> compiles to React.createElement('component') (i.e, HTML white,
tag) black,
blue
<obj.component /> compiles to React.createElement(obj.component) }
<Component /> compiles to React.createElement(Component)
export const space = [
Why is a component constructor called only once? 0,
React's reconciliation algorithm assumes that without any 8,
16,
information to the contrary, if a custom component appears in the 32,
same place on subsequent renders, it's the same component as 64
]
before, so reuses the previous instance rather than creating a new
one. And then imported individually in other components:
import { space, colors } from './styles'
How to define constants in React? What are the popular React-specific linters?
You can use ES7 static field to define constant. ESLint is a popular JavaScript linter. There are plugins available that
class MyComponent extends React.Component {
static DEFAULT_PAGINATION = 10 analyse specific code styles. One of the most common for React is an
} npm package called eslint-plugin-react. By default, it will check a
Static fields are part of the Class Fields stage 3 proposal. number of best practices, with rules checking things from keys in
How to programmatically trigger click event in iterators to a complete set of prop types. Another popular plugin
is eslint-plugin-jsx-a11y, which will help fix common issues with
React? accessibility. As JSX offers slightly different syntax to regular HTML,
You could use the ref prop to acquire a reference to the
issues with alttext and tabindex, for example, will not be picked up by
underlying HTMLInputElement object through a callback, store the
regular plugins.
reference as a class property, then use that reference to later trigger a
click from your event handlers using the HTMLElement.click method. How to make AJAX call and in which component
This can be done in two steps: lifecycle methods should I make an AJAX call?
Create ref in render method: You can use AJAX libraries such as Axios, jQuery AJAX, and the
<input ref={input => this.inputElement = input} />
browser built-in fetch. You should fetch data in
Apply click event in your event handler:
this.inputElement.click()
the componentDidMount() lifecycle method. This is so you can
use setState() to update your component when the data is retrieved.
Is it possible to use async/await in plain React? For example, the employees list fetched from API and set local state:
If you want to use async/await in React, you will class MyComponent extends React.Component {
need Babel and transform-async-to-generator plugin. React Native constructor(props) {
super(props)
ships with Babel and a set of transforms. this.state = {
What are the common folder structures for React? employees: [],
error: null
There are two common practices for React project file structure. }
Grouping by features or routes: }
One common way to structure projects is locate CSS, JS, and tests componentDidMount() {
together, grouped by feature or route. fetch('https://api.example.com/items')
common/ .then(res => res.json())
├─ Avatar.js .then(
├─ Avatar.css (result) => {
├─ APIUtils.js this.setState({
└─ APIUtils.test.js employees: result.employees
feed/ })
├─ index.js },
├─ Feed.js (error) => {
├─ Feed.css this.setState({ error })
├─ FeedStory.js }
├─ FeedStory.test.js )
└─ FeedAPI.js }
profile/
├─ index.js render() {
├─ Profile.js const { error, employees } = this.state
├─ ProfileHeader.js if (error) {
├─ ProfileHeader.css return <div>Error: {error.message}</div>;
└─ ProfileAPI.js } else {
return (
Grouping by file type: <ul>
Another popular way to structure projects is to group similar files {employees.map(item => (
together. <li key={employee.name}>
api/ {employee.name}-{employees.experience}
├─ APIUtils.js </li>
├─ APIUtils.test.js ))}
├─ ProfileAPI.js </ul>
└─ UserAPI.js )
components/ }
├─ Avatar.js }
├─ Avatar.css }
├─ Feed.js
├─ Feed.css
What are render props?
├─ FeedStory.js Render Props is a simple technique for sharing code between
├─ FeedStory.test.js components using a prop whose value is a function. The below
├─ Profile.js
├─ ProfileHeader.js component uses render prop which returns a React element.
└─ ProfileHeader.css <DataProvider render={data => (
<h1>{`Hello ${data.target}`}</h1>
What are the popular packages for animation? )}/>
Libraries such as React Router and DownShift are using this pattern.
Button.contextTypes = {
history: React.PropTypes.shape({
push: React.PropTypes.func.isRequired
React Router
})
}
How to get query parameters in React Router v4?
The ability to parse query strings was taken out of React Router v4
What is React Router? because there have been user requests over the years to support
React Router is a powerful routing library built on top of React that different implementation. So the decision has been given to users to
helps you add new screens and flows to your application incredibly choose the implementation they like. The recommended approach is
quickly, all while keeping the URL in sync with what's being displayed to use query strings library.
on the page. const queryString = require('query-string');
How React Router is different from history library? const parsed = queryString.parse(props.location.search);
You can also use URLSearchParams if you want something native:
React Router is a wrapper around the history library which handles const params = new URLSearchParams(props.location.search)
interaction with the browser's window.history with its browser and const foo = params.get('name')
hash histories. It also provides memory history which is useful for You should use a polyfill for IE11.
environments that don't have global history, such as mobile app Why you get "Router may have only one child
development (React Native) and unit testing with Node.
element" warning?
What are the <Router> components of React You have to wrap your Route's in a <Switch> block because <Switch> is
Router v4? unique in that it renders a route exclusively.
React Router v4 provides below 3 <Router> components: At first you need to add Switch to your imports:
<BrowserRouter> import { Switch, Router, Route } from 'react-router'
<HashRouter> Then define the routes within <Switch> block:
<MemoryRouter> <Router>
The above components will create browser, hash, and memory history <Switch>
<Route {/* ... */} />
instances. React Router v4 makes the properties and methods of <Route {/* ... */} />
the history instance associated with your router available through the </Switch>
context in the router object. </Router>
MyComponent.propTypes = {
React Internationalization intl: intlShape.isRequired
}
function mapStateToProps(state) {
What is the difference between React context and
return { containerData: state.data } React Redux?
}
You can use Context in your application directly and is going to be
export default connect(mapStateToProps)(App) great for passing down data to deeply nested components which what
How to reset state in Redux? it was designed for. Whereas Redux is much more powerful and
You need to write a root reducer in your application which delegate provides a large number of features that the Context API doesn't
handling the action to the reducer generated by combineReducers(). provide. Also, React Redux uses context internally but it doesn't
For example, let us take rootReducer() to return the initial state expose this fact in the public API.
after USER_LOGOUT action. As we know, reducers are supposed to return Why are Redux state functions called reducers?
the initial state when they are called with undefined as the first Reducers always return the accumulation of the state (based on all
argument, no matter the action. previous and current actions). Therefore, they act as a reducer of
const appReducer = combineReducers({
/* your app's top-level reducers */
state. Each time a Redux reducer is called, the state and action are
}) passed as parameters. This state is then reduced (or accumulated)
based on the action, and then the next state is returned. You
const rootReducer = (state, action) => {
if (action.type === 'USER_LOGOUT') { could reduce a collection of actions and an initial state (of the store)
state = undefined on which to perform these actions to get the resulting final state.
}
How to make AJAX request in Redux?
return appReducer(state, action) You can use redux-thunk middleware which allows you to define async
}
In case of using redux-persist, you may also need to clean your actions.
storage. redux-persist keeps a copy of your state in a storage engine. Let's take an example of fetching specific account as an AJAX call
First, you need to import the appropriate storage engine and then, to using fetch API:
export function fetchAccount(id) {
parse the state before setting it to undefined and clean each storage return dispatch => {
state key. dispatch(setLoadingAccountState()) // Show a loading spinner
const appReducer = combineReducers({ fetch(`/account/${id}`, (response) => {
/* your app's top-level reducers */ dispatch(doneFetchingAccount()) // Hide loading spinner
}) if (response.status === 200) {
dispatch(setAccount(response.json)) // Use a normal function to set
const rootReducer = (state, action) => { the received state
if (action.type === 'USER_LOGOUT') { } else {
Object.keys(state).forEach(key => { dispatch(someError)
storage.removeItem(`persist:${key}`) }
}) })
}
state = undefined }
}
function setAccount(data) {
return appReducer(state, action) return { type: 'SET_Account', data: data }
} }
Whats the purpose of at symbol in the Redux Should I keep all component's state in Redux
connect decorator? store?
The @ symbol is in fact a JavaScript expression used to signify Keep your data in the Redux store, and the UI related state internally
decorators. Decorators make it possible to annotate and modify in the component.
classes and properties at design time. What is the proper way to access Redux store?
Let's take an example setting up Redux without and with a decorator. The best way to access your store in a component is to use
Without decorator: the connect() function, that creates a new component that wraps
import React from 'react'
import * as actionCreators from './actionCreators'
around your existing one. This pattern is called Higher-Order
import { bindActionCreators } from 'redux' Components, and is generally the preferred way of extending a
import { connect } from 'react-redux' component's functionality in React. This allows you to map state and
function mapStateToProps(state) { action creators to your component, and have them passed in
return { todos: state.todos } automatically as your store updates.
}
Let's take an example of <FilterLink> component using connect:
import { connect } from 'react-redux'
function mapDispatchToProps(dispatch) {
import { setVisibilityFilter } from '../actions'
return { actions: bindActionCreators(actionCreators, dispatch) }
import Link from '../components/Link'
}
const mapStateToProps = (state, ownProps) => ({
class MyApp extends React.Component {
active: ownProps.filter === state.visibilityFilter
// ...define your main app here
})
}
const mapDispatchToProps = (dispatch, ownProps) => ({
export default connect(mapStateToProps, mapDispatchToProps)(MyApp)
onClick: () => dispatch(setVisibilityFilter(ownProps.filter))
With decorator: })
import React from 'react'
import * as actionCreators from './actionCreators' const FilterLink = connect(
import { bindActionCreators } from 'redux' mapStateToProps,
import { connect } from 'react-redux' mapDispatchToProps
)(Link)
function mapStateToProps(state) {
return { todos: state.todos } export default FilterLink
}
Due to it having quite a few performance optimizations and generally You can use this object to decide what to return from those functions.
being less likely to cause bugs, the Redux developers almost always How to structure Redux top level directories?
recommend using connect() over accessing the store directly (using Most of the applications has several top-level directories as below:
context API). Components: Used for dumb components unaware of Redux.
class MyComponent {
someMethod() { Containers: Used for smart components connected to Redux.
doSomethingWith(this.context.store) Actions: Used for all action creators, where file names correspond to
}
} part of the app.
Reducers: Used for all reducers, where files name correspond to state
What is the difference between component and key.
container in React Redux? Store: Used for store initialization.
Component is a class or function component that describes the This structure works well for small and medium size apps.
presentational part of your application. What is redux-saga?
Container is an informal term for a component that is connected to a redux-saga is a library that aims to make side effects (asynchronous
Redux store. Containers subscribe to Redux state updates things like data fetching and impure things like accessing the browser
and dispatch actions, and they usually don't render DOM elements; cache) in React/Redux applications easier and better.
they delegate rendering to presentational child components. It is available in NPM:
What is the purpose of the constants in Redux? $ npm install --save redux-saga
Constants allows you to easily find all usages of that specific What is the mental model of redux-saga?
functionality across the project when you use an IDE. It also prevents Saga is like a separate thread in your application, that's solely
you from introducing silly bugs caused by typos – in which case, you responsible for side effects. redux-saga is a redux middleware, which
will get a ReferenceError immediately. means this thread can be started, paused and cancelled from the main
Normally we will save them in a single file application with normal Redux actions, it has access to the full Redux
(constants.js or actionTypes.js). application state and it can dispatch Redux actions as well.
export const ADD_TODO = 'ADD_TODO'
export const DELETE_TODO = 'DELETE_TODO' What are the differences
export const EDIT_TODO = 'EDIT_TODO'
export const COMPLETE_TODO = 'COMPLETE_TODO' between call() and put() in redux-saga?
export const COMPLETE_ALL = 'COMPLETE_ALL' Both call() and put() are effect creator functions. call() function is
export const CLEAR_COMPLETED = 'CLEAR_COMPLETED'
used to create effect description, which instructs middleware to call
In Redux you use them in two places:
the promise. put() function creates an effect, which instructs
During action creation:
middleware to dispatch an action to the store.
Let's take actions.js:
import { ADD_TODO } from './actionTypes'; Let's take example of how these effects work for fetching particular
user data.
export function addTodo(text) { function* fetchUserSaga(action) {
return { type: ADD_TODO, text } // `call` function accepts rest arguments, which will be passed to
} `api.fetchUser` function.
In reducers: // Instructing middleware to call promise, it resolved value will be
assigned to `userData` variable
Let's create reducer.js: const userData = yield call(api.fetchUser, action.userId)
import { ADD_TODO } from './actionTypes'
// Instructing middleware to dispatch corresponding action.
export default (state = [], action) => { yield put({
switch (action.type) { type: 'FETCH_USER_SUCCESS',
case ADD_TODO: userData
return [ })
...state, }
{
text: action.text, What is Redux Thunk?
completed: false
} Redux Thunk middleware allows you to write action creators that
]; return a function instead of an action. The thunk can be used to delay
default: the dispatch of an action, or to dispatch only if a certain condition is
return state
} met. The inner function receives the store
} methods dispatch() and getState() as parameters.
What are the different ways to What are the differences between redux-
write mapDispatchToProps()? saga and redux-thunk?
There are a few ways of binding action Both Redux Thunk and Redux Saga take care of dealing with side
creators to dispatch() in mapDispatchToProps(). Below are the possible effects. In most of the scenarios, Thunk uses Promises to deal with
options: them, whereas Saga uses Generators. Thunk is simple to use and
const mapDispatchToProps = (dispatch) => ({
action: () => dispatch(action())
Promises are familiar to many developers, Sagas/Generators are more
}) powerful but you will need to learn them. But both middleware can
const mapDispatchToProps = (dispatch) => ({ coexist, so you can start with Thunks and introduce Sagas when/if you
action: bindActionCreators(action, dispatch)
}) need them.
const mapDispatchToProps = { action }
What is Redux DevTools?
The third option is just a shorthand for the first one.
Redux DevTools is a live-editing time travel environment for Redux
What is the use of the ownProps parameter with hot reloading, action replay, and customizable UI. If you don't
in mapStateToProps() and mapDispatchToPro want to bother with installing Redux DevTools and integrating it into
your project, consider using Redux DevTools Extension for Chrome
ps()? and Firefox.
If the ownProps parameter is specified, React Redux will pass the props
that were passed to the component into your connect functions. So, if What are the features of Redux DevTools?
you use a connected component: Lets you inspect every state and action payload.
import ConnectedComponent from './containers/ConnectedComponent'; Lets you go back in time by cancelling actions.
If you change the reducer code, each staged action will be re-
<ConnectedComponent user={'john'} />
The ownProps inside evaluated.
your mapStateToProps() and mapDispatchToProps() functions will be an If the reducers throw, you will see during which action this happened,
object: and what the error was.
{ user: 'john' }
With persistState() store enhancer, you can persist debug sessions Press Command + Option + I to open the Chrome Developer tools, or
across page reloads. open it via View -> Developer -> Developer Tools.
What are Redux selectors and why to use them? You should now be able to debug as you normally would.
Selectors are functions that take Redux state as an argument and
return some data to pass to the component.
For example, to get user details from the state: React supported libraries & Integration
const getUserData = state => state.user.data
What is Redux Form?
Redux Form works with React and Redux to enable a form in React to What is reselect and how it works?
use Redux to store all of its state. Redux Form can be used with raw Reselect is a selector library (for Redux) which
HTML5 inputs, but it also works very well with common UI uses memoization concept. It was originally written to compute
frameworks like Material UI, React Widgets and React Bootstrap. derived data from Redux-like applications state, but it can't be tied to
any architecture or library.
What are the main features of Redux Form? Reselect keeps a copy of the last inputs/outputs of the last call, and
Field values persistence via Redux store. recomputes the result only if one of the inputs changes. If the the
Validation (sync/async) and submission. same inputs are provided twice in a row, Reselect returns the cached
Formatting, parsing and normalization of field values. output. It's memoization and cache are fully customizable.
How to add multiple middlewares to Redux? What is Flow?
You can use applyMiddleware(). Flow is a static type checker designed to find type errors in JavaScript.
For example, you can add redux-thunk and logger passing them as Flow types can express much more fine-grained distinctions than
arguments to applyMiddleware(): traditional type systems. For example, Flow helps you catch errors
import { createStore, applyMiddleware } from 'redux'
const createStoreWithMiddleware = applyMiddleware(ReduxThunk, involving null, unlike most type systems.
logger)(createStore)
What is the difference between Flow and
How to set initial state in Redux? PropTypes?
You need to pass initial state as second argument to createStore:
const rootReducer = combineReducers({ Flow is a static analysis tool (static checker) which uses a superset of
todos: todos, the language, allowing you to add type annotations to all of your code
visibilityFilter: visibilityFilter
})
and catch an entire class of bugs at compile time. PropTypes is a basic
type checker (runtime checker) which has been patched onto React. It
const initialState = { can't check anything other than the types of the props being passed to
todos: [{ id: 123, name: 'example', completed: false }]
} a given component. If you want more flexible typechecking for your
entire project Flow/TypeScript are appropriate choices.
const store = createStore(
rootReducer, How to use Font Awesome icons in React?
initialState The below steps followed to include Font Awesome in React:
)
Install font-awesome:
How Relay is different from Redux? $ npm install --save font-awesome
Relay is similar to Redux in that they both use a single store. The main Import font-awesome in your index.js file:
import 'font-awesome/css/font-awesome.min.css'
difference is that relay only manages state originated from the server,
and all access to the state is used via GraphQL queries (for reading Add Font Awesome classes in className:
render() {
data) and mutations (for changing data). Relay caches the data for you return <div><i className={'fa fa-spinner'} /></div>
and optimizes data fetching for you, by fetching only changed data }
and nothing more. What is React Dev Tools?
React Developer Tools let you inspect the component hierarchy,
including component props and state. It exists both as a browser
React Native extension (for Chrome and Firefox), and as a standalone app (works
with other environments including Safari, IE, and React Native).
The official extensions available for different browsers or
What is the difference between React Native and environments.
React? Chrome extension
React is a JavaScript library, supporting both front end web and being Firefox extension
run on the server, for building user interfaces and web applications. Standalone app (Safari, React Native, etc)
React Native is a mobile framework that compiles to native app Why is DevTools not loading in Chrome for local
components, allowing you to build native mobile applications (iOS, files?
Android, and Windows) in JavaScript that allows you to use React to If you opened a local HTML file in your browser (file://...) then you
build your components, and implements React under the hood. must first open Chrome Extensions and check Allow access to file
How to test React Native apps? URLs.
React Native can be tested only in mobile simulators like iOS and How to use Polymer in React?
Android. You can run the app in your mobile using expo app Create a Polymer element:
(https://expo.io) Where it syncs using QR code, your mobile and <link rel='import' href='../../bower_components/polymer/polymer.html'
computer should be in same wireless network. />
Polymer({
How to do logging in React Native? is: 'calender-element',
ready: function() {
You can use console.log, console.warn, etc. As of React Native v0.29 you this.textContent = 'I am a calender'
can simply run the following to see logs in the console: }
$ react-native log-ios })
$ react-native log-android Create the Polymer component HTML tag by importing it in a HTML
How to debug your React Native? document, e.g. import it in the index.html of your React application:
Follow the below steps to debug React Native app: <link rel='import' href='./src/polymer-components/calender-
element.html'>
Run your application in the iOS simulator. Use that element in the JSX file:
Press Command + D and a webpage should open up import React from 'react'
at http://localhost:8081/debugger-ui.
class MyComponent extends React.Component {
Enable Pause On Caught Exceptions for a better debugging render() {
experience. return (
<calender-element /> Relay is a JavaScript framework for providing a data layer and client-
)
} server communication to web applications using the React view layer.
}
How to use TypeScript in create-react-
export default MyComponent app application?
What are the advantages of React over Vue.js? When you create a new project supply --scripts-version option
React has the following advantages over Vue.js: as react-scripts-ts. react-scripts-ts is a set of adjustments to take the
Gives more flexibility in large apps developing. standard create-react-app project pipeline and bring TypeScript into
Easier to test. the mix.
Suitable for mobile apps creating. Now the project layout should look like the following:
More information and solutions available. my-app/
├─ .gitignore
What is the difference between React and ├─ images.d.ts
├─ node_modules/
Angular? ├─ public/
├─ src/
React Angular │ └─ ...
├─ package.json
├─ tsconfig.json
Angular is a framework ├─ tsconfig.prod.json
React is a library and ├─ tsconfig.test.json
and has complete MVC
has only the View layer └─ tslint.json
functionality
If the ref callback is defined as an inline function, it will get called Do I need to keep all my state into Redux? Should I
twice during updates, first with null and then again with the DOM ever use react internal state?
element. This is because a new instance of the function is created It is up to developer decision. i.e, It is developer job to determine
with each render, so React needs to clear the old ref and set up the what kinds of state make up your application, and where each piece
new one. of state should liveSome users prefer to keep every single piece of
class UserForm extends Component {
handleSubmit = () => { data in Redux, to maintain a fully serializable and controlled version
console.log("Input Value is: ", this.input.value) of their application at all times. Others prefer to keep non-critical or
}
UI state, such as “is this dropdown currently open”, inside a
component's internal state.
render () { Below are the thumb rules to determine what kind of data should be
return (
<form onSubmit={this.handleSubmit}> put into Redux
<input Do other parts of the application care about this data?
type='text'
ref={(input) => this.input = input} /> // Access DOM input in handle
Do you need to be able to create further derived data based on this
submit original data?
<button type='submit'>Submit</button> Is the same data being used to drive multiple components?
</form>
) Is there value to you in being able to restore this state to a given point
} in time (ie, time travel debugging)?
}
Do you want to cache the data (ie, use what's in state if it's already <li>Brandon</li>
</ul>
there instead of re-requesting it)? );
What is the purpose of registerServiceWorker in }
Strings and Numbers: You can also return string and number type
React? from the render method
React creates a service worker for you without any configuration by render() {
return 'Welcome to ReactJS questions';
default. The service worker is a web API that helps you cache your }
assets and other files so that when the user is offline or on slow // Number
network, he/she can still see results on the screen, as such, it helps render() {
return 2018;
you build a better user experience, that's what you should know }
about service worker's for now. It's all about adding offline
capabilities to your site.
How to use class field declarations syntax in React
import React from 'react'; classes?
import ReactDOM from 'react-dom';
import App from './App'; React Class Components can be made much more concise using the
import registerServiceWorker from './registerServiceWorker'; class field declarations. You can initialize local state without using the
constructor and declare class methods by using arrow functions
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker(); without the extra need to bind them. Let's take a counter example to
What is React memo function? demonstrate class field declarations for state without using
constructor and methods without binding,
Class components can be restricted from rendering when their input class Counter extends Component {
props are the same using PureComponent or state = { value: 0 };
shouldComponentUpdate. Now you can do the same with function
handleIncrement = () => {
components by wrapping them in React.memo. this.setState(prevState => ({
const MyComponent = React.memo(function MyComponent(props) { value: prevState.value + 1
/* only rerenders if props change */ }));
}); };
What is React lazy function? handleDecrement = () => {
The React.lazy function lets you render an dynamic import as a this.setState(prevState => ({
value: prevState.value - 1
regular component. It will automatically load the bundle containing }));
the OtherComponent when the component gets rendered. This must };
return a Promise which resolves to a module with a default export
render() {
containing a React component. return (
const OtherComponent = React.lazy(() => import('./OtherComponent')); <div>
{this.state.value}
function MyComponent() {
return ( <button onClick={this.handleIncrement}>+</button>
<div> <button onClick={this.handleDecrement}>-</button>
<OtherComponent /> </div>
</div> )
); }
} }
Note: React.lazy and Suspense is not yet available for server-side
rendering. If you want to do code-splitting in a server rendered app,
What are hooks?
Hooks are a new feature proposal that lets you use state and other
we still recommend React Loadable.
React features without writing a class. Let's see an example of
How to prevent unnecessary updates using useState hook example,
setState? import { useState } from 'react';
You can compare current value of the state with an existing state function Example() {
value and decide whether to rerender the page or not. If the values // Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
are same then you need to return null to stop rerendering otherwise
return the latest state value. For example, the user profile return (
<div>
information is conditionally rendered as follows, <p>You clicked {count} times</p>
getUserProfile = user => { <button onClick={() => setCount(count + 1)}>
const latestAddress = user.address; Click me
this.setState(state => { </button>
if (state.address === latestAddress) { </div>
return null; );
} else { }
return { title: latestAddress };
} What are the rules needs to follow for hooks?
});
}; You need to follow two rules inorder to use hooks
Call Hooks only at the top level of your react functions. i.e, You
How do you render Array, Strings and Numbers in shouldn’t call Hooks inside loops, conditions, or nested functions. This
React 16 Version? will ensure that Hooks are called in the same order each time a
Arrays: Unlike older releases, you don't need to make component renders and it preserves the state of Hooks between
sure render method return a single element in React16. You are able multiple useState and useEffect calls.
to return multiple sibling elements without a wrapping element by Call Hooks from React Functions only. i.e, You shouldn’t call Hooks
returning an array. For example, let us take the below list of from regular JavaScript functions.
developers, How to ensure hooks followed the rules in your
const ReactJSDevs = () => {
return [
<li key="1">John</li>,
project?
<li key="2">Jackie</li>, React team released an ESLint plugin called eslint-plugin-react-
<li key="3">Jordan</li> hooks that enforces these two rules. You can add this plugin to your
];
} project using the below command,
npm install eslint-plugin-react-hooks@next
You can also merge this array of items in another array component
const JSDevs = () => { And apply the below config in your ESLint config file,
return ( // Your ESLint configuration
<ul> {
<li>Brad</li> "plugins": [
<li>Brodge</li> // ...
<ReactJSDevs/> "react-hooks"
],
"rules": {
// ... render() {
"react-hooks/rules-of-hooks": "error" if (this.state.error) {
} return <h1>Caught an error.</h1>
} }
Note: This plugin is intended to use in Create React App by default. return <div onClick={this.handleClick}>Click Me</div>
}
What are the differences between Flux and Redux? }
Below are the major differences between Flux and Redux The above code is catching the error using vanilla javascript try/catch
block instead of error boundaries.
Flux Redux What is the difference between try catch block and
State is mutable State is immutable
error boundaries?
Try catch block works with imperative code whereas error boundaries
The Store contains are meant for declarative code to render on the screen. For example,
The Store and change the try catch block used for below imperative code
both state and change
logic are separate try {
logic showButton();
} catch (error) {
There are multiple There is only one store // ...
}
stores exist exist
Whereas error boundaries wrap declarative code as below,
<ErrorBoundary>
All the stores are Single store with <MyComponent />
disconnected and flat hierarchical reducers </ErrorBoundary>
So if an error occurs in a componentDidUpdate method caused by
It has a singleton There is no concept of a setState somewhere deep in the tree, it will still correctly propagate
dispatcher dispatcher to the closest error boundary.
What is the behavior of uncaught errors in react
React components Container components
subscribe to the store uses connect function 16?
In React 16, errors that were not caught by any error boundary will
What are the benefits of React Router V4? result in unmounting of the whole React component tree. The reason
Below are the main benefits of React Router V4 module, behind this decision is that it is worse to leave corrupted UI in place
In React Router v4(version 4), the API is completely about than to completely remove it. For example, it is worse for a payments
components. A router can be visualized as a single component() which app to display a wrong amount than to render nothing.
wraps specific child router components(). What is the proper placement for error
You don't need to manually set history. The router module will take
care history by wrapping routes with component.
boundaries?
The granularity of error boundaries usage is up to the developer
The application size is reduced by adding only the specific router
based on project needs. You can follow either of these approaches,
module(Web, core, or native)
You can wrap top-level route components to display a generic error
Can you describe about componentDidCatch message for the entire application.
lifecycle method signature? You can also wrap individual components in an error boundary to
The componentDidCatch lifecycle method is invoked after an error protect them from crashing the rest of the application.
has been thrown by a descendant component. The method receives What is the benefit of component stack trace from
two parameters,
error: - The error object which was thrown
error boundary?
Apart from error messages and javascript stack, React16 will display
info: - An object with a componentStack key contains the information
the component stack trace with file names and line numbers using
about which component threw the error.
error boundary concept. For example, BuggyCounter component
The method structure would be as follows
componentDidCatch(error, info) displays the component stack trace as below,
In which scenarios error boundaries do not catch
errors?
Below are the cases in which error boundaries doesn't work
Inside Event handlers
Asynchronous code using setTimeout or What is the required method to be defined for a
requestAnimationFrame callbacks class component?
During Server side rendering
The render() method is the only required method in a class
When errors thrown in the error boundary code itself
component. i.e, All methods other than render method are optional
Why do not you need error boundaries for event for a class component.
handlers? What are the possible return types of render
Error boundaries do not catch errors inside event handlers. Event method?
handlers don't happened or invoked during rendering time unlike
Below are the list of following types used and return from render
render method or lifecycle methods. So React knows how to recover
method,
these kind of errors in event handlers. If still you need to catch an
React elements: Elements that instruct React to render a DOM node.
error inside event handler, use the regular JavaScript try / catch
It includes html elements such as
statement as below
class MyComponent extends React.Component { and user defined elements.
constructor(props) { Arrays and fragments: Return multiple elements to render as Arrays
super(props); and Fragments to wrap multiple elements
this.state = { error: null };
} Portals: Render children into a different DOM subtree.
String and numbers: Render both Strings and Numbers as text nodes
handleClick = () => {
try {
in the DOM
// Do something that could throw Booleans or null: Doesn't render anything but these types are used to
} catch (error) { conditionally render content.
this.setState({ error });
} What is the main purpose of constructor?
}
The constructor is mainly used for two purposes, static getDerivedStateFromError()
To initialize local state by assigning object to this.state componentDidCatch()
For binding event handler methods to the instatnce For example, the What is the purpose of displayName class
below code covers both the above casess,
constructor(props) { property?
super(props); The displayName string is used in debugging messages. Usually, you
// Don't call this.setState() here!
this.state = { counter: 0 }; don’t need to set it explicitly because it’s inferred from the name of
this.handleClick = this.handleClick.bind(this); the function or class that defines the component. You might want to
}
set it explicitly if you want to display a different name for debugging
Is it mandatory to define constructor for React purposes or when you create a higher-order component. For example,
component? To ease debugging, choose a display name that communicates that it’s
No, it is not mandatory. i.e, If you don’t initialize state and you don’t the result of a withSubscription HOC.
function withSubscription(WrappedComponent) {
bind methods, you don’t need to implement a constructor for your class WithSubscription extends React.Component {/* ... */}
React component. WithSubscription.displayName =
`WithSubscription(${getDisplayName(WrappedComponent)})`;
What are default props? return WithSubscription;
}
The defaultProps are defined as a property on the component class to function getDisplayName(WrappedComponent) {
set the default props for the class. This is used for undefined props, return WrappedComponent.displayName || WrappedComponent.name ||
but not for null props. For example, let us create color default prop 'Component';
}
for the button component,
class MyButton extends React.Component { What is the browser support for react
// ...
} applications?
MyButton.defaultProps = {
React supports all popular browsers, including Internet Explorer 9 and
color: 'red' above, although some polyfills are required for older browsers such as
}; IE 9 and IE 10. If you use es5-shim and es5-sham polyfill then it even
If props.color is not provided then it will set the default value to 'red'. support old browsers that doesn't support ES5 methods.
i.e, Whenever you try to access the color prop it uses default value
render() { What is the purpose of
return <MyButton /> ; // props.color will be set to red
}
unmountComponentAtNode method?
Note: If you provide null value then it remains null value. This method is available from react-dom package and it removes a
mounted React component from the DOM and clean up its event
Why should not call setState in handlers and state. If no component was mounted in the container,
componentWillUnmount? calling this function does nothing. Returns true if a component was
You should not call setState() in componentWillUnmount() because unmounted and false if there was no component to unmount. The
Once a component instance is unmounted, it will never be mounted method signature would be as follows,
again. ReactDOM.unmountComponentAtNode(container)
// ...
What is diffing algorithm?
} React needs to use algorithms to find out how to efficiently update
export default logProps(FancyButton); the UI to match the most recent tree. The diffing algorithms is
Now lets create a ref and pass it to FancyButton component. In this generating the minimum number of operations to transform one tree
case, you can set focus to button element. into another. However, the algorithms have a complexity in the order
import FancyButton from './FancyButton';
of O(n3) where n is the number of elements in the tree. In this case,
const ref = React.createRef(); for displaying 1000 elements would require in the order of one billion
ref.current.focus(); comparisons. This is far too expensive. Instead, React implements a
<FancyButton
label="Click Me" heuristic O(n) algorithm based on two assumptions:
handleClick={handleClick} Two elements of different types will produce different trees.
ref={ref}
/>;
The developer can hint at which child elements may be stable across
different renders with a key prop.
Is it ref argument available for all functions or class
What are the rules covered by diffing algorithm?
components? When diffing two trees, React first compares the two root elements.
The behavior is different depending on the types of the root
elements. It covers the below rules during reconsilation algorithm,
Elements Of Different Types: Whenever the root elements have If you create a function inside a render method, it negates the
different types, React will tear down the old tree and build the new purpose of pure component. Because the shallow prop comparison
will always return false for new props, and each render in this case
will generate a new value for the render prop. You can solve this issue
tree from scratch. For example, elements to , or from to of by defining the render function as instance method.
different types lead a full rebuild.
DOM Elements Of The Same Type: When comparing two React DOM How do you create HOC using render props?
elements of the same type, React looks at the attributes of both, You can implement most higher-order components (HOC) using a
keeps the same underlying DOM node, and only updates the changed regular component with a render prop. For example, if you would
attributes. Lets take an example with same DOM eleemnts except prefer to have a withMouse HOC instead of a component, you could
className attribute, easily create one using a regular with a render prop.
function withMouse(Component) {
<div className="show" title="ReactJS" />
return class extends React.Component {
render() {
<div className="hide" title="ReactJS" />
return (
Component Elements Of The Same Type: When a component updates, <Mouse render={mouse => (
the instance stays the same, so that state is maintained across <Component {...this.props} mouse={mouse} />
)}/>
renders. React updates the props of the underlying component );
instance to match the new element, and calls }
componentWillReceiveProps() and componentWillUpdate() on the }
}
underlying instance. After that, the render() method is called and the
This way render props gives the flexibility of using either pattern.
diff algorithm recurses on the previous result and the new result.
Recursing On Children: when recursing on the children of a DOM What is windowing technique?
node, React just iterates over both lists of children at the same time Windowing is a technique that only renders a small subset of your
and generates a mutation whenever there’s a difference. For rows at any given time, and can dramatically reduce the time it takes
example, when adding an element at the end of the children, to re-render the components as well as the number of DOM nodes
converting between these two trees works well. created. If your application renders long lists of data then this
<ul> technique is recommended. Both react-window and react-virtualized
<li>first</li>
<li>second</li>
are popular windowing libraries which provides several reusable
</ul> components for displaying lists, grids, and tabular data.
<ul> How do you print falsy values in JSX?
<li>first</li> The falsy values such as false, null, undefined, and true are valid
<li>second</li>
<li>third</li>
children but they don't render anything. If you still want to display
</ul> them then you need to convert it to string. Let's take an example on
Handling keys: React supports a key attribute. When children have how to convert to a string,
keys, React uses the key to match children in the original tree with <div>
My JavaScript variable is {String(myVariable)}.
children in the subsequent tree. For example, adding a key can make </div>
the tree conversion efficient,
<ul>
What is the typical use case of portals?
<li key="2015">Duke</li> React portals are very useful when a parent component has overflow:
<li key="2016">Villanova</li>
</ul>
hidden or has properties that affect the stacking context(z-
index,position,opacity etc styles) and you need to visually “break out”
<ul> of its container. For example, dialogs, global message notifications,
<li key="2014">Connecticut</li>
<li key="2015">Duke</li> hovercards, and tooltips.
<li key="2016">Villanova</li>
</ul>
How do you set default value for uncontrolled
When do you need to use refs? component?
There are few use cases to go for refs In React, the value attribute on form elements will override the value
Managing focus, text selection, or media playback. in the DOM. With an uncontrolled component, you might want React
Triggering imperative animations. to specify the initial value, but leave subsequent updates
Integrating with third-party DOM libraries. uncontrolled. To handle this case, you can specify
a defaultValue attribute instead of value.
Is it prop must be named as render for render render() {
return (
props? <form onSubmit={this.handleSubmit}>
Even though the pattern named render props, you don’t have to use a <label>
User Name:
prop named render to use this pattern. i.e, Any prop that is a function <input
that a component uses to know what to render is technically a defaultValue="John"
“render prop”. Lets take an example with the children prop for render type="text"
ref={this.input} />
props, </label>
<Mouse children={mouse => ( <input type="submit" value="Submit" />
<p>The mouse position is {mouse.x}, {mouse.y}</p> </form>
)}/> );
Actually children prop doesn’t need to be named in the list of }
“attributes” in JSX element. Instead, you can keep it directly inside The same applies for select and textArea inputs. But you need to
element, use defaultChecked for checkbox and radio inputs.
<Mouse>
{mouse => (
What is your favorite React stack?
<p>The mouse position is {mouse.x}, {mouse.y}</p> Even though the tech stack varies from developer to developer, the
)}
</Mouse>
most popular stack is used in react boilerplate project code. It mainly
While using this above technique(without any name), explicitly state uses Redux and redux-saga for state management and asynchronous
that children should be a function in your propTypes. side-effects, react-router for routing purpose, styled-components for
Mouse.propTypes = { styling react components, axios for invoking REST api, and other
children: PropTypes.func.isRequired supported stack such as webpack, reselect, ESNext, Babel. You can
};
clone the project https://github.com/react-boilerplate/react-
What are the problems of using render props with boilerplate and start working on any new react project.
pure components? What is the difference between Real DOM and
Virtual DOM?
Below are the main differences between Real DOM and Virtual DOM,
Real DOM Virtual DOM
Creates a new
It updates the JSX if
DOM if element
element update
updates
How to add a bootstrap for a react application?
Bootstrap can be added to your React app in a three possible ways
Using the Bootstrap CDN: This is the easiest way to add bootstrap.
Add both bootstrap CSS and JS resources in a head tag.
Bootstrap as Dependency: If you are using a build tool or a module
bundler such as Webpack, then this is the preferred option for adding
Bootstrap to your React application
npm install bootstrap
``
React Bootstrap Package: In this case, you can add Bootstrap to our
React app is by using a package that has rebuilt Bootstrap
components to work particularly as React components. Below
packages are popular in this category,
react-bootstrap
reactstrap
Can you list down top websites or applications
using react as front end framework?
Below are the top 10 websites using React as their front-end
framework,
Facebook
Uber
Instagram
WhatsApp
Khan Academy
Airbnb
Dropbox
Flipboard
Netflix
PayPal
Is it recommended to use CSS In JS technique in
React?
React does not have any opinion about how styles are defined but if
you are a beginner then good starting point is to define your styles in
a separate *.css file as usual and refer to them using className. This
functionality is not part of React but came from third-party libraries.
But If you want to try a different approach(CSS-In-JS) then styled-
components library is a good option.