21 хорошая практика для очень хороших React проектов
Несколько практических советов для улучшения качества кода. Обсудить Статья публикуется в переводе, автор оригинального текста Мохаммад Фейсал. React очень лоялен к тому, что и как мы пишем и как организуем свой код. Поэтому ответственность за поддержание чистоты и качества наших проектов несем только мы. Сегодня поговорим о том, как это сделать, – о самых полезных практиках разработки на React. Использовать логические значения никогда не было так просто. Допустим, вам нужно управлять видимостью компонента Плохо Хорошо Отличный способ для выбора между двумя компонентами по некоторому условию – например, в зависимости от роли активного пользователя. Плохо Хорошо Если у вас выбор между тремя и более компонентами, тернарный оператор не подходит. В этом случае литералы объектов могут сделать код более читаемым – используйте их вместо сложных условий. Плохо Хорошо Нет никакого преимущества в использовании Плохо Хорошо Старайтесь не смешивать логику и рендер внутри компонента. Плохо Хорошо Плохо Дочерний компонент должен отображаться только один раз, так как значение count не имеет к нему никакого отношения. И тем не менее он рендерится при каждом нажатии на кнопку. https://miro.medium.com/max/700/1*UC19Qvfj06VAy63lR8mOFg.png Хорошо Отредактируем немного Теперь не имеет значения, сколько раз пользователь кликнет на кнопку, компонент отрендерится только при необходимости. Организовать CSS сложнее, чем JavaScript, но можно постараться. Плохо Хорошо Одна из новейших возможностей JS сделает ваш код более читаемым. Плохо Хорошо Передать строковые данные проще, чем вы думаете. Плохо Хорошо Уберите весь код JavaScript из JSX-разметки, если он не служит какой-либо цели рендеринга или функциональности UI. Плохо Хорошо Используйте строковые литералы вместо громоздкой конкатенации строк. Плохо Хорошо Старайтесь импортировать модули в определенном порядке, чтобы сделать код более логичным. Плохо Хорошо Эмпирическое правило заключается в следующем порядке импорта: Неявный возврат делает ваши функции изящнее. Но не злоупотребляйте этой фичей, она уместна только в простых функциях. Плохо Хорошо Всегда используйте PascalCase для имен компонентов и camelCase – для экземпляров. Плохо Хорошо Не используйте зарезервированные имена атрибутов для передачи пропсов, другие разработчики могут быть к этому не готовы. Плохо Хорошо Используйте двойные кавычки для атрибутов JSX и одинарные – для всего остального кода JavaScript. Плохо Хорошо Всегда используйте camelCase для имен пропсов или PascalCase, если значение атрибута – это другой React-компонент. Плохо Хорошо Если ваш компонент занимает больше, чем одну строчку, всегда оборачивайте его в скобки. Плохо Хорошо Если у вашего компонента нет дочерних элементов, используйте самозакрывающийся тег для улучшения читаемости. Плохо Хорошо Не используйте подчеркивание в любых внутренних методах. Плохо Хорошо Всегда устанавливайте атрибут alt для теги img и не используйте в нем слова image и picture. Альтернативный текст предназначен для скринридеров, которые и так объявляют элемент как изображение, зачем повторяться? Плохо Хорошо Вот и все. Поздравляем, если вы зашли так далеко! Надеюсь, вы кое-что узнали из этой статьи.1. Используйте JSX-сокращения
Navbar
– с помощью пропса showTitle
:
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 <Component />;
4. Используйте фрагменты
div
вместо Fragment
. Зачем вам нужен лишний элемент в виртуальном DOM?
return ( <div> <Component1 /> <Component2 /> <Component3 /> </div> )
return ( <> <Component1 /> <Component2 /> <Component3 /> </> )
5. Не определяйте функцию внутри рендера
return ( <button onClick={() => dispatch(ACTION_TO_SEND_DATA)}> // NOTICE HERE This is a bad example </button> )
const submitData = () => dispatch(ACTION_TO_SEND_DATA) return ( <button onClick={submitData}> This is a good example </button> )
6. Используйте 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>; };
ChildrenComponent
:
import React ,{useState} from "react"; const ChildrenComponent = React.memo(({userName}) => { console.log('rendered') return <div> {userName}</div> })
7. Перенесите CSS в JavaScript
// CSS файл .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
return ( <ul> {posts.map((post) => ( <li onClick={event => { console.log(event.target, 'clicked!'); // <- THIS IS BAD }} 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. Используйте неявный return
const add = (a, b) => { return a + b; }
const add = (a, b) => a + b;
14. Именование компонентов
import reservationCard from './ReservationCard'; const ReservationItem = <ReservationCard />;
import ReservationCard from './ReservationCard'; const reservationItem = <ReservationCard />;
15. Зарезервированные имена свойств
<MyComponent style="dark" /> <MyComponent className="dark" />
<MyComponent variant="fancy" />
16. Кавычки
<Foo bar='bar' /> <Foo style={{ left: "20px" }} />
<Foo bar="bar" /> <Foo style={{ left: '20px' }} />
17. Именование пропсов
<Component UserName="hello" phone_number={12345678} />
<MyComponent userName="hello" phoneNumber={12345678} Component={SomeComponent} />
18. JSX в скобках
return <MyComponent variant="long"> <MyChild /> </MyComponent>;
return ( <MyComponent variant="long"> <MyChild /> </MyComponent> );
19. Самозакрывающиеся теги
<SomeComponent variant="stuff"></SomeComponent>
<SomeComponent variant="stuff" />
20. Подчеркивание в именах методов
const _onClickHandler = () => { // do stuff }
const onClickHandler = () => { // do stuff }
21. Атрибут alt
<img src="hello.jpg" /> <img src="hello.jpg" alt="Picture of me rowing a boat" />
<img src="hello.jpg" alt="Me waving hello" />
Заключение
- 8 views
- 0 Comment