Почему и когда использовать перекомпоновать ветку?
Я искал вокруг и после прочтения некоторых вещей, я все еще не получил, когда я использую recompose
branch
над if-else
Скажите в ответ или зачем вообще его использовать? Кто-нибудь может упомянуть хороший источник или объяснить это? Спасибо
2 ответа
Может использоваться вместо if..else
или троичный оператор, где состав функции является предпочтительным. Recompose предоставляет функциональную композицию для компонентов React. Как и другие Рекомендовать компоненты высшего порядка, branch
HOC может быть составлен с compose
:
const fooPredicate = ({ type }) => (type === 'foo');
const FooHOC = Comp => props => <Comp ...props>Foo</Comp>;
const BarHOC = Comp => props => <Comp ...props type="bar">Bar</Comp>;
const FooOrBarHOC = branch(fooPredicate, FooHOC, BarHOC);
const SomeHOC = compose(BazHOC, FooOrBarHOC);
const SomeExampleComponent = SomeHOC(ExampleComponent);
Все функции, участвующие в SomeExampleComponent
многоразовые и могут быть проверены и использованы отдельно друг от друга.
В случае, если дело простое, и эти функции не предполагается использовать с каким-либо компонентом, кроме ExampleComponent
, это может быть упрощено до:
const SomeExampleComponent = BazHOC(props => (
props.type === 'foo'
? <ExampleComponent ...props>Foo</ExampleComponent>
: <ExampleComponent ...props type="bar">Bar</ExampleComponent>
));
ветвь от перекомпоновки - один из лучших способов избежать if-else в ваших компонентах
branch(
condition,
leftHOC,
rightHOC
)(MyComponent)
если условие истинно, то
MyComponent передается в leftHOC, иначе он передается вправо.
Предположим, вам нужно показать состояние загрузки до тех пор, пока данные не станут доступны, тогда мы также можем использовать renderComponent из перекомпоновки.
branch(
props=>props.loading,
renderComponent(Loader),
myComponent=>myComponent,
)(MyComponent)
Несмотря на то, что ответ Estus достаточно хорош и отвечает, как используется вместо if..else или тернарный оператор, я хотел бы упомянуть друг о друге случаи использования ветвления, которые мы используем в нашем проекте, когда мы хотим визуализировать компонент внутри другого компонента на основе некоторые условия с помощью renderComponent(), который полезен в сочетании с branch() (в нашем проекте мы обычно используем его для рендеринга немых компонентов, модальных компонентов и т. д.)
branch<WrappedProps>(
props => props.success,
renderComponent(ShowSuccessModal)
)
Так что в этом примере всякий раз, когда props.success
в нашем контейнере стало верно, модальный компонент будет визуализирован.