Why fragments are better than container divs?
Below are the list of reasons to prefer fragments over container DOM elements,
- Fragments are a bit faster and use less memory by not creating an extra DOM node. This only has a real benefit on very large and deep trees.
- Some CSS mechanisms like Flexbox and CSS Grid have a special parent-child relationships, and adding divs in the middle makes it hard to keep the desired layout.
- The DOM Inspector is less cluttered.
What are portals in React?
Portal is a recommended way to render children into a DOM node that exists outside the DOM hierarchy of the parent component.
ReactDOM.createPortal(child, container);
- The first argument is any render-able React child, such as an element, string, or fragment. The second argument is a DOM element.
What are stateless components?
If the behaviour of a component is independent of its state then it can be a stateless component. You can use either a function or a class for creating stateless components. But unless you need to use a lifecycle hook in your components, you should go for function components. There are a lot of benefits if you decide to use function components here; they are easy to write, understand, and test, a little faster, and you can avoid the this keyword altogether.
What are stateful components?
If the behaviour of a component is dependent on the state of the component then it can be termed as stateful component. These stateful components are either function components with hooks or class components.
Let’s take an example of function stateful component which update the state based on click event,
import React, {useState} from ‘react’; const App = (props) => {const [count, setCount] = useState(0);handleIncrement() { setCount(count+1);} return ( <> <button onClick={handleIncrement}>Increment</button> <span>Counter: {count}</span> </> )}
How to apply validation on props in React?
When the application is running in development mode, React will automatically check all props that we set on components to make sure they have correct type. If the type is incorrect, React will generate warning messages in the console. It’s disabled in production mode due to performance impact. The mandatory props are defined with isRequired.
The set of predefined prop types:
- PropTypes.number
- PropTypes.string
- PropTypes.array
- PropTypes.object
- PropTypes.func
- PropTypes.node
- PropTypes.element
- PropTypes.bool
- PropTypes.symbol
- PropTypes.any
We can define propTypes for User component as below:
import React from “react”;import PropTypes from “prop-types”; class User extends React.Component { static propTypes = { name: PropTypes.string.isRequired, age: PropTypes.number.isRequired, }; render() { return ( <> <h1>{`Welcome, ${this.props.name}`}</h1> <h2>{`Age, ${this.props.age}`}</h2> </> ); }}
Note: In React v15.5 PropTypes were moved from React.PropTypes to prop-types library.
The Equivalent Functional Component
import React from “react”;import PropTypes from “prop-types”; function User({ name, age }) { return ( <> <h1>{`Welcome, ${name}`}</h1> <h2>{`Age, ${age}`}</h2> </> );} User.propTypes = { name: PropTypes.string.isRequired, age: PropTypes.number.isRequired,};
What are the advantages of React?
Below are the list of main advantages of React,
- Increases the application’s performance with Virtual DOM.
- JSX makes code easy to read and write.
- It renders both on client and server side (SSR).
- Easy to integrate with frameworks (Angular, Backbone) since it is only a view library.
- Easy to write unit and integration tests with tools such as Jest.
What are the limitations of React?
Apart from the advantages, there are few limitations of React too,
- React is just a view library, not a full framework.
- There is a learning curve for beginners who are new to web development.
- Integrating React into a traditional MVC framework requires some additional configuration.
- The code complexity increases with inline templating and JSX.
- Too many smaller components leading to over engineering or boilerplate.
What are error boundaries in React v16?
Error boundaries are components that catch JavaScript errors anywhere in their child component tree, log those errors, and display a fallback UI instead of the component tree that crashed.
A class component becomes an error boundary if it defines a new lifecycle method called componentDidCatch(error, info) or static getDerivedStateFromError() :
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
componentDidCatch(error, info) {
// You can also log the error to an error reporting service
logErrorToMyService(error, info);
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return <h1>{“Something went wrong.”}</h1>;
}
return this.props.children;
}}
After that use it as a regular component:
<ErrorBoundary> <MyWidget /></ErrorBoundary>
How are error boundaries handled in React v15?
React v15 provided very basic support for error boundaries using unstable_handleError method. It has been renamed to componentDidCatch in React v16.
What are the recommended ways for static type checking?
Normally we use PropTypes library (React.PropTypes moved to a prop-types package since React v15.5) for type checking in the React applications. For large code bases, it is recommended to use static type checkers such as Flow or TypeScript, that perform type checking at compile time and provide auto-completion features.
What is the use of react-dom package?
The react-dom package provides DOM-specific methods that can be used at the top level of your app. Most of the components are not required to use this module. Some of the methods of this package are:
- render()
- hydrate()
- unmountComponentAtNode()
- findDOMNode()
- createPortal()
What is the purpose of render method of react-dom?
This method is used to render a React element into the DOM in the supplied container and return a reference to the component. If the React element was previously rendered into container, it will perform an update on it and only mutate the DOM as necessary to reflect the latest changes.
ReactDOM.render(element, container, [callback])
- If the optional callback is provided, it will be executed after the component is rendered or updated.
What is ReactDOMServer?
The ReactDOMServer object enables you to render components to static markup (typically used on node server). This object is mainly used for server-side rendering (SSR). The following methods can be used in both the server and browser environments:
- renderToString()
- renderToStaticMarkup()
For example, you generally run a Node-based web server like Express, Hapi, or Koa, and you call renderToString to render your root component to a string, which you then send as response.
// using Expressimport { renderToString } from “react-dom/server”;import MyPage from “./MyPage”; app.get(“/”, (req, res) => { res.write( “<!DOCTYPE html><html><head><title>My Page</title></head><body>” ); res.write(‘<div id=”content”>’); res.write(renderToString(<MyPage />)); res.write(“</div></body></html>”); res.end();});
How to use innerHTML in React?
The dangerouslySetInnerHTML attribute is React’s replacement for using innerHTML in the browser DOM. Just like innerHTML, it is risky to use this attribute considering cross-site scripting (XSS) attacks. You just need to pass a __html object as key and HTML text as value.
In this example MyComponent uses dangerouslySetInnerHTML attribute for setting HTML markup:
function createMarkup() { return { __html: “First · Second” };} function MyComponent() { return <div dangerouslySetInnerHTML={createMarkup()} />;}
How to use styles in React?
The style attribute accepts a JavaScript object with camelCased properties rather than a CSS string. This is consistent with the DOM style JavaScript property, is more efficient, and prevents XSS security holes.
const divStyle = { color: “blue”, backgroundImage: “url(” + imgUrl + “)”,}; function HelloWorldComponent() { return <div style={divStyle}>Hello World!</div>;}
- Style keys are camelCased in order to be consistent with accessing the properties on DOM nodes in JavaScript (e.g. node.style.backgroundImage).
How events are different in React?
Handling events in React elements has some syntactic differences:
- React event handlers are named using camelCase, rather than lowercase.
- With JSX you pass a function as the event handler, rather than a string.
What will happen if you use setState() in constructor?
When you use setState(), then apart from assigning to the object state React also re-renders the component and all its children. You would get error like this: Can only update a mounted or mounting component. So we need to use this.state to initialize variables inside constructor.
What is the impact of indexes as keys?
Keys should be stable, predictable, and unique so that React can keep track of elements.
In the below code snippet each element’s key will be based on ordering, rather than tied to the data that is being represented. This limits the optimizations that React can do.
{ todos.map((todo, index) => <Todo {…todo} key={index} />);}
If you use element data for unique key, assuming todo.id is unique to this list and stable, React would be able to reorder elements without needing to reevaluate them as much.
{ todos.map((todo) => <Todo {…todo} key={todo.id} />);}
Is it good to use setState() in componentWillMount() method?
Yes, it is safe to use setState() inside componentWillMount() method. But at the same it is recommended to avoid async initialization in componentWillMount() lifecycle method. componentWillMount() is invoked immediately before mounting occurs. It is called before render(), therefore setting state in this method will not trigger a re-render. Avoid introducing any side-effects or subscriptions in this method. We need to make sure async calls for component initialization happened in componentDidMount() instead of componentWillMount().
componentDidMount() { axios.get(`api/todos`) .then((result) => { this.setState({ messages: […result.data] }) })}
What will happen if you use props in initial state?
If the props on the component are changed without the component being refreshed, the new prop value will never be displayed because the constructor function will never update the current state of the component. The initialization of state from props only runs when the component is first created.
The below component won’t display the updated input value:
class MyComponent extends React.Component { constructor(props) { super(props); this.state = { records: [], inputValue: this.props.inputValue, }; } render() { return <div>{this.state.inputValue}</div>; }}
Using props inside render method will update the value:
class MyComponent extends React.Component { constructor(props) { super(props); this.state = { record: [], }; } render() { return <div>{this.props.inputValue}</div>; }}
How do you conditionally render components?
In some cases you want to render different components depending on some state. JSX does not render false or undefined, so you can use conditional short-circuiting to render a given part of your component only if a certain condition is true.
const MyComponent = ({ name, address }) => ( <div> <h2>{name}</h2> {address && <p>{address}</p>} </div>);
If you need an if-else condition then use ternary operator.
const MyComponent = ({ name, address }) => ( <div> <h2>{name}</h2> {address ? <p>{address}</p> : <p>{“Address is not available”}</p>} </div>);
Why we need to be careful when spreading props on DOM elements?
When we spread props we run into the risk of adding unknown HTML attributes, which is a bad practice. Instead we can use prop destructuring with …rest operator, so it will add only required props.
For example,
const ComponentA = () => ( <ComponentB isDisplay={true} className={“componentStyle”} />); const ComponentB = ({ isDisplay, …domProps }) => ( <div {…domProps}>{“ComponentB”}</div>);
How you use decorators in React?
You can decorate your class components, which is the same as passing the component into a function. Decorators are flexible and readable way of modifying component functionality.
@setTitle(“Profile”)class Profile extends React.Component { //….} /* title is a string that will be set as a document title WrappedComponent is what our decorator will receive when put directly above a component class as seen in the example above*/const setTitle = (title) => (WrappedComponent) => { return class extends React.Component { componentDidMount() { document.title = title; } render() { return <WrappedComponent {…this.props} />; } };};
- Note: Decorators are a feature that didn’t make it into ES7, but are currently a stage 2 proposal.
How do you memoize a component?
There are memoize libraries available which can be used on function components.
For example moize library can memoize the component in another component.
import moize from “moize”;import Component from “./components/Component”; // this module exports a non-memoized component const MemoizedFoo = moize.react(Component); const Consumer = () => { <div> {“I will memoize the following entry:”} <MemoizedFoo /> </div>;};
Update: Since React v16.6.0, we have a React.memo. It provides a higher order component which memoizes component unless the props change. To use it, simply wrap the component using React.memo before you use it.
const MemoComponent = React.memo(function MemoComponent(props) { /* render using props */});OR;export default React.memo(MyFunctionComponent);
How you implement Server Side Rendering or SSR?
React is already equipped to handle rendering on Node servers. A special version of the DOM renderer is available, which follows the same pattern as on the client side.
import ReactDOMServer from “react-dom/server”;import App from “./App”; ReactDOMServer.renderToString(<App />);
- This method will output the regular HTML as a string, which can be then placed inside a page body as part of the server response. On the client side, React detects the pre-rendered content and seamlessly picks up where it left off.
How to enable production mode in React?
You should use Webpack’s DefinePlugin method to set NODE_ENV to production, by which it strip out things like propType validation and extra warnings. Apart from this, if you minify the code, for example, Uglify’s dead-code elimination to strip out development only code and comments, it will drastically reduce the size of your bundle.
What is CRA and its benefits?
The create-react-app CLI tool allows you to quickly create & run React applications with no configuration step.
Let’s create Todo App using CRA:
# Installation$ npm install -g create-react-app # Create new project$ create-react-app todo-app$ cd todo-app # Build, test and run$ npm run build$ npm run test$ npm start
- It includes everything we need to build a React app:
- React, JSX, ES6, and Flow syntax support.
- Language extras beyond ES6 like the object spread operator.
- Autoprefixed CSS, so you don’t need -webkit- or other prefixes.
- A fast interactive unit test runner with built-in support for coverage reporting.
- A live development server that warns about common mistakes.
- A build script to bundle JS, CSS, and images for production, with hashes and sourcemaps.
What is the lifecycle methods order in mounting?
The lifecycle methods are called in the following order when an instance of a component is being created and inserted into the DOM.
- constructor()
- static getDerivedStateFromProps()
- render()
- componentDidMount()
What are the lifecycle methods going to be deprecated in React v16?
The following lifecycle methods going to be unsafe coding practices and will be more problematic with async rendering.
- componentWillMount()
- componentWillReceiveProps()
- componentWillUpdate()
Starting with React v16.3 these methods are aliased with UNSAFE_ prefix, and the unprefixed version will be removed in React v17.
What is the purpose of getDerivedStateFromProps() lifecycle method?
The new static getDerivedStateFromProps() lifecycle method is invoked after a component is instantiated as well as before it is re-rendered. It can return an object to update state, or null to indicate that the new props do not require any state updates.
class MyComponent extends React.Component { static getDerivedStateFromProps(props, state) { // … }}
- This lifecycle method along with componentDidUpdate() covers all the use cases of componentWillReceiveProps().
What is the purpose of getSnapshotBeforeUpdate() lifecycle method?
The new getSnapshotBeforeUpdate() lifecycle method is called right before DOM updates. The return value from this method will be passed as the third parameter to componentDidUpdate().
class MyComponent extends React.Component { getSnapshotBeforeUpdate(prevProps, prevState) { // … }}
- This lifecycle method along with componentDidUpdate() covers all the use cases of componentWillUpdate().
Do Hooks replace render props and higher order components?
Both render props and higher-order components render only a single child but in most of the cases Hooks are a simpler way to serve this by reducing nesting in your tree.
What is the recommended way for naming components?
It is recommended to name the component by reference instead of using displayName.
Using displayName for naming component:
export default React.createClass({ displayName: “TodoApp”, // …});
The recommended approach:
export default class TodoApp extends React.Component { // …}
also
const TodoApp = () => { //…};export default TodoApp;
What is the recommended ordering of methods in component class?
Recommended ordering of methods from mounting to render stage:
- static methods
- constructor()
- getChildContext()
- componentWillMount()
- componentDidMount()
- componentWillReceiveProps()
- shouldComponentUpdate()
- componentWillUpdate()
- componentDidUpdate()
- componentWillUnmount()
- click handlers or event handlers like onClickSubmit() or onChangeDescription()
- getter methods for render like getSelectReason() or getFooterContent()
- optional render methods like renderNavigation() or renderProfilePicture()
- render()
What is a switching component?
A switching component is a component that renders one of many components. We need to use object to map prop values to components.
For example, a switching component to display different pages based on page prop:
import HomePage from “./HomePage”;import AboutPage from “./AboutPage”;import ServicesPage from “./ServicesPage”;import ContactPage from “./ContactPage”; const PAGES = { home: HomePage, about: AboutPage, services: ServicesPage, contact: ContactPage,}; const Page = (props) => { const Handler = PAGES[props.page] || ContactPage; return <Handler {…props} />;}; // The keys of the PAGES object can be used in the prop types to catch dev-time errors.Page.propTypes = { page: PropTypes.oneOf(Object.keys(PAGES)).isRequired,};
Why we need to pass a function to setState()?
The reason behind for this is that setState() is an asynchronous operation. React batches state changes for performance reasons, so the state may not change immediately after setState() is called. That means you should not rely on the current state when 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 the old state value on access due to the asynchronous nature of setState().
Let’s say the initial count value is zero. After three consecutive increment operations, the value is going to be incremented only by one.
// assuming this.state.count === 0this.setState({ count: this.state.count + 1 });this.setState({ count: this.state.count + 1 });this.setState({ count: this.state.count + 1 });// this.state.count === 1, not 3
If we pass a function to setState(), the count gets incremented correctly.
this.setState((prevState, props) => ({ count: prevState.count + props.increment,}));// this.state.count === 3 as expected
(OR)
Why function is preferred over object for setState()?
React may batch multiple setState() calls into a single update for performance. Because this.props and this.state may be updated asynchronously, you should not rely on their values for calculating the next state.
This counter example will fail to update as expected:
// Wrongthis.setState({ counter: this.state.counter + this.props.increment,});
The preferred approach is to call setState() with function rather than object. That function will receive the previous state as the first argument, and the props at the time the update is applied as the second argument.
// Correctthis.setState((prevState, props) => ({ counter: prevState.counter + props.increment,}));
What are React Mixins?
Mixins are a way to totally separate components to have a common functionality. Mixins should not be used and can be replaced with higher-order components or decorators.
One of the most commonly used mixins is PureRenderMixin. You might be using it in some components to prevent unnecessary re-renders when the props and state are shallowly equal to the previous props and state:
const PureRenderMixin = require(“react-addons-pure-render-mixin”); const Button = React.createClass({ mixins: [PureRenderMixin], // …});
Why is isMounted() an anti-pattern and what is the proper solution?
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()) { this.setState({…})}
- Checking isMounted() before calling setState() does eliminate the warning, but it also defeats the purpose of the warning. Using isMounted() is a code smell because the only reason you would check is because you think you might be holding a reference after the component has unmounted.
An optimal solution would be to find places where setState() might be called after a component has unmounted, and fix them. Such situations most commonly occur due to callbacks, when a component is waiting for some data and gets unmounted before the data arrives. Ideally, any callbacks should be canceled in componentWillUnmount(), prior to unmounting.
What are the Pointer Events supported in React?
Pointer Events provide a unified way of handling all input events. In the old days we had a mouse and respective event listeners to handle them but nowadays we have many devices which don’t correlate to having a mouse, like phones with touch surface or pens. We need to remember that these events will only work in browsers that support the Pointer Events specification.
The following event types are now available in React DOM:
- onPointerDown
- onPointerMove
- onPointerUp
- onPointerCancel
- onGotPointerCapture
- onLostPointerCapture
- onPointerEnter
- onPointerLeave
- onPointerOver
- onPointerOut
Why should component names start with capital letter?
If you are rendering your component using JSX, the name of that component has to begin with a capital letter otherwise React will throw an error as an unrecognized tag. This convention is because only HTML elements and SVG tags can begin with a lowercase letter.
class SomeComponent extends Component { // Code goes here}
You can define component class which name starts with lowercase letter, but when it’s imported it should have capital letter. Here lowercase is fine:
class myComponent extends Component { render() { return <div />; }} export default myComponent;
While when imported in another file it should start with capital letter:
import MyComponent from “./myComponent”;
What are the exceptions on React component naming?
The component names should start with an uppercase letter but there are few exceptions to this convention. The lowercase tag names with a dot (property accessors) are still considered as valid component names. For example, the below tag can be compiled to a valid component,
render() { return ( <obj.component/> // `React.createElement(obj.component)` ) }
Are custom DOM attributes supported in React v16?
Yes. In the past, React used to ignore unknown DOM attributes. If you wrote JSX with an attribute that React doesn’t recognize, React would just skip it.
For example, let’s take a look at the below attribute:
<div mycustomattribute={“something”} />
Would render an empty div to the DOM with React v15:
<div />
In React v16 any unknown attributes will end up in the DOM:
<div mycustomattribute=”something” />
- This is useful for supplying browser-specific non-standard attributes, trying new DOM APIs, and integrating with opinionated third-party libraries.
What is the difference between constructor and getInitialState?
You should initialize state in the constructor when using ES6 classes, and getInitialState() method when using React.createClass().
Using ES6 classes:
class MyComponent extends React.Component { constructor(props) { super(props); this.state = { /* initial state */ }; }}
Using React.createClass():
const MyComponent = React.createClass({ getInitialState() { return { /* initial state */ }; },});
- Note: React.createClass() is deprecated and removed in React v16. Use plain JavaScript classes instead.
Can you force a component to re-render without calling setState?
By default, when your component’s state or props change, your component will re-render. If your render() method depends on some other data, you can tell React that the component needs re-rendering by calling forceUpdate().
component.forceUpdate(callback);
- It is recommended to avoid all uses of forceUpdate() and only read from this.props and this.state in render().
What is the difference between super() and super(props) in React using ES6 classes?
When you want to access this.props in constructor() then you should pass props to super() method.
Using super(props):
class MyComponent extends React.Component { constructor(props) { super(props); console.log(this.props); // { name: ‘John’, … } }}
Using super():
class MyComponent extends React.Component { constructor(props) { super(); console.log(this.props); // undefined }}
- Outside constructor() both will display same value for this.props.
How to loop inside JSX?
You can simply use Array.prototype.map with ES6 arrow function syntax.
For example, the items array of objects is mapped into an array of components:
<tbody> {items.map((item) => ( <SomeComponent key={item.id} name={item.name} /> ))}</tbody>
But you can’t iterate using for loop:
<tbody> for (let i = 0; i < items.length; i++) { <SomeComponent key={items[i].id} name={items[i].name} /> }</tbody>
- This is because JSX tags are transpiled into function calls, and you can’t use statements inside expressions. This may change thanks to do expressions which are stage 1 proposal.
How do you access props in attribute quotes?
React (or JSX) doesn’t support variable interpolation inside an 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 attribute value. So the below expression works:
<img className=”image” src={“images/” + this.props.image} />
Using template strings will also work:
<img className=”image” src={`images/${this.props.image}`} />
What is React proptype array with shape?
If you want to pass an array of objects to a component with a particular shape then use React.PropTypes.shape() as an argument to React.PropTypes.arrayOf().
ReactComponent.propTypes = { arrayWithShape: React.PropTypes.arrayOf( React.PropTypes.shape({ color: React.PropTypes.string.isRequired, fontSize: React.PropTypes.number.isRequired, }) ).isRequired,};
How to conditionally apply class attributes?
You shouldn’t use curly braces inside quotes because it is going to be evaluated as a string.
<div className=”btn-panel {this.props.visible ? ‘show’ : ‘hidden’}”>
Instead you need to move curly braces outside (don’t forget to include spaces between class names):
<div className={‘btn-panel ‘ + (this.props.visible ? ‘show’ : ‘hidden’)}>
Template strings will also work:
<div className={`btn-panel ${this.props.visible ? ‘show’ : ‘hidden’}`}>
What is the difference between React and ReactDOM?
The react package contains React.createElement(), React.Component, React.Children, and other helpers related to elements and component classes. You can think of these as the isomorphic or universal helpers that you need to build components. The react-dom package contains ReactDOM.render(), and in react-dom/server we have server-side rendering support with ReactDOMServer.renderToString() and ReactDOMServer.renderToStaticMarkup().
Why ReactDOM is separated from React?
The React team worked on extracting all DOM-related features into a separate library called ReactDOM. React v0.14 is the first release in which the libraries are split. By looking at some of the packages, react-native, react-art, react-canvas, and react-three, it has become clear that the beauty and essence of React has nothing to do with browsers or the DOM.
To build more environments that React can render to, React team planned to split the main React package into two: react and react-dom. This paves the way to writing components that can be shared between the web version of React and React Native.
How to use React label element?
If you try to render a <label> element bound to a text input using the standard for attribute, then it produces HTML missing that attribute and prints a warning to the console.
<label for={‘user’}>{‘User’}</label><input type={‘text’} id={‘user’} />
Since for is a reserved keyword in JavaScript, use htmlFor instead.
<label htmlFor={‘user’}>{‘User’}</label><input type={‘text’} id={‘user’} />
How to combine multiple inline style objects?
You can use spread operator in regular React:
<button style={{ …styles.panel.button, …styles.panel.submitButton }}> {“Submit”}</button>
If you’re using React Native then you can use the array notation:
<button style={[styles.panel.button, styles.panel.submitButton]}> {“Submit”}</button>
How to re-render the view when the browser is resized?
You can use the useState hook to manage the width and height state variables, and the useEffect hook to add and remove the resize event listener. The [] dependency array passed to useEffect ensures that the effect only runs once (on mount) and not on every re-render.
import React, { useState, useEffect } from “react”;function WindowDimensions() { const [dimensions, setDimensions] = useState({ width: window.innerWidth, height: window.innerHeight, }); useEffect(() => { function handleResize() { setDimensions({ width: window.innerWidth, height: window.innerHeight, }); } window.addEventListener(“resize”, handleResize); return () => window.removeEventListener(“resize”, handleResize); }, []); return ( <span> {dimensions.width} x {dimensions.height} </span> );}
What is the difference between setState() and replaceState() methods?
When you use setState() the current and previous states are merged. replaceState() throws out the current state, and replaces it with only what you provide. Usually setState() is used unless you really need to remove all previous keys for some reason. You can also set state to false/null in setState() instead of using replaceState().
How to listen to state changes?
The componentDidUpdate lifecycle method will be called when state changes. You can compare provided state and props values with current state and props to determine if something meaningful changed.
componentDidUpdate(object prevProps, object prevState)
Note: The previous releases of ReactJS also uses componentWillUpdate(object nextProps, object nextState) for state changes. It has been deprecated in latest releases.
What is the recommended approach of removing an array element in React state?
The better approach is to use Array.prototype.filter() method.
For example, let’s create a removeItem() method for updating the state.
removeItem(index) { this.setState({ data: this.state.data.filter((item, i) => i !== index) })}
Is it possible to use React without rendering HTML?
It is possible. Below are the possible options:
render() { return false}render() { return true}render() { return null}
React version >=16.0.0:
render() { return []}render() { return “”}
React version >=16.2.0:
render() { return <React.Fragment></React.Fragment>}render() { return <></>}
React version >=18.0.0:
render() { return undefined}
How to pretty print JSON with React?
We can use <pre> tag so that the formatting of the JSON.stringify() is retained:
const data = { name: “John”, age: 42 }; class User extends React.Component { render() { return <pre>{JSON.stringify(data, null, 2)}</pre>; }} React.render(<User />, document.getElementById(“container”));
Why you can’t update props in React?
The React philosophy is that props should be immutable and top-down. This means that a parent can send any prop values to a child, but the child can’t modify received props.
How to focus an input element on page load?
You can do it by creating ref for input element and using it in componentDidMount():
class App extends React.Component { componentDidMount() { this.nameInput.focus(); } render() { return ( <div> <input defaultValue={“Won’t focus”} /> <input ref={(input) => (this.nameInput = input)} defaultValue={“Will focus”} /> </div> ); }} ReactDOM.render(<App />, document.getElementById(“app”));
Also in Functional component (react 16.08 and above)
import React, { useEffect, useRef } from “react”; const App = () => { const inputElRef = useRef(null); useEffect(() => { inputElRef.current.focus(); }, []); return ( <div> <input defaultValue={“Won’t focus”} /> <input ref={inputElRef} defaultValue={“Will focus”} /> </div> );}; ReactDOM.render(<App />, document.getElementById(“app”));
What are the possible ways of updating objects in state?
Calling setState() with an object to merge with state:
- Using assign() to create a copy of the object:
· const user = Object.assign({}, this.state.user, { age: 42 });this.setState({ user });
Using spread operator:
const user = { …this.state.user, age: 42 };this.setState({ user });
Calling setState() with a function:
this.setState((prevState) => ({ user: { …prevState.user, age: 42, },}));
How can we find the version of React at runtime in the browser?
You can use React.version to get the version.
const REACT_VERSION = React.version; ReactDOM.render( <div>{`React version: ${REACT_VERSION}`}</div>, document.getElementById(“app”));
What are the approaches to include polyfills in your create-react-app?
There are approaches to include polyfills in create-react-app,
- Manual import from core-js:
Create a file called (something like) polyfills.js and import it into root index.js file. Run npm install core-js or yarn add core-js and import your specific required features.
import “core-js/fn/array/find”;import “core-js/fn/array/includes”;import “core-js/fn/number/is-nan”;
Using Polyfill service:
Use the polyfill.io CDN to retrieve custom, browser-specific polyfills by adding this line to index.html:
<script src=”,Array.prototype.includes”></script>
- In the above script we had to explicitly request the prototype.includes feature as it is not included in the default feature set.
How to use https instead of http in create-react-app?
You just need to use HTTPS=true configuration. You can edit your package.json scripts section:
“scripts”: { “start”: “set HTTPS=true && react-scripts start”}
or just run set HTTPS=true && npm start
How to avoid using relative path imports in create-react-app?
Create a file called .env in the project root and write the import path:
NODE_PATH=src/app
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?
Add a listener on the history object to record each page view:
history.listen(function (location) { window.ga(“set”, “page”, location.pathname + location.search); window.ga(“send”, “pageview”, location.pathname + location.search);});
How to update a component every second?
You need to use setInterval() to trigger the change, but you also need to clear the timer when the component unmounts to prevent errors and memory leaks.
componentDidMount() { this.interval = setInterval(() => this.setState({ time: Date.now() }), 1000)} componentWillUnmount() { clearInterval(this.interval)}
How do you apply vendor prefixes to inline styles in React?
React does not apply vendor prefixes automatically. You need to add vendor prefixes manually.
<div style={{ transform: “rotate(90deg)”, WebkitTransform: “rotate(90deg)”, // note the capital ‘W’ here msTransform: “rotate(90deg)”, // ‘ms’ is the only lowercase vendor prefix }}/>
How to import and export components using React and ES6?
You should use default for exporting the components
import React from “react”;import User from “user”; export default class MyProfile extends React.Component { render() { return <User type=”customer”>//…</User>; }}
With the export specifier, the MyProfile is going to be the member and exported to this module and the same can be imported without mentioning the name in other components.
Why is a component constructor called only once?
React’s reconciliation algorithm assumes that without any information to the contrary, if a custom component appears in the same place on subsequent renders, it’s the same component as before, so reuses the previous instance rather than creating a new one.
How to define constants in React?
You can use ES7 static field to define constant.
class MyComponent extends React.Component { static DEFAULT_PAGINATION = 10;}