Практические советы по улучшению качества кода
На React вы должны сами структурировать проект. Именно поэтому ответственность лежит на нас за чистоту и ремонтопригодность наших проектов.
Сегодня рассмотрим о некоторых передовых методах, которым следует следовать, чтобы улучшить работоспособность вашего продукта на React. Данные правила используются большинством разработчиков, поэтому их нужно знать наизусть.
Примеры показаны с кодом, так что будет интересно!
Попробуйте использовать сокращение JSX для передачи логических переменных. Допустим, вы хотите контролировать видимость заголовка Navbar
компонента.
1 2 3 4 5 |
return ( <Navbar showTitle={true} /> ); |
Хорошо
1 2 3 4 5 |
return( <Navbar showTitle /> ) |
Допустим, вы хотите отобразить сведения о конкретном пользователе в зависимости от его роли.
1 2 3 4 5 6 7 8 9 |
const { role } = user; if(role === ADMIN) { return <AdminUser /> }else{ return <NormalUser /> } |
1 2 3 4 5 |
const { role } = user; return role === ADMIN ? <AdminUser /> : <NormalUser /> |
Объектные литералы могут помочь сделать наш код более читабельным. Допустим, вы хотите показать три типа пользователей в зависимости от их роли. Вы не можете использовать тернарный, потому что количество опций больше двух.
1 2 3 4 5 6 7 8 9 10 11 12 |
const {role} = user switch(role){ case ADMIN: return <AdminUser /> case EMPLOYEE: return <EmployeeUser /> case USER: return <NormalUser /> } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const {role} = user const components = { ADMIN: AdminUser, EMPLOYEE: EmployeeUser, USER: NormalUser }; const Component = components[role]; return <Componenent />; |
Теперь это выглядит намного лучше.
Всегда используйте Fragment
над Div
. Это сохраняет код в чистоте, а также повышает производительность, поскольку в виртуальной DOM создается на один узел меньше.
1 2 3 4 5 6 7 8 9 |
return ( <div> <Component1 /> <Component2 /> <Component3 /> </div> ) |
1 2 3 4 5 6 7 8 9 |
return ( <> <Component1 /> <Component2 /> <Component3 /> </> ) |
Не определяйте функцию внутри render. Постарайтесь свести логику внутри рендеринга к абсолютному минимуму.
1 2 3 4 5 6 7 |
return ( <button onClick={() => dispatch(ACTION_TO_SEND_DATA)}> // NOTICE HERE This is a bad example </button> ) |
1 2 3 4 5 6 7 8 9 |
const submitData = () => dispatch(ACTION_TO_SEND_DATA) return ( <button onClick={submitData}> This is a good example </button> ) |
React.PureComponent
и Memo
может значительно повысить производительность вашего приложения. Они помогают нам избежать ненужного рендеринга.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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
это:
1 2 3 4 5 6 7 8 |
import React ,{useState} from "react"; const ChildrenComponent = React.memo(({userName}) => { console.log('rendered') return <div> {userName}</div> }) |
Теперь независимо от того, сколько раз вы нажмете на кнопку, она будет отображаться только тогда, когда это необходимо.
Старайтесь избегать необработанного JavaScript при написании приложений React, потому что организация CSS намного сложнее, чем организация JS.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// CSS FILE .body { height: 10px; } //JSX return <div className='body'> </div> |
1 2 3 4 5 6 7 8 9 |
const bodyStyle = { height: "10px" } return <div style={bodyStyle}> </div> |
Используйте деструктурирование объектов в своих интересах. Допустим, вам нужно показать данные пользователя.
1 2 3 4 5 6 7 8 9 |
return ( <> <div> {user.name} </div> <div> {user.age} </div> <div> {user.profession} </div> </> ) |
1 2 3 4 5 6 7 8 9 10 11 |
const { name, age, profession } = user; return ( <> <div> {name} </div> <div> {age} </div> <div> {profession} </div> </> ) |
При передаче строковых реквизитов дочернему компоненту.
1 2 3 4 5 |
return( <Navbar title={"My Special App"} /> ) |
1 2 3 4 5 |
return( <Navbar title="My Special App" /> ) |
Переместите любой код JS из JSX, если он не служит какой-либо цели рендеринга или функциональности пользовательского интерфейса.
1 2 3 4 5 6 7 8 9 10 11 12 |
return ( <ul> {posts.map((post) => ( <li onClick={event => { console.log(event.target, 'clicked!'); // <- THIS IS BAD }} key={post.id}>{post.title} </li> ))} </ul> ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const onClickHandler = (event) => { console.log(event.target, 'clicked!'); } return ( <ul> {posts.map((post) => ( <li onClick={onClickHandler} key={post.id}> {post.title} </li> ))} </ul> ); |
Используйте литералы шаблонов для создания больших строк. Избегайте использования конкатенации строк. Это красиво и чисто.
1 2 3 4 5 6 7 |
const userDetails = user.name + "'s profession is" + user.proffession return ( <div> {userDetails} </div> ) |
1 2 3 4 5 6 7 |
const userDetails = `${user.name}'s profession is ${user.proffession}` return ( <div> {userDetails} </div> ) |
Всегда старайтесь импортировать вещи в определенном порядке. Это улучшает читаемость кода.
1 2 3 4 5 6 7 |
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'; |
Эмпирическое правило состоит в том, чтобы сохранить порядок импорта следующим образом:
Таким образом, приведенный выше пример становится:
1 2 3 4 5 6 7 8 9 |
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'; |
Используйте возможности неявного JavaScript return
для написания красивого кода. Допустим, ваша функция выполняет простой расчет и возвращает результат.
1 2 3 4 5 |
const add = (a, b) => { return a + b; } |
1 2 3 |
const add = (a, b) => a + b; |
Всегда используйте PascalCase для компонентов и camelCase для экземпляров.
1 2 3 4 5 |
import reservationCard from './ReservationCard'; const ReservationItem = <ReservationCard />; |
1 2 3 4 5 |
import ReservationCard from './ReservationCard'; const reservationItem = <ReservationCard />; |
Не используйте имена свойств компонента DOM для передачи свойств между компонентами, потому что другие могут не не понимать этих имен.
1 2 3 4 5 |
<MyComponent style="dark" /> <MyComponent className="dark" /> |
1 2 3 |
<MyComponent variant="fancy" /> |
Используйте двойные кавычки для атрибутов JSX и одинарные кавычки для всех остальных JS.
1 2 3 4 5 |
<Foo bar='bar' /> <Foo style={{ left: "20px" }} /> |
1 2 3 4 5 |
<Foo bar="bar" /> <Foo style={{ left: '20px' }} /> |
Всегда используйте camelCase для имён реквизитов или PascalCase, если значение реквизита является компонентом React.
1 2 3 4 5 6 |
<Component UserName="hello" phone_number={12345678} /> |
1 2 3 4 5 6 7 |
<MyComponent userName="hello" phoneNumber={12345678} Component={SomeComponent} /> |
Если ваш компонент занимает более одной строки, всегда заключайте его в круглые скобки.
1 2 3 4 5 |
return <MyComponent variant="long"> <MyChild /> </MyComponent>; |
1 2 3 4 5 6 7 |
return ( <MyComponent variant="long"> <MyChild /> </MyComponent> ); |
Если у вашего компонента нет дочерних элементов, используйте самозакрывающиеся теги. Это улучшает читаемость.
<SomeComponent variant=”stuff”></SomeComponent>
Хорошо
1 2 3 |
<SomeComponent variant="stuff" /> |
Не используйте символы подчеркивания во внутренних методах React.
1 2 3 4 5 |
const _onClickHandler = () => { // do stuff } |
1 2 3 4 5 |
const onClickHandler = () => { // do stuff } |
Всегда включайте в <img >
теги атрибут alt. И не используйте picture
или image
в своем свойстве alt, потому что программы чтения с экрана уже объявляют img
элементы как изображения. Нет необходимости включать это.
1 2 3 4 5 |
img src="hello.jpg" /> <img src="hello.jpg" alt="Picture of me rowing a boat" /> |
1 2 3 |
<img src="hello.jpg" alt="Me waving hello" /> |
Применяйте данные практики и у Вас все получится!
Источник статьи: https://medium.com/