Автор оригинала: johnson chinonso.
Овладение
Компоненты более высокого порядка – отличный шаблон, который оказался очень ценным. Реагировать подчеркивает состав по наследству, что делает его простым, чтобы составить больший компонент, используя меньшие.
В этом посте мы подробно рассмотрим, как использовать компонент высшего порядка в повторном использовании кода и логической абстракции.
Каковы более высокий компонент заказа?
Компонент более высокого порядка – это функция, которая принимает компонент и возвращает новый компонент.
Этот шаблон обычно реализован как функция, которая в основном является классовой фабрикой.
Реагистрирование использует компоненты более высокого порядка (HOCS) в качестве альтернативы наследству. Аналогично функциям более высокого порядка, которые принимают или возвращают другие функции
const EnhancedComponent = higherOrderComponent(wrappedComponent)
Если вы использовали React-redux, вы, вероятно, уже использовали хотя бы один компонент высшего порядка. Одной из его основных функций является Contect который принимает компонент и возвращает компонент, подключенный к магазину Redux, упаковка прилагается. Он экономит вам хлопот управления логическим подключением к магазину в нескольких местах в вашем приложении.
Что я могу сделать с HOCS?
HOC может быть использован для
- Повторное использование кода и логическое абстракция
- Реквизит манипуляции
- Государственная абстракция и манипуляция
- Оказать угон
В этой статье мы сосредоточимся на повторном использовании кода и о том, как мы можем использовать компоненты более высокого порядка как альтернативы наследству
Проблема
Допустим, у вас есть OnClick
и Одежда для событий Onchange
Доступ к государству, и вы планируете использовать этот обработчик событий в кучу разных компонентов. Вы могли бы, конечно, создать много дублированного кода. Помните правило, не повторяйте себя (сухой).
Допустим, у вас есть сигнал и компонент регистрации
Signin Component.
class SignIn extends React.Component { constructor(props) { super(props); this.state = { email: '', password: '', name: '', }; this.handleInputChange = this.handleInputChange.bind(this); this.handleOnSubmit = this.handleOnSubmit.bind(this); } handleInputChange(event) { this.setState({ [event.target.name]: event.target.value }); } handleOnSubmit(event) { event.preventDefault(); const { email, password } = this.state; const userObj = { email, password } this.props.signIn(userObj); } render() { const { email, password } = this.state; return (export default connect(null, { signIn })(SignIn);
Зарегистрироваться Компонент
import React from 'react'; class SignUp extends React.Component { constructor(props) { super(props); this.state = { email: '', password: '', username: '', name: '' }; this.handleInputChange = this.handleInputChange.bind(this); this.handleOnSubmit = this.handleOnSubmit.bind(this); } handleInputChange(event) { this.setState({ [event.target.name]: event.target.value }); } handleOnSubmit(event) { event.preventDefault(); const { email, password } = this.state; const userObj = { email, password, name } this.props.signIn(userObj); } render() { const { email, password, name, username } = this.state; return (export default connect(null, { signUp })(SignUp);
Вы заметите что-то преимущественную об этом двум компонентам, есть повторение кода. Если мы хотим ввести обработчик событий OnClick и обработчики событий Onchange в произвольные компоненты без избыточности, HOC идеален.
Создание компонента более высокого порядка
Перед созданием компонента более высокого порядка нам придется сломать наши компоненты в контейнерные и презентационные компоненты
В этом мире компоненты могут быть классифицированы в те, которые получают доступ к глобальному государству, а те, которые не имеют.
Контейнерный компонент: Компонент контейнеров – это компоненты, которые имеют прямой доступ к глобальному состоянию I.E, подключенный к магазину Redux. Они также предоставляют данные и поведение презентационным или другим компонентам контейнера. Они часто являются государственной, так как они имеют тенденцию служить источниками данных.
Предварительная компонент: также называются функциональными компонентами они R Имеют свое собственное состояние (когда они делают, это государство пользовательского интерфейса, а не данные). Y записывается как функциональный компонент, если они не нуждаются в состоянии, крючки жизненного цикла или оптимизации производительности.
Это сказано, давайте вернемся к реструктуризации наших компонентов. Первое, что мы собираемся сделать, это преобразовать наши войти в систему и регистрацию компонента в функциональный и компонент без вождения
Signin Component.
import React from 'react'; function SignIn(props) { const {oChange, onSubmit, showSignup } = props; return (
Регистрация компонента
import React from 'react' function SignUp (props) { const {onSubmit, onChange, showSignin} = props return (
Отображение и оформление при щелчке переключателей между Signin и компонентом регистрации.
Теперь, когда мы изменили наш компонент, следующая вещь, которую мы собираемся сделать, это создать компонент более высокого порядка
Компонент высшего порядка (HOC)
import React from 'react'; function authenticate(WrappedComponent) { class Authenticate extends React.Component { constructor(props) { super(props); this.state = {}; this.onInputChange = this.onInputChange.bind(this); this.submit = this.submit.bind(this); } onInputChange(event) { event.preventDefault(); const inputName = event.target.name; const inputValue = event.target.value; this.setState({ [inputName]: inputValue }); } submit() { this.props.onSubmit(this.state); } render() { const { onSubmit, ...otherProps } = this.props; return (); } } return Authenticate; } export default authenticate;
Важная часть вот в том, что метод рендера Возвращает Реагнийный элемент типа Ворванкомпонент. Мы также передаем реквизиты HOC получает.
Следует отметить, что в этом примере мы передали все реквизиты от наших аутентифицировать . HOC к обернутую компоненту с использованием оператора распространения. Обычно это рекомендуется, так как он позволяет использовать HOC вместо обернутого компонента.
Следующее, что мы собираемся сделать, – это разместить систему и компонент регистрации в одном компоненте, этот компонент будет называться index.jsx, он будет служить компонентом контейнера для двух компонентов
Индекс компонента
import React from 'react'; import SignIn from './SignIn'; import SignUp from './SignUp'; import {signInUser, signUpUser} from '../actionCreators' import authenticate from './authenticate'; const SignUpForm = authenticate(SignUp); const SignInForm = authenticate(SignIn); class Authentication extends React.Component { constructor(props) { super(props); this.state = { userAccess: true, }; this.toggleForm = this.toggleForm.bind(this); } toggleForm() { this.setState({ userAccess: !this.state.userAccess }); } render() { const { signInUser, signUpUser } = this.props; return ({ this.state.userAccess ? (); } } export default connect( null, {signUpUser, signInUser} )( Authentication);) : ( ) }
Здесь мы абстрагировали всю нашу логику в HOC и передаем ее до обернутого компонента, который является нашими компонентами входа и регистрации. Мы создаем компонент более высокого порядка, просто проходив в компоненте для обертывания.
const EnhancedComponent = higherOrderComponent(wrappedComponent)
Теперь можно использовать где угодно зарченокомпонент
Использовался ранее, так как он вернул компонентную упаковку ворчанкомпонанс.
Имейте в виду – в большинстве случаев HOC вернет что-то, что выглядит как оригинальный компонент. Для достижения этого вам часто приходится проходить пропорты HOC и остальные статические методы, которые могут существовать в оригинальном компоненте.
Вы можете найти больше информации об этом в конце статьи Facebook.
Заключение
HOC потрясающий, они находятся в сердце кодификацию разделения проблем в компонентах в Функциональный способ.
Я надеюсь, что после прочтения этого поста вы знаете немного больше о React Hocs. Они очень выразительны и доказали, что они довольно хороши в разных библиотеках.