DEV Community

Cover image for 44 React Frontend Interview Questions
Yan Levin
Yan Levin

Posted on

44 React Frontend Interview Questions

Introduction

When it comes to interviewing for a React frontend developer position, being well-prepared for the technical questions is crucial. React has become one of the most popular JavaScript libraries for building user interfaces, and employers often focus on assessing a candidate's understanding of React's core concepts, best practices, and related technologies. In this article, we will explore a comprehensive list of questions commonly asked during React frontend developer interviews. By familiarizing yourself with these questions and their answers, you can enhance your chances of success and demonstrate your proficiency in React development. So, let's dive in and explore the key topics that you should be ready to tackle in a React Frontend Developer interview.

1. What React hooks do you know?

  • useState: Used for managing state in functional components.
  • useEffect: Used for performing side effects in functional components, such as fetching data or subscribing to events.
  • useContext: Used for accessing the value of a React context within a functional component.
  • useRef: Used for creating mutable references to elements or values that persist across renders.
  • useCallback: Used for memoizing functions to prevent unnecessary re-renders.
  • useMemo: Used for memoizing values to improve performance by caching expensive computations.
  • useReducer: Used for managing state with a reducer function, similar to how Redux works.
  • useLayoutEffect: Similar to useEffect, but the effect runs synchronously after all DOM mutations.

These hooks provide powerful tools for managing state, handling side effects, and reusing logic in React functional components.
Learn more

2. What is Virtual DOM?

Virtual DOM is a concept in React where a lightweight, virtual representation of the actual DOM (Document Object Model) is created and stored in memory. It is a programming technique used to optimize the performance of web applications.

When changes are made to the data or state of a React component, the virtual DOM is updated instead of directly manipulating the real DOM. The virtual DOM then calculates the difference between the previous and updated state of the component, known as the "diffing" process.

Once the differences are identified, React efficiently updates only the necessary parts of the real DOM to reflect the changes. This approach minimizes the number of actual DOM manipulations and improves the overall performance of the application.

By using the virtual DOM, React provides a way to create dynamic and interactive user interfaces while ensuring optimal efficiency and rendering speed.

3. How to render an array of elements?

To render an array of elements, you can use the map() method to iterate over the array and return a new array of React elements.

const languages = [
  "JavaScript",
  "TypeScript",
  "Python",
];

