Рубрики
Без рубрики

Включить ваши рендеры с обратными вызовами Render

Render Callbacks и рендеринг-реквизиты обеспечивают мощный способ абстрактной иерархии компонентов. Давайте включим свои навыки рендеринга, понимая их немного лучше.

Автор оригинала: Michael Scott Hertzberg.

Вы не можете почувствовать власть совсем, но мы собираемся включить наши навыки оказания, передавая функцию как ребенок:


  {() => {}}

Блэп

Ovbgwwi.jpg.

Ну, это было не очень захватывающе. Еще не по крайней мере. Что нам нужно сначала – это идея. Давайте построим панель инструментов поделиться! Это будет довольно просто. У нас будет ряд иконок: один, чтобы поделиться в Facebook; один, чтобы поделиться в Twitter; один, чтобы отправить по электронной почте; и один, чтобы скопировать постоянную ссылку. Звучит довольно просто. Я видел их на многих сайтах.

function ShareToolbar(props) {
  return (
    
  );
}

Это немного похоже на что-то. Не совсем ничего особенного. Но я хочу сделать немного больше здесь. Я хочу быть в состоянии стиль каждого из ссылок. Возможно, превратить их в кнопки социальных значков со значком SVG. Я могу захотеть, чтобы они были рассчитаны гиперссылки. Я также хочу создать «ящик» для постоянной ссылки, поэтому мы можем визуально увидеть короткий URL рядом со милыми кнопками.

giphy-downsized.gif.
const Item = (props) =>
  {props.children};

const Button = (props) =>
  ;

const Drawer = (props) =>
  props.isOpen ? {props.children} : null;

function ShareToolbar(props) {
  return (
    
      {props.children ? props.children({
          Item,
          Button,
          Drawer
      }) : null}
      
  );
}

export default ShareToolbar

Ну, это было сложно прямо быстро. Но, по крайней мере, это читается! (Я надеюсь). Мы имеем именно то, что мы сделали в первом примере, однако, вместо того, чтобы вернуть пустой объект или во втором примере, где мы возвращаем JSX, мы называем дети опоры как функцию (если она существует)

Почему это предложение почти не имеет смысла?

Призыв детей опоры как функция

Это, вероятно, потому что сначала просто сложно визуализировать, пока мы не развеваемся из примера. Давайте пойдем на противоположное направление и вместо этого дизайн, как мы хочу Чтобы использовать компонент:


  {({ Item, Button, Drawer }) => {
    return (
      
        
          
        
        
          
        
        
          
        
         {
          copy('https://google.com');
          alert('copied to clipboard.');
        }}>
          
          
            https://google.com
          
        
      
    );
  }}

Это читает гораздо яснее (надеюсь). Однако мы смотрим на псевдо-код, однако, с силой стилизованных компонентов, соглашения о именах на самом деле могут оставаться прежними. Они просто девты в конце концов.

{({ Item, Button, Drawer }) => { // the render callback, `ShareToolbar.children`
  ...
}}

Помните, как мы звонили ropps.Children как функция? Это эта функция, называемая. Это просто вседет между Sharetoolbar составная часть.

Что делает этот образец мощным, состоит в том, что он позволяет абстрагировать визуальную иерархию компонента и предоставлять возможность динамически составить представление о том, как мы хотели бы сделать его, по сравнению с этим, по сравнению с этим, чтобы сделать, чтобы сделать одним определенным способом.

Вы заметите, что этот шаблон начинает иметь больше смысла, когда речь идет о том, когда речь идет о том, чтобы противостоять уровню просмотра из слоя данных, в которых данные передаются в виде значений в обратном вызове Render, а не компонентами. Вы можете прочитать больше об этом в моем следующем посте, используя обратные вызовы Render для подключения не подключенных компонентов.