9 вопросов для собеседования, которые должен знать каждый Senior React разработчик
2 года назад·7 мин. на чтение
Как React разработчик, вы в конечном итоге почувствуете желание сделать следующий большой шаг к роли senior разработчика. Конечно, опыт приходит со временем, но некоторые могут иметь мышление senior разработчика, но упускать из поля изучения необходимые темы.
Вот несколько очень распространенных вопросов на собеседовании, которые вам могут задать во время собеседования на должность сеньор React разработчика.
1. Можете ли вы описать ситуацию, когда вам пришлось оптимизировать React приложение, чтобы повысить его производительность? Как вы это сделали?
Как кандидат на должность senior React разработчика, от вас ожидают, что вы будете знать, как оптимизировать приложение React для повышения производительности. Понимание жизненного цикла React и хуков может помочь в этом. Некоторые способы оптимизации производительности React приложения могут включать следующее:- Избегать ненужных повторных рендеров
- Использовать уникального идентификаторы при отображении списков
- Использование хуков, таких как
useMemo
иuseCallback
, для запоминания функций
2. Как вы справляетесь с управлением состоянием в большом React приложении?
В React есть два типа состояния. Локальное и глобальное состояние. Локальное состояние является исключительным для области действия компонента React. Доступ к глобальному состоянию может получить любой из ваших компонентов. Некоторые распространенные библиотеки для управления состоянием в большом реакт приложении включают:Когда использовать состояние?
Представьте, что вы создаете приложение со списком дел в React. Вы хотите отслеживать список задач, которые ввел пользователь, а также логическое значение, указывающее, загружает ли приложение в данный момент данные из API. Например, у вас может быть действие с именемADD_TODO
, которое добавляет новый элемент списка дел в массив, и редьюсер, который соответствующим образом обновляет состояние. У вас также может быть действие SET_LOADING
, которое обновляет состояние загрузки.
Другим примером может быть корзина для покупок, которая отслеживает товары внутри корзины, даже когда пользователь обновляет страницу или покидает ее.
Если ваши данные передаются только из глобальной переменной в компоненты приложения, вы также можете реализовать хук useContext
. Это хорошо работает для работы с темами интерфейса пользователя и реализации аутентификации.
3. Можете ли вы описать опыт работы со сложной структурой данных в приложении React? Как вы с этим справились?
Для работы со сложными структурами данных в приложении React вам может потребоваться использовать такие методы, как сопоставление вложенных данных (маппинг, mapping), использование рекурсивных компонентов для визуализации данных с несколькими уровнями вложенности и оптимизация производительности с помощью таких методов, какReact.memo
.
Также может быть полезно использовать библиотеки, такие как lodash
, для управления и преобразования сложных структур данных. Например, функция debounce
из библиотеки lodash
, полезна для сокращения количества API запросов.
Очевидно, что в React существует множество способов обработки сложных структур данных. Вот несколько сценариев, в которых вам, возможно, придется более осторожно подходить к обработке и представлению данных.
- Вложенные структуры данных, такие как дерево или граф.
- Большие наборы данных, которые необходимо отображать и обрабатывать в виде таблицы или списка.
- Структуры данных со многими уровнями вложенности, например, объект JSON с несколькими уровнями вложенных объектов и массивов.
- Структуры данных, которые постоянно меняются, например, данные в режиме реального времени из прямой трансляции или подключения через веб-сокет.
4. Как вы подходите к тестированию приложения React?
Важно иметь хорошую стратегию тестирования, чтобы убедиться, что ваше приложение React стабильно и работает правильно. Это может включать в себя комбинацию модульных тестов, интеграционных тестов и E2E тестов, а также такие методы, как снэпшот (snapshot) тестирование и TDD (разработка через тестирование).- Используйте встроенные утилиты тестирования React, такие как React Testing Library и Enzyme, для проверки рендеринга и поведения компонентов.
- Напишите модульные тесты для отдельных компонентов React, чтобы убедиться, что они работают правильно изолированно.
- Напишите интеграционные тесты, чтобы проверить взаимодействие между несколькими компонентами и убедиться, что они правильно работают вместе.
- Используйте фреймворк для тестирования, такой как Jest, для запуска и организации тестов.
- Используйте снэпшот тестирование, чтобы убедиться, что рендеринг вашего компонента неожиданно не изменится.
- Используйте разработку через тестирование (TDD) для написания тестов перед написанием реализацией функций.
- Используйте библиотеку для мокирования, такую как Sinon.js, для мокирования зависимостей в ваших тестах.
- Напишите e2e тесты для тестирования приложения в целом, имитируя взаимодействие пользователя в реальном браузере.
5. Как вы обрабатываете асинхронные действия в React приложении?
Один из способов — использовать ключевые словаasync
и await
, которые позволяют писать асинхронный код в синхронном стиле.
Вот пример компонента, который выполняет асинхронный вызов API с использованием async
и await
:
.
Другой способ обработки асинхронных функций в React — использование библиотеки, такой какimport React, { useState, useEffect } from 'react'; function MyComponent() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { const response = await fetch('https://example.com/get-data'); const data = await response.json(); setData(data); } fetchData(); }, []); return ( <div> {data ? ( <div>{data.message}</div> ) : ( <div>Loading...</div> )} </div> ); }
axios
или fetch
, для выполнения API вызовов. Вот пример использования axios
:
Подробнее об асинхронности можно прочитать в статье Полное руководство по асинхронному JavaScriptimport React, { useState, useEffect } from 'react'; import axios from 'axios'; function MyComponent() { const [data, setData] = useState(null); useEffect(() => { async function fetchData() { const response = await axios.get('https://example.com/get-data'); setData(response.data); } fetchData(); }, []); return ( <div> {data ? ( <div>{data.message}</div> ) : ( <div>Loading...</div> )} </div> ); }
6. Можете ли вы рассказать об отличиях между презентационным и контейнерным компонентами в React?
В React презентационные компоненты связаны с тем, как все выглядит, а контейнерные компоненты — с тем, как все работает. Презентационные компоненты обычно отвечают за отрисовку элементов пользовательского интерфейса на экране. Они получают данные и обратные вызовы в качестве пропсов. Обычно они сосредоточены на рендеринге JSX и не знают о состоянии или действиях приложения. Вот пример презентационного компонента:Компоненты-контейнеры обычно отвечают за управление состоянием и действиями. Они содержат логику для выборки данных, обработки пользовательского ввода и выполнения других задач. Они знают о состоянии и действиях приложения и передают данные и обратные вызовы презентационным компонентам через пропсы. Вот пример компонента-контейнера:import React from 'react'; function Button(props) { return <button>{props.label}</button>; }
Разделение презентационных и контейнерных компонентов может помочь упростить понимание, тестирование и поддержку вашего кода за счет отделения задач, связанных с тем, как вещи выглядят, от того, как они работают.import React, { Component } from 'react'; import Button from './Button'; class Form extends Component { state = { name: '', }; handleChange = (event) => { this.setState({ name: event.target.value }); }; handleSubmit = (event) => { event.preventDefault(); // отправка формы }; render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input type="text" value={this.state.name} onChange={this.handleChange} /> </label> <Button label="Submit" /> </form> ); } }
7. Можете ли вы описать, как бы вы реализовали пагинацию в приложении React?
Вот один из способов реализации функции пагинации (перехода по страницам) в приложении React:- Определите общее количество необходимых страниц, исходя из объема имеющихся у вас данных и количества элементов, которые вы хотите отобразить на странице.
- Добавьте переменную состояния
page
в свой компонент, чтобы отслеживать текущую страницу. - Напишите функцию, которая извлекает данные для определенной страницы и обновляет состояние компонента новыми данными.
- Отобразите интерфейс пагинации, который может включать кнопки для перехода к следующей и предыдущей страницам, а также раскрывающийся список для выбора конкретной страницы.
- Добавьте обработчики событий для элементов компонента пагинации, которые вызывают функцию выбора с соответствующим номером страницы.
8. Как вы обрабатываете роутинг на стороне клиента в приложении React?
Существует несколько способов обработки маршрутизации на стороне клиента в приложении React. Одним из популярных способов является использование библиотекиreact-router-dom
, которая предоставляет компонент <Router>
для обработки маршрутизации и набор компонентов <Route>
для определения маршрутов в вашем приложении.
Вот пример того, как вы можете использовать react-router-dom
для обработки маршрутизации на стороне клиента в приложении React:
Установите библиотеку react-router-dom
.
Импортируйте компонентыnpm install react-router-dom
<Router>
и <Route>
из react-router-dom
.
Оберните свое приложение компонентомimport { BrowserRouter as Router, Route } from 'react-router-dom';
<Router>
.
Определите маршруты с помощью компонента<Router> <App /> </Router>
<Route>
. Компонент <Route>
принимает проп path
, указывающее путь для маршрута, и проп component
, указывающий компонент для отображения при совпадении маршрута.
Компонент<Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/users/:id" component={User} />
<Route>
будет отображать указанный компонент, когда текущий URL-адрес соответствует пути маршрута. Вы можете использовать проп exact
, чтобы указать, что маршрут должен сопоставляться только тогда, когда путь точно совпадает с текущим URL-адресом.
Вы также можете использовать компонент <Link>
из react-router-dom
для создания ссылок, которые перемещаются между маршрутами в вашем приложении.
import { Link } from 'react-router-dom'; ... <Link to="/about">About</Link>
9. Можете ли вы рассказать о преимуществах использования React Context API?
React Context API — отличная альтернатива передаче текущих данных без передачи пропсов из родительского компонента. Это может быть особенно полезно в случаях, когда у вас есть глубоко вложенная структура компонентов или если вы хотите передать данные компоненту, который находится на много уровней ниже по дереву. Некоторые преимущества использования React Context API включают:Упрощает prop drilling
С помощью Context API вы можете избежать передачи свойств через несколько уровней компонентов, что может стать утомительным и затруднить чтение и поддержку вашего кода.Облегчает обмен данными между компонентами
Если у вас есть состояние, которое необходимо разделить между несколькими компонентами, Context API может упростить это, не поднимая состояние до общего предка.Улучшает производительность
Поскольку Context API не использует React Virtual DOM для передачи данных между компонентами, он может быть более эффективным, чем использование пропсов. Это может быть особенно полезно в случаях, когда вы передаете большие объемы данных или часто выполняете повторный рендеринг.Увеличивает повторное использование кода
Если у вас есть компоненты, которым требуется доступ к одним и тем же данным, вы можете использовать Context API, чтобы сделать эти данные доступными для них, что может упростить повторное использование этих компонентов в разных частях вашего приложения.Итоги
Эти вопросы должны дать специалисту по найму хорошее представление о вашем опыте работы с React и способности решать сложные проблемы. Также важно помнить, что менеджеры по найму, технические директора и другие технические руководители также будут оценивать ваши коммуникативные навыки, способность решать проблемы и общий подход к разработке. Еще больше вопросов с фронтенд собеседований можно найти здесь.20 советов для улучшения качества кода в React проекте
год назад·5 мин. на чтение
React очень гибок и не строг к структуре компонентов. Именно поэтому мы несем ответственность за поддержание чистоты и поддерживаемости наших проектов.
В этой статье рассмотрим некоторые рекомендации по улучшению качества приложения на React. Эти правила широко приняты. Таким образом, обладание этими знаниями является обязательным.
20. Проп
Всегда включайте проп
1. Используйте короткую запись JSX
Попробуйте использовать сокращение JSX для передачи логических переменных. Допустим, вы хотите управлять видимостью заголовка компонента панели навигации.Плохо
return ( <Navbar showTitle={true} /> );
Хорошо
return( <Navbar showTitle /> )
2. Используйте тернарные операторы
Допустим, вы хотите отобразить сведения о пользователе в зависимости от роли.Плохо
const { role } = user; if(role === ADMIN) { return <AdminUser /> }else{ return <NormalUser /> }
Хорошо
const { role } = user; return role === ADMIN ? <AdminUser /> : <NormalUser />
3. Воспользуйтесь преимуществами объектных литералов
Объектные литералы могут помочь сделать наш код более читабельным. Допустим, вы хотите отобразить три типа пользователей в зависимости от их ролей. Вы не можете использовать тернарный оператор, так как количество опций превышает два.Плохо
const {role} = user switch(role){ case ADMIN: return <AdminUser /> case EMPLOYEE: return <EmployeeUser /> case USER: return <NormalUser /> }
Хорошо
Теперь код выглядит намного лучше.const {role} = user const components = { ADMIN: AdminUser, EMPLOYEE: EmployeeUser, USER: NormalUser }; const Component = components[role]; return <Componenent />;
4. Используйте фрагменты
Всегда используйтеFragment
вместо лишней обертки div
. Это сохраняет код чистым, а также полезно для производительности, поскольку в виртуальной модели DOM создается на один узел меньше.
Плохо
return ( <div> <Component1 /> <Component2 /> <Component3 /> </div> )
Хорошо
return ( <> <Component1 /> <Component2 /> <Component3 /> </> )
5. Не определяйте функцию внутри рендеринга
Не определяйте функцию внутри функции рендеринга. Постарайтесь свести логику рендеринга к абсолютному минимуму.Плохо
return ( <button onClick={() => dispatch(ACTION_TO_SEND_DATA)}> // здесь определена функция This is a bad example </button> )
Хорошо
const submitData = () => dispatch(ACTION_TO_SEND_DATA) return ( <button onClick={submitData}> This is a good example </button> )
6. Используйте React memo
React.PureComponent
и Memo
могут значительно повысить производительность вашего приложения. Они помогают нам избежать ненужного рендеринга.
Плохо
Хотя дочерний компонент должен отображаться только один раз, так как значениеimport React, { useState } from "react"; export const TestMemo = () => { const [userName, setUserName] = useState("faisal"); const [count, setCount] = useState(0); const increment = () => setCount((count) => count + 1); return ( <> <ChildrenComponent userName={userName} /> <button onClick={increment}> Increment </button> </> ); }; const ChildrenComponent =({ userName }) => { console.log("rendered", userName); return <div> {userName} </div>; };
count
не имеет ничего общего с ChildComponent
. Но он отображается рендерится каждый раз, когда вы нажимаете на кнопку.
Хорошо
Давайте отредактируемChildrenComponent
следующим образом:
Теперь, независимо от того, сколько раз вы нажмете на кнопку, она будет отображаться только тогда, когда это необходимо.import React, {useState} from "react"; const ChildrenComponent = React.memo(({userName}) => { console.log('rendered') return <div> {userName}</div> })
7. Поместите CSS в JavaScript
Избегайте сырого JavaScript при написании приложений React, потому что организовать CSS намного сложнее, чем организовать JS.Плохо
// CSS FILE .body { height: 10px; } //JSX return <div className='body'> </div>
Хорошо
const bodyStyle = { height: "10px" } return <div style={bodyStyle}> </div>
8. Используйте деструктурирование объектов
Используйте деструктурирование объектов в своих интересах. Допустим, вам нужно показать данные пользователя.Плохо
return ( <> <div> {user.name} </div> <div> {user.age} </div> <div> {user.profession} </div> </> )
Хорошо
const { name, age, profession } = user; return ( <> <div> {name} </div> <div> {age} </div> <div> {profession} </div> </> )
9. Строковые пропсы можно передавать без фигурных скобок
При передаче строковых пропсов дочернему компоненту.Плохо
return( <Navbar title={"My Special App"} /> )
Хорошо
return( <Navbar title="My Special App" /> )
10. Удалить JS-код из JSX
Вынесите JS-код из JSX, если это не служит какой-либо цели рендеринга или функциональности пользовательского интерфейса.Плохо
return ( <ul> {posts.map((post) => ( <li onClick={event => { console.log(event.target, 'clicked!'); // <- плохо }} key={post.id}>{post.title} </li> ))} </ul> );
Хорошо
const onClickHandler = (event) => { console.log(event.target, 'clicked!'); } return ( <ul> {posts.map((post) => ( <li onClick={onClickHandler} key={post.id}>{post.title}</li> ))} </ul> );
11. Используйте шаблонные литералы
Используйте шаблонные литералы для создания длинных строк. Избегайте использования конкатенации строк. Это будет выглядеть красиво и чисто.Плохо
const userDetails = user.name + "'s profession is" + user.proffession return ( <div> {userDetails} </div> )
Хорошо
const userDetails = `${user.name}'s profession is ${user.proffession}` return ( <div> {userDetails} </div> )
12. Порядок импортов
Всегда старайтесь импортировать сущности в определенном порядке. Это улучшает читаемость кода.Плохо
import React from 'react'; import ErrorImg from '../../assets/images/error.png'; import styled from 'styled-components/native'; import colors from '../../styles/colors'; import { PropTypes } from 'prop-types';
Хорошо
Эмпирическое правило состоит в том, чтобы сохранить порядок импорта следующим образом:- Встроенные зависимости
- Внешние зависимости
- Внутренние зависимости
import React from 'react'; import { PropTypes } from 'prop-types'; import styled from 'styled-components/native'; import ErrorImg from '../../assets/images/error.png'; import colors from '../../styles/colors';
13. Используйте неявный возврат
Используйте функцию JavaScript с неявным возвратом результата при написании красивого кода. Допустим, ваша функция выполняет простое вычисление и возвращает результат.Плохо
const add = (a, b) => { return a + b; }
Хорошо
const add = (a, b) => a + b;
14. Именование компонентов
Всегда используйте PascalCase для компонентов и camelCase для экземпляров.Плохо
import reservationCard from './ReservationCard'; const ReservationItem = <ReservationCard />;
Хорошо
import ReservationCard from './ReservationCard'; const reservationItem = <ReservationCard />;
15. Кавычки
Используйте двойные кавычки для атрибутов JSX и одинарные кавычки для всех остальных JS.Плохо
<Foo bar='bar' /> <Foo style={{ left: "20px" }} />
Хорошо
<Foo bar="bar" /> <Foo style={{ left: '20px' }} />
16. Именование пропсов
Всегда используйте camelCase для имен объектов или PascalCase, если значение объекта является компонентом React.Плохо
<Component UserName="hello" phone_number={12345678} />
Хорошо
<MyComponent userName="hello" phoneNumber={12345678} Component={SomeComponent} />
17. JSX в круглых скобках
Если компонент занимает более одной строки, всегда заключайте его в круглые скобки.Плохо
return <MyComponent variant="long"> <MyChild /> </MyComponent>;
Хорошо
return ( <MyComponent variant="long"> <MyChild /> </MyComponent> );
18. Самозакрывающиеся теги
Если компонент не имеет дочерних элементов, используйте самозакрывающиеся теги. Это улучшает читаемость.Плохо
<SomeComponent variant="stuff"></SomeComponent>
Хорошо
<SomeComponent variant="stuff" />
19. Нижнее подчеркивание в названии метода
Не используйте символы подчеркивания ни в одном внутреннем методе React.Плохо
const _onClickHandler = () => { // код }
Хорошо
const onClickHandler = () => { // код }
20. Проп alt
Всегда включайте проп alt
в теги <img >
. И не используйте picture
или image
в проп alt
, потому что программы чтения с экрана уже объявляют элементы img
изображениями.
Плохо
<img src="hello.jpg" /> <img src="hello.jpg" alt="Picture of me rowing a boat" />
Хорошо
<img src="hello.jpg" alt="Me waving hello" />