function App() {
  return (
    <div>
      <ul>{languages.map((language) => <li>{language}</li>)}</ul>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Learn more

4. What is the difference between controlled and uncontrolled components?

The difference between controlled and uncontrolled components lies in how they manage and update their state.

Controlled components are components where the state is controlled by React. The component receives its current value and updates it through props. It also triggers a callback function when the value changes. This means that the component doesn't store its own internal state. Instead, the parent component manages and passes the value down to the controlled component.

import { useState } from 'react'; 

function App() { 
  const [value, setValue] = useState(''); 

  return ( 
    <div> 
      <h3>Controlled Component</h3> 
      <input name="name" value={name} onChange={(e) => setValue(e.target.value)} />
      <button onClick={() => console.log(value)}>Get Value</button> 
    </div> 
  ); 
} 
Enter fullscreen mode Exit fullscreen mode

Uncontrolled components, on the other hand, manage their own state internally using refs or other methods. They store and update their state independently, without relying on props or callbacks. The parent component has less control over the state of uncontrolled components.

import { useRef } from 'react'; 

function App() { 
  const inputRef = useRef(null); 

  return ( 
    <div className="App"> 
      <h3>Uncontrolled Component</h3> 
      <input type="text" name="name" ref={inputRef} /> 
      <button onClick={() => console.log(inputRef.current.value)}>Get Value</button> 
    </div> 
  ); 
} 

Enter fullscreen mode Exit fullscreen mode

Learn more

5. What is the difference between class-based and functional React components?

The main difference between class-based and functional components is how they are defined and the syntax they use.

Class-based components are defined as ES6 classes and extend the React.Component class. They use the render method to return the JSX (JavaScript XML) that defines the component's output. Class components have access to component lifecycle methods and state management through this.state and this.setState().

class App extends React.Component {
  state = {
    value: 0,
  };

  handleAgeChange = () => {
    this.setState({
      value: this.state.value + 1 
    });
  };

  render() {
    return (
      <>
        <p>Value is {this.state.value}</p>
        <button onClick={this.handleAgeChange}>
        Increment value
        </button>
      </>
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

Functional components, on the other hand, are defined as simple JavaScript functions. They take in props as arguments and return JSX directly. Functional components do not have access to lifecycle methods or state. However, with the introduction of React Hooks in React 16.8, functional components can now manage state and use other features such as context and effects.

import { useState } from 'react';

const App = () => {
  const [value, setValue] = useState(0);

  const handleAgeChange = () => {
    setValue(value + 1);
  };

  return (
      <>
        <p>Value is {value}</p>
        <button onClick={handleAgeChange}>
        Increment value
        </button>
      </>
  );
}
Enter fullscreen mode Exit fullscreen mode

In general, functional components are considered simpler and easier to read and test. It is recommended to use functional components whenever possible, unless there is a specific need for class-based components.

6. What are the lifecycle methods of a component?

Lifecycle methods are a way to hook into the different stages of a component's life cycle, allowing you to execute specific code at specific times.

Here is the list of the major lifecycle methods:

  1. constructor: This is the first method called when a component is created. It is used for initializing state and binding event handlers. In functional components, you would use the useState hook for similar purposes.

  2. render: This method is responsible for rendering JSX markup and returns the content to be displayed on the screen.

  3. componentDidMount: This method is called immediately after the component is rendered in the DOM. It is commonly used for initialization tasks, such as API calls or setting up event listeners.

  4. componentDidUpdate: This method is invoked when the component's props or state change. It allows you to perform side effects, update the component based on the changes, or trigger additional API calls.

  5. componentWillUnmount: This method is called right before the component is removed from the DOM. It is used to clean up any resources that were set up in componentDidMount, such as removing event listeners or canceling timers.

Some lifecycle methods, like componentWillMount, componentWillReceiveProps, and componentWillUpdate, have been deprecated or replaced with alternative methods or hooks.

As for "this," it refers to the current instance of a class component. It allows you to access properties and methods within the component. In functional components, "this" is not used as functions are not bound to a specific instance.

7. What are the peculiarities of using useState?

useState returns a state value and a function to update it.

const [value, setValue] = useState('Some state');
Enter fullscreen mode Exit fullscreen mode

During the initial rendering, the returned state matches the value passed as the first argument. The setState function is used to update the state. It takes a new state value as a parameter and queues a re-render of the component. The setState function can also accept a callback function as a parameter, which takes the previous state value as a parameter.
Learn more

8. What are the peculiarities of using useEffect?

The useEffect hook allows you to perform side effects in a functional component.
Mutations, subscriptions, timers, logging, and other side effects are not allowed inside the main body of a functional component known as the React rendering phase. This can lead to confusing errors and inconsistencies in the user interface.
Instead, it is recommended to use useEffect. The function passed to useEffect will be executed after the render is committed to the screen, or if you pass an array of dependencies as the second parameter, the function will be called every time one of the dependencies changes.

useEffect(() => {
  console.log('Logging something');
}, [])
Enter fullscreen mode Exit fullscreen mode

Learn more

9. How to track the unmounting of a functional component?

Often, useEffect create resources that need to be cleaned up or reset before the component leaves the screen, such as a subscription or a timer identifier.
In order to do this, the function passed to useEffect can return a cleanup function. The cleanup function is run before the component is removed from the user interface to prevent memory leaks. Additionally, if the component renders multiple times (as is usually the case), the previous effect is cleaned up before the next effect is executed.

useEffect(() => {
  function handleChange(value) {
    setValue(value);
  }
  SomeAPI.doFunction(id, handleChange);

  return function cleanup() {
    SomeAPI.undoFunction(id, handleChange);
  };
})
Enter fullscreen mode Exit fullscreen mode

10. What are props in React?

Props are data that is passed to the component from the parent. Props
are read-only and cannot be changed.

// Parent component
const Parent = () => {
  const data = "Hello, World!";

  return (
    <div>
      <Child data={data} />
    </div>
  );
};

// Child component
const Child = ({ data }) => {
  return <div>{data}</div>;
};
Enter fullscreen mode Exit fullscreen mode

Learn more

11. What is a state manager and which ones have you worked with or know?

State manager is a tool or library that helps manage the state of an application. It provides a centralized store or container for storing and managing data that can be accessed and updated by different components in the application.
A state manager solves several problems. Firstly, it is a good practice to separate data and the logic related to it from components. Secondly, when using local state and passing it between components, the code can become convoluted due to the potential for deep nesting of components. By having a global store, we can access and modify data from any component.
Alongside React Context, Redux or MobX are commonly used as state management libraries.
Learn more
Learn more

12. In which cases can you use local state and when should you use global state?

Local state is recommended to be used in cases where it is only used within one component and there are no plans to pass it to other components. Local state is also used in a component representing an individual item in a list. However, if component decomposition involves nested components with data being passed down the hierarchy, it is better to use global state.

13. What is a reducer in Redux and what parameters does it take?

A reducer is a pure function that takes the state and action as parameters. Inside the reducer, we track the type of the received action and, depending on it, we modify the state and return a new state object.

export default function appReducer(state = initialState, action) {
  // The reducer normally looks at the action type field to decide what happens
  switch (action.type) {
    // Do something here based on the different types of actions
    default:
      // If this reducer doesn't recognize the action type, or doesn't
      // care about this specific action, return the existing state unchanged
      return state
  }
}
Enter fullscreen mode Exit fullscreen mode

Learn more

14. What is an action and how can you change the state in Redux?

Action is a simple JavaScript object that must have a field with
a type.

{
  type: "SOME_TYPE"
}
Enter fullscreen mode Exit fullscreen mode

You can also optionally add some data as payload. In order to
change the state, it is necessary to call the dispatch function, to which we pass
action

{
  type: "SOME_TYPE",
  payload: "Any payload",
}
Enter fullscreen mode Exit fullscreen mode

Learn more

15. Which pattern does Redux implement?

Redux implements the Flux pattern, which is a predictable state management pattern for applications. It helps in managing the state of an application by introducing a unidirectional data flow and a centralized store for the application's state.
Learn more

16. Which pattern does Mobx implement?

Mobx implements the Observer pattern, also known as the Publish-Subscribe pattern.
Learn more

17. What are the peculiarities of working with Mobx?

Mobx provides decorators like observable and computed to define observable state and reactive functions. Actions decorated with action are used to modify the state, ensuring that all changes are tracked. Mobx also offers automatic dependency tracking, different types of reactions, fine-grained control over reactivity, and seamless integration with React through the mobx-react package. Overall, Mobx simplifies state management by automating the update process based on changes in observable state.

18. How to access a variable in Mobx state?

You can access a variable in the state by using the observable decorator to define the variable as observable. Here's an example:

import { observable, computed } from 'mobx';

class MyStore {
  @observable myVariable = 'Hello Mobx';

  @computed get capitalizedVariable() {
    return this.myVariable.toUpperCase();
  }
}

const store = new MyStore();
console.log(store.capitalizedVariable); // Output: HELLO MOBX

store.myVariable = 'Hi Mobx';
console.log(store.capitalizedVariable); // Output: HI MOBX
Enter fullscreen mode Exit fullscreen mode

In this example, the myVariable is defined as an observable using the observable decorator. You can then access the variable using store.myVariable. Any changes made to myVariable will automatically trigger updates in dependent components or reactions.
Learn more

19. What is the difference between Redux and Mobx?

Redux is a simpler and more opinionated state management library that follows a strict unidirectional data flow and promotes immutability. It requires more boilerplate code and explicit updates but has excellent integration with React.
Mobx, on the other hand, provides a more flexible and intuitive API with less boilerplate code. It allows you to directly modify the state and automatically tracks changes for better performance. The choice between Redux and Mobx depends on your specific needs and preferences.

20. What is JSX?

By default, the following syntax is used to create elements in react.

const someElement = React.createElement(
  'h3',
  {className: 'title__value'},
  'Some Title Value'
);
Enter fullscreen mode Exit fullscreen mode

But we are used to seeing it like this

const someElement = (
  <h3 className='title__value'>Some Title Value</h3>
);
Enter fullscreen mode Exit fullscreen mode

This is exactly what the markup is called jsx. This is a kind of language extension
that simplifies the perception of code and development
Learn more

21. What is props drilling?

Props drilling refers to the process of passing props through multiple levels of nested components, even if some intermediate components do not directly use those props. This can lead to a complex and cumbersome code structure.

// Parent component
const Parent = () => {
  const data = "Hello, World!";

  return (
    <div>
      <ChildA data={data} />
    </div>
  );
};

// Intermediate ChildA component
const ChildA = ({ data }) => {
  return (
    <div>
      <ChildB data={data} />
    </div>
  );
};

// Leaf ChildB component
const ChildB = ({ data }) => {
  return <div>{data}</div>;
};
Enter fullscreen mode Exit fullscreen mode

In this example, the data prop is passed from the Parent component to ChildA, and then from ChildA to ChildB even though ChildA doesn't directly use the prop. This can become problematic when there are many levels of nesting or when the data needs to be accessed by components further down the component tree. It can make the code harder to maintain and understand.

Props drilling can be mitigated by using other patterns like context or state management libraries like Redux or MobX. These approaches allow data to be accessed by components without the need for passing props through every intermediate component.

22. How to render an element conditionally?

You can use any conditional operators, including ternary.

return (
  <div>
    {isVisible && <span>I'm visible!</span>}
  </div>
);
Enter fullscreen mode Exit fullscreen mode
return (
  <div>
    {isOnline ? <span>I'm online!</span> : <span>I'm offline</span>}
  </div>
);
Enter fullscreen mode Exit fullscreen mode
if (isOnline) {
  element = <span>I'm online!</span>;
} else {
  element = <span>I'm offline</span>;
}

return (
  <div>
    {element}
  </div>
);
Enter fullscreen mode Exit fullscreen mode

Learn more

23. What is useMemo used for and how does it work?

useMemo is used to cache and memorize the
result of calculations.
Pass the creating function and an array of dependencies. useMemo will recalculate the memoized value only when the value of any of the dependencies has changed. This optimization helps to avoid
costly calculations with each render.
With the first parameter, the function accepts a callback in which calculations are performed, and with the second an array of dependencies, the function will re-perform calculations only when at least one of the dependencies is changed.

const memoValue = useMemo(() => computeFunc(paramA, paramB), [paramA, paramB]);
Enter fullscreen mode Exit fullscreen mode

Learn more

24. What is useCallback used for and how does it work?

The useCallback hook will return a memoized version of the callback, which changes only if the values of one of the dependencies change.
This is useful when passing callbacks to optimized child components that rely on link equality to prevent unnecessary renderings.

const callbackValue = useCallback(() => computeFunc(paramA, paramB), [paramA, paramB]);
Enter fullscreen mode Exit fullscreen mode

Learn more

25. What is the difference between useMemo and useCallback?

  1. useMemo is used to memoize the result of a computation, while useCallback is used to memoize a function itself.
  2. useMemo caches the computed value and returns it on subsequent renders if the dependencies haven't changed.
  3. useCallback caches the function itself and returns the same instance unless the dependencies have changed.

26. What is React Context?

React Context is a feature that provides a way to pass data through the component tree without manually passing props at every level. It allows you to create a global state that can be accessed by any component within the tree, regardless of its position. Context is useful when you need to share data between multiple components that are not directly connected through props.

The React Context API consists of three main parts:

  1. createContext: This function is used to create a new context object.
  2. Context.Provider: This component is used to provide the value to the context. It wraps the components that need access to the value.
  3. Context.Consumer or useContext hook: This component or hook is used to consume the value from the context. It can be used within any component within the context's provider.

By using React Context, you can avoid prop drilling (passing props through multiple levels of components) and easily manage state at a higher level, making your code more organized and efficient.
Learn more

27. What is useContext used for and how does it work?

In a typical React application, data is passed from top to bottom (from parent to child component) using props. However, such a method of use may be too cumbersome for some types of props
(for example, the selected language, UI theme), which must be passed to many components in the application. The context provides a way to share such data between components without having to explicitly pass the props through
each level of the tree.
The component calling useContext will always be re-rendered when
the context value changes. If re-rendering a component is costly, you can optimize it using memoization.

const App = () => {
  const theme = useContext(ThemeContext);

  return (
    <div style={{ color: theme.palette.primary.main }}>
      Some div
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Learn more

28. What is useRef used for and how does it work?

useRef returns a modifiable ref object, a property. The current of which is initialized by the passed argument. The returned object will persist for the entire lifetime of the component and will not change from render to render.
The usual use case is to access the descendant in an imperative
style. I.e. using ref, we can explicitly refer to the DOM element.

const App = () => {
  const inputRef = useRef(null);

  const buttonClick = () => {
    inputRef.current.focus();
  }

  return (
    <>
      <input ref={inputRef} type="text" />
      <button onClick={buttonClick}>Focus on input tag</button>
    </>
  )
}
Enter fullscreen mode Exit fullscreen mode

Learn more

29. What is React.memo()?

React.memo() is a higher—order component. If your component always renders the same thing with non-changing props, you can wrap it in a React.memo() call to improve performance in some cases, thereby memorizing the result. This means that React will use the result of the last render, avoiding re-rendering. React.memo() only affects changes to the props. If a functional component is wrapped in React.memo and uses useState, useReducer, or useContext, it will be re-rendered when the state or context changes.

import { memo } from 'react';

const MemoComponent = memo(MemoComponent = (props) => {
  // ...
});
Enter fullscreen mode Exit fullscreen mode

Learn more

30. What is React Fragment?

Returning multiple elements from a component is a common practice in React. Fragments allow you to form a list of child elements without creating unnecessary nodes in the DOM.

<>
  <OneChild />
  <AnotherChild />
</>
// or
<React.Fragment>
  <OneChild />
  <AnotherChild />
</React.Fragment>
Enter fullscreen mode Exit fullscreen mode

Learn more

31. What is React Reconciliation?

Reconciliation is a React algorithm used to distinguish one tree of elements from another to determine the parts that will need to be replaced.
Reconciliation is the algorithm behind what we used to call Virtual DOM. The definition sounds something like this: when you render a React application, the element tree that describes the application is generated in reserved memory. This tree is then included in the rendering environment - for example, a browser application, it is translated into a set of DOM operations. When the application state is updated, a new tree is generated. The new tree is compared with the previous one in order to calculate and enable exactly the operations that are needed to redraw the updated application.
Learn more

32. Why do we need keys in lists when using map()?

The keys help React determine which elements have been changed,
added, or removed. They must be specified so that React can match
array elements over time. The best way to choose a key is to use a string that will clearly distinguish the list item from its neighbors. Most often, you will use the IDs from your data as keys.

const languages = [
  {
    id: 1,
    lang: "JavaScript",
  },
  {
    id: 2,
    lang: "TypeScript",
  },
  {
    id: 3,
    lang: "Python",
  },
];

const App = () => {
  return (
    <div>
      <ul>{languages.map((language) => (
        <li key={`${language.id}_${language.lang}`}>{language.lang}</li>
      ))}
      </ul>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Learn more

33. How to handle asynchronous actions in Redux Thunk?

To use Redux Thunk, you need to import it as middleware. Action creators should return not just an object but a function that takes dispatch as a parameter.

export const addUser = ({ firstName, lastName }) => {
  return dispatch => {
    dispatch(addUserStart());
  }

  axios.post('https://jsonplaceholder.typicode.com/users', {
    firstName,
    lastName,
    completed: false
  })
  .then(res => {
    dispatch(addUserSuccess(res.data));
  })
  .catch(error => {
    dispatch(addUserError(error.message));
  })
}
Enter fullscreen mode Exit fullscreen mode

Learn more

34. How to track changes in a field of an object in a functional component?

To do this, you need to use the useEffect hook and pass the field of the object as a dependency array.

useEffect(() => {
  console.log('Changed!')
}, [obj.someField])
Enter fullscreen mode Exit fullscreen mode

35. How to access a DOM element?

Refs are created using React.createRef() or the useRef() hook and attached to React elements through the ref attribute. By accessing the created reference, we can gain access to the DOM element using ref.current.

const App = () => {
  const myRef = useRef(null);

  const handleClick = () => {
    console.log(myRef.current); // Accessing the DOM element
  };

  return (
    <div>
      <input type="text" ref={myRef} />
      <button onClick={handleClick}>Click Me</button>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

36. What is a custom hook?

Custom hook is a function that allows you to reuse logic between different components. It is a way to encapsulate reusable logic so that it can be easily shared and reused across multiple components. Custom hooks are functions that typically start with the word *use * and can call other hooks if needed.
Learn more

37. What is Public API?

In the context of index files, a Public API typically refers to the interface or functions that are exposed and accessible to external modules or components.
Here's a code example of an index file representing a Public API:

// index.js

export function greet(name) {
  return `Hello, ${name}!`;
}

export function calculateSum(a, b) {
  return a + b;
}
Enter fullscreen mode Exit fullscreen mode

In this example, the index.js file acts as a Public API where the functions greet() and calculateSum() are exported and can be accessed from other modules by importing them. Other modules can import and use these functions as part of their implementation:

// main.js

import { greet, calculateSum } from './index.js';

console.log(greet('John')); // Hello, John!
console.log(calculateSum(5, 3)); // 8
Enter fullscreen mode Exit fullscreen mode

By exporting specific functions from the index file, we are defining the Public API of the module, allowing other modules to use those functions.

38. What are the rules for creating a custom hook?

  1. Start the hook name with "use".
  2. Use existing hooks if needed.
  3. Don't call hooks conditionally.
  4. Extract reusable logic into the custom hook.
  5. Custom hooks must be pure functions.
  6. Custom hooks can return values or other hooks.
  7. Name the custom hook descriptively. Learn more

39. What is SSR (Server-Side Rendering)?

Server-Side Rendering (SSR) is a technique used to render pages on the server and send the fully rendered page to the client for display. It allows the server to generate the complete HTML markup of a web page, including its dynamic content, and send it to the client as a response to a request.

In a traditional client-side rendering approach, the client receives a minimal HTML page and then makes additional requests to the server for data and resources, which are used to render the page on the client-side. This can lead to slower initial page loading times and negatively impact search engine optimization (SEO) since search engine crawlers have difficulty indexing JavaScript-driven content.

With SSR, the server takes care of rendering the web page by executing the necessary JavaScript code to produce the final HTML. This means that the client receives the fully rendered page from the server, reducing the need for additional resource requests. SSR improves initial page load times and allows search engines to easily index the content, resulting in better SEO.

SSR is commonly used in frameworks and libraries like Next.js for React and Nuxt.js for Vue.js to enable server-side rendering capabilities. These frameworks handle the server-side rendering logic for you, making it easier to implement SSR.

40. What are the benefits of using SSR?

  1. Improved initial loading times: SSR allows the server to send a fully rendered HTML page to the client, reducing the amount of processing required on the client-side. This improves the initial loading times, as the user sees a complete page more quickly.

  2. SEO-friendly: Search engines can efficiently crawl and index the content of SSR pages because the fully rendered HTML is available in the initial response. This improves search engine visibility and helps with better search rankings.

  3. Accessibility: SSR ensures that the content is accessible to users who have JavaScript disabled or use assistive technologies. By generating HTML on the server, SSR provides a reliable and accessible user experience for all users.

  4. Performance in low-bandwidth environments: SSR reduces the amount of data needed to be downloaded by the client, making it beneficial for users in low-bandwidth or high-latency environments. This is particularly important for mobile users or users with slower internet connections.

While SSR offers these benefits, it's important to note that it may introduce more server load and maintenance complexity compared to client-side rendering methods. Careful consideration should be given to factors such as caching, scalability, and server-side rendering performance optimizations.

41. What are the main functions of Next.js that you know?

  1. getStaticProps: This method is used to fetch data at build time and pre-render a page as static HTML. It ensures that the data is available at build time and does not change on subsequent requests.
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data
    }
  };
}
Enter fullscreen mode Exit fullscreen mode
  1. getServerSideProps: This method is used to fetch data on each request and pre-render the page on the server. It can be used when you need to fetch data that might change frequently or is user-specific.
export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data
    }
  };
}
Enter fullscreen mode Exit fullscreen mode
  1. getStaticPaths: This method is used in dynamic routes to specify a list of paths that should be pre-rendered at build time. It is commonly used to fetch data for dynamic routes with parameters.
export async function getStaticPaths() {
  const res = await fetch('https://api.example.com/posts');
  const posts = await res.json();

  const paths = posts.map((post) => ({
    params: { id: post.id }
  }));

  return {
    paths,
    fallback: false
  };
}
Enter fullscreen mode Exit fullscreen mode

Learn more

42. What are linters?

Linters are tools used to check source code for potential errors, bugs, stylistic inconsistencies, and maintainability issues. They help enforce coding standards and ensure code quality and consistency across a codebase.

Linters work by scanning the source code and comparing it against a set of predefined rules or guidelines. These rules can include syntax and formatting conventions, best practices, potential bugs, and code smells. When a linter identifies a violation of a rule, it generates a warning or an error, highlighting the specific line or lines of code that need attention.

Using a linter can provide several benefits:

  1. Code Quality: Linters help identify and prevent potential bugs, code smells, and anti-patterns, leading to better code quality.

  2. Consistency: Linters enforce coding conventions and style guidelines, ensuring consistent formatting and code structure across the codebase, even when multiple developers are working on the same project.

  3. Maintainability: By catching issues early and promoting good coding practices, linters contribute to code maintainability, making it easier to understand, modify, and extend the codebase.

  4. Efficiency: Linters can save developers time by automating code review processes and catching common mistakes before they can cause issues during development or in production.

Some popular linters are ESLint for JavaScript and Stylelint for CSS and Sass.
Learn more

43. What architectural solutions for React do you know?

There are several architectural solutions and patterns for building React projects. Some popular ones include:

  1. MVC (Model-View-Controller): MVC is a traditional architectural pattern that separates an application into three main components - Model, View, and Controller. React can be used in the View layer to render the UI, while other libraries or frameworks can be used for the Model and Controller layers.

  2. Flux: Flux is an application architecture introduced by Facebook specifically for React applications. It follows a unidirectional data flow, where data flows in a single direction, making it easier to understand and debug the application's state changes.

  3. Atomic Design: Atomic Design is not specific to React but is a design methodology that divides the UI into smaller, reusable components. It encourages building components that are small, self-contained, and can be composed to create more complex UIs.

  4. Container and Component Pattern: This pattern separates the presentation (Component) from the logic and state management (Container). Components are responsible for rendering the UI, while Containers handle the business logic and state management.

  5. Feature-Sliced Design: It is a modern architectural approach used to organize and structure React applications. It aims to address the challenges of scalability, maintainability, and reusability by dividing the application codebase based on features or modules.

44. What is Feature-Sliced Design?

It is a modern architectural approach used to organize and structure React applications. It aims to address the challenges of scalability, maintainability, and reusability by dividing the application codebase based on features or modules.

In Feature-Sliced Design, each feature or module of the application is organized into a separate directory, containing all the necessary components, actions, reducers, and other related files. This helps in keeping the codebase modular and isolated, making it easier to develop, test, and maintain.

Feature-Sliced Design promotes a clear separation of concerns and encapsulates the functionality within individual features. This allows different teams or developers to work on different features independently, without worrying about conflicts or dependencies.

Feature-Sliced Design

I highy recommend to click on the Learn more button to learn about Feature-Sliced Design
Learn more

Learn more

I strongly recommend reading the rest of my articles on frontend interview questions, if you haven't already.

Conclusion

In conclusion, interviewing for a React Frontend Developer position requires a solid understanding of the framework's core concepts, principles, and related technologies. By preparing for the questions discussed in this article, you can showcase your React knowledge and demonstrate your ability to create efficient and maintainable user interfaces. Remember to not only focus on memorizing answers but also understanding the underlying concepts and being able to explain them clearly.
Additionally, keep in mind that interviews are not just about the technical aspects but also about showcasing your problem-solving skills, communication abilities, and how well you can work in a team. By combining technical expertise with a strong overall skill set, you'll be well-equipped to excel in React frontend developer interviews and land your dream job in this exciting and rapidly evolving field.
Good luck!

Top comments (24)

Collapse
 
christiancho profile image
Christian Cho • Edited

I think this is great for more junior engineers as a way to test their understanding of how to execute a narrowly defined technical problem for a product feature. I would caution, though, on absolutism. For example:

Extract reusable logic into the custom hook.

Not always. I've seen cases where developers will write a custom hook to encapsulate some business logic, but in doing so will end up obfuscating important binding points to side effects. I prefer more explicit binding until it becomes clear that there's a shared understanding of those custom hooks.

Props are read-only and cannot be changed.

Not true. Props can be changed and the values in memory can be altered as JavaScript does not have protected values or properties unless using const primitives. Props can be changed directly, but they won't be reflected in the UI because doing so doesn't trigger a render. This can lead to odd behaviors and difficulty with debugging.

This approach minimizes the number of actual DOM manipulations and improves the overall performance of the application.

Virtual DOM implementations are actually slower than direct DOM manipulation. The virtual DOM exists as a solution for developers to write declarative code. The clear separation of the virtual DOM and the actual DOM is a way to reduce unintended side effects - it's a principle from functional programming.

There are other examples, but for the sake of your readers, I'll stop here.

Overall, this is a great resource for interviewing prep, but don't take it as an authoritative guide. I've seen too many opinionated junior and mid-level developers make blanket statements and I've rejected people after interviews because of it, especially if they're stubborn after correction.

Collapse
 
pengeszikra profile image
Peter Vivo

This list is cover near every area of react/nextjs programing. Expect using of typescript, which is mandatroy some company, but other company is avoide.

In my CV, I try to avoide amount of question with start talk about my module for react state handling: react-troll is the old one which is work well on interview, because on every interview is turn to talk about that module ( 1.5 years ago ). Now I switch the solution from JS to TS and this module is much more simple - give answer to type guarded useReducer : react-state-factory. So I think this is will be help me when I will change to new work (already not).

Collapse
 
rishamason profile image
Risha

Thank you very much! you've done a great job

Collapse
 
marco_43 profile image
Marco

Thank you very much for this article! It's like a reference for react questions, even if your not in an interview. So for me, learning react currently, it was very interesting and helpful to read and discover new and old thinks of react in a "nutshell". Thanks

Collapse
 
cezarytomczyk profile image
Cezary Tomczyk

I think all the questions are too focused on low-level problems. I ask questions that are general challenges and try to make the question reflect the problem rather than a detailed description of how to do it. For example: "How can individual components loosely communicate with each other?" Such a question does not impose a solution, but rather motivates and discovers different solutions to the same question.

Collapse
 
olsard profile image
olsard

Great article! Thank you!

Collapse
 
gulshan212 profile image
Gulshan Negi

Thanks a lot for sharing fantastic stuff here with us. Very detailed information with superb examples. I have also seen this post where the author listed 50 react interview questions with answers. Now I have found this one.
Thanks

Collapse
 
pavelee profile image
Paweł Ciosek

Great Article! Thank you! 🙏🙏🙏

Collapse
 
denys_dev profile image
denkochev

It was very enjoyable to refresh some knowledge. Thank you!

Collapse
 
jluterek profile image
James Luterek

This is a great study guide for those looking for a job, but I believe hiring managers can craft better questions - dev.to/jluterek/44-react-interview...

Collapse
 
manike2101 profile image
emmanuel ikeleji

Bootstrap frameworks with React seems very interesting #react #useState #virtualDOM #dependencyarray #singlesourceoftruth

Collapse
 
manike2101 profile image
emmanuel ikeleji

Bootstrap fra

Collapse
 
fancydeveloper profile image
fancydev

Hi,
Your article is helpful for me always. Thanks

Collapse
 
matkwa profile image
Mat Kwa

Nice one, thanks!

Collapse
 
gosucode profile image
Gosu Code

That was very helpful !

Some comments have been hidden by the post's author - find out more