Один из способов сделать это - использовать контекстный API React, но вам придется обернуться довольно высоко в DOM, чтобы иметь возможность предоставлять установщики и получатели содержимого заголовка откуда угодно.
Компоненты заголовка будут выглядеть так:
const HeaderContext = React.createContext();
// Provides the context and state - wrap app
export class HeaderProvider extends React.Component {
state = {};
render() {
const { children } = this.props;
return (
this.setState({ header })
}}
>
{children}
);
}
}
// Wrapper around WHERE the header will be rendered
export function HeaderPlacement() {
return (
{({ header }) => header}
);
}
// Wrapper for setting the header CONTENT
export function HeaderPortal({ children }) {
return (
{({ header, setHeader }) =>
!header // Guard against setting the header in an endless loop
&& setHeader({ header: children })}
);
}
И тогда использование будет выглядеть так:
function App() {
return (
);
}
function Page() {
return (
Page A Test
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ex odio,
eleifend in consequat nec, maximus lobortis ligula. Duis elementum, diam
et imperdiet pulvinar, nulla ligula commodo elit, ac ullamcorper justo
mauris quis velit.
);
}
Вам нужно быть осторожным, если несколько потомков попытаются установить содержимое заголовка, потому что вы либо столкнетесь с проблемой зацикливания setState
, либо одна перезапишет другую.
Это определенно не единственный способ, и я избегал использования хуков, но это, безусловно, и способ React-y.
Проверьте коды и окно здесь: https://codesandbox.io/s/pj2q10700j
одолженный отсюда
%mon2num = qw(
jan 1 feb 2 mar 3 apr 4 may 5 jun 6
jul 7 aug 8 sep 9 oct 10 nov 11 dec 12
);
и получать
$mon2num{"jan"}
Вот еще один способ сделать это:
my %month; @month{qw/jan feb mar apr may jun
jul aug sep oct nov dec/} = (1 .. 12);
Импорт такого модуля вряд ли будет стоить так большой памяти, что необходимо воздержаться от него, хотя в этом случае, вероятно, простой хеш был бы так же хорош. Что-то как
my %number_for = (
jan => 1,
feb => 2,
#etc...
);
#...
do_something_with($number_for{$month})
my %month_num = do { my $i = 1; map {; $_ => $i++ } (
qw( jan feb mar apr may jun jul aug sep oct nov dec )
) };
Или возможно:
my %month_num;
$month_num{ $_ } = 1 + keys %month_num for (
qw( jan feb mar apr may jun jul aug sep oct nov dec )
);
Или использование функции zip:
my %month_num = do {
my @month = qw( jan feb mar apr may jun jul aug sep oct nov dec );
zip2( 1 .. 1+$#month, @month );
};
Хм - кажется, существует много чрезмерно сложных способов сделать это. Для чего-то эта простая ясность является ключевой:
# create a lookup table of month abbreviations to month numbers
my %month_abbr_to_number_lkup = (
jan => 1,
feb => 2,
mar => 3,
apr => 4,
may => 5,
jun => 6,
jul => 7,
aug => 8,
sep => 9,
oct => 10,
nov => 11,
dec => 12,
);
# get the number for a month
my $number = $month_abbr_to_number_lkup{$abbr}
|| die "Could not convert month abbreviation '$abbr' to a number.";
Другой способ сделать это использование части хеша:
@month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = 1..12;
Обратите внимание также, что ключи хеша чувствительны к регистру; в зависимости от того, где Ваши сокращения происходят от Вас, может хотеть вниз-заключить-в-корпус их сначала для соответствия ключам хеша.
%mon_2_num = (jan => 1,
feb => 2,
...);
$month_number = $mon_2_num{lc($month_name_abbrev)};
Это зависит от того, сколько управления датой Вы намереваетесь сделать. Сначала Вы, вероятно, более обеспечены с прокруткой руки это, например.
my @months = qw(Jan Feb Mar Apr May Jun
Jul Aug Sep Oct Nov Dec);
my %monthnum = map { $_ => $months[ $_ - 1 ] } 1..12;
(Я предпочитаю этот подход, потому что сравнительно очевидно, что Вы делаете - у Вас есть список месяцев, затем Вы отображаете их от 1.. 12 (числа, которые имеют смысл человеку) к 0.. 11 (числа, которые имеют смысл к компьютеру). Узкие места производительности в Вашем коде не будут в этом виде кода, они будут в сети, базе данных или получающем доступ к диску коде, таким образом сконцентрируются на создании Вашего читаемого кода.)
Поскольку Вы начинаете добавлять к своему коду, можно найти, что много этого материала уже сделано существующими модулями, и могло бы быть легче сделать часть простого материала с, например, Даты:: Calc. Или можно найти модуль даты/времени больше подходящим потребностей; это выходит за рамки этого вопроса.
Примите во внимание также, что некоторое авторазделение использования модулей, где только те части модуля, которые необходимы, загружаются. Кроме того, основное влияние производительности использования большого модуля является не обязательно RAM, это, вероятно, более вероятно, будет время/ЦП наверху загрузки и компиляции его, прежде чем любой Ваш код когда-либо работал.