Паттерны ReactJS видео-курс
2 года назад·2 мин. на чтение
О паттернах в React проектах
Компоненты высшего порядка ReactJS (Higher-order components)
Паттерн Компонент высшего порядка назван по аналогии с функциями высшего порядка. Функция высшего порядка - это функция, которая либо принимает функцию как аргумент, либо возвращает функцию как результат. И то же самое можно сделать с компонентами. Функция (Higher Order component, HOC) может принимать компонент в качестве аргумента, что-то с ним делать и возвращать модифицированный (каким-то образом улучшенный) компонент. Смотреть на RutubeКак использовать Компоненты высшего порядка ReactJS
Смотреть на RutubeПаттерн Render Props в ReactJS
В этом видео поговорим о паттерне Render props в ReactJS, напишем примеры с разными кейсами, где render props полезны, посмотрим на пропchildren
и передадим в него аргументы.
Render prop - это функция, которая возвращает JSX, и эта функция используется как проп в компоненте.
К пропсам с таким поведением принято добавлять префикс render
(например, renderContent
), чтобы отличать обычные пропсы от тех что возвращают JSX.
Смотреть на Rutube
Паттерн Compound Components в React - Составные компоненты
Составные компоненты (Compound Components) в ReactJS - это такой паттерн, в котором взаимосвязанные компоненты используются вместе. Эти компоненты используют общее состояние для общения друг с другом. Сам Compound Component состоит из нескольких компонентов поменьше, которые обычно объединяют в единый namespace. В этом видео напишем компонент с использованием паттерна Compound Components. Смотреть на RutubeУправляемые и неуправляемые компоненты React
Смотреть на RutubeХорошие практики и шаблоны проектирования для Vue Composables
год назад·1 мин. на чтение
Composables (composition API) можно использовать для хранения основной бизнес-логики (например, вычислений, действий, процессов), поэтому они являются важной частью приложения. К сожалению, в командах не всегда есть соглашения для написания composables.
Эти соглашения важны для того, чтобы компоненты были удобными в обслуживании, легко тестируемыми и действительно полезными.
Общие шаблоны проектирования
На мой взгляд, лучшим источником информации о шаблонах для создания composables на самом деле является документация Vue.js, с которой вы можете ознакомиться здесь.Базовый composable
В документации Vue показан следующий пример компонуемогоuseMouse
:
Позже это можно использовать в компоненте следующим образом:// mouse.js import { ref, onMounted, onUnmounted } from 'vue' // по соглашению имена composable функций начинаются с "use" export function useMouse() { // состояние инкапсулировано и управляется самим composable const x = ref(0) const y = ref(0) // composable может обновлять состоянием function update(event) { x.value = event.pageX y.value = event.pageY } // composable также может иметь доступ к жизненному циклу родительского компонента // для установки и очистки эффектов onMounted(() => window.addEventListener('mousemove', update)) onUnmounted(() => window.removeEventListener('mousemove', update)) // отдаем состояние наружу как возвращаемое значение return { x, y } }
<script setup> import { useMouse } from './mouse.js' const { x, y } = useMouse() </script> <template>Mouse position is at: {{ x }}, {{ y }}</template>
Асинхронные composables
Для получения данных Vue рекомендует следующую компонуемую структуру:Затем это можно использовать в компоненте следующим образом:import { ref, watchEffect, toValue } from 'vue' export function useFetch(url) { const data = ref(null) const error = ref(null) watchEffect(() => { // обнуляем состояние перед запросом data.value = null error.value = null // toValue() разворачивает потенциальные рефы или геттеры fetch(toValue(url)) .then((res) => res.json()) .then((json) => (data.value = json)) .catch((err) => (error.value = err)) }) return { data, error } }
<script setup> import { useFetch } from './fetch.js' const { data, error } = useFetch('...') </script>
Соглашения composable
Основываясь на приведенных выше примерах, вот контракт, которому должны следовать все composables:- Имена composable файлов должны начинаться с
use
, напримерuseSomeAmazingFeature.ts
- Он может принимать входные аргументы, которые могут быть примитивными типами, такими как строки, или может принимать ссылки и геттеры, но для этого требуется использовать вспомогательное средство
toValue
- Composable должен возвращать значение
ref
, к которому можно получить доступ после деструктурирования composable, напримерconst { x, y } = useMouse()
- Composables могут содержать глобальное состояние, к которому можно получить доступ и изменить в приложении.
- Composable может вызвать побочные эффекты, такие как добавление прослушивателей событий окна, но их следует очищать при отключении компонента.
- Composables следует вызывать только в
<script setup>
или в хукеsetup()
. В этих контекстах их также следует называть синхронно. В некоторых случаях их также можно вызывать в обработчиках жизненного цикла, таких какonMounted()
- Composables могут вызывать другие composables внутри
- Composables должны заключать в себе определенную логику, а когда они слишком сложны, их следует извлекать в отдельные composables для облегчения тестирования.