Высокоуровневое разделение представления и логики в React
Одна из самых сильных сторон React заключается в возможности отделения представлениея от логики. Пусть это и требует дополнительного времени, но мне нравится создавать два отдельных компонента, один скрывающий вид, другой - логику.
На первый взгляд может показаться, что это какой то оверхэд. Зачем мне создавать два файла, когда я могу просто использовать метод render. Почему нет, этот подход имеет много преимуществ. К примеру, это позволяет двум людям работать над одним кодом одновременно. Джуниор разработчик может писать стили и разметку JSX, в то время как более опытный разработчик может реализовать обработку логики. Так же еще одним рабочим решением будет разделение интересов. Весь представление можно изменять и модифицировать абстраггированно файлов с логикой, если они используют одинаковые реквизиты.
Итак, как же мы это реализуем? Просто, правда.
Во-первых, я определяю состояние. Компонент должен, например, реагировать на наведение мыши, различать его состояние между активным и бездействующим и отображать переданный ему текст. Далее я перехожу к логике. Чаще всего это класс с некоторыми внутренними методами:
import View from "@src/ui/Thing";class Thing extends React.Component {
state = {
active: false,
hovered: false,
}; setActiveState = () => this.setState({ active: !this.state.active });
setHoveredState = () => this.setState({ hovered: !this.state.hovered });
render() {
return (
);
}
}Довольно много получилоcь кода для логики. Конечно, может быть гораздо больше, но для примера нам этого будет достаточно.
Далее займемся представлением:
const Thing = (props) => {
const {
active,
hovered,
onClick,
onMouseEnter,
onMouseLeave,
text,
} = props; return (
{text}
);
};Довольно просто и лаконично.
Этот шаблон отлично работает в командах с младшими и средними разработчиками, так как они могут работать над общим проектом и младшие не будут оставаться позади из-за недостатка знаний в более сложных логических вопросах или из-за отсутствия интереса к написанию представлений.