Next.js: рдЕрдЧрд▓рд╛ 9 - рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛<link/> рдЖрдЧрд╛рд╣ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдЬреБрд▓ре░ 2019  ┬╖  32рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vercel/next.js

рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ

<Link/> рдХрд╛рд░рдгреЛрдВ рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

V8 => v9 рд╕реЗ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдРрд╕рд╛ рд╣реБрдЖред

рдкреНрд░рдЬрдирди рдХрд░рдирд╛

рдкреНрд░рдЬрдирди рд░реЗрдкреЛ: https://github.com/nickluger/nextjs-link-ref-functional-n-

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

<Link/> рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╣реБрдд рдЕрдзрд┐рдХ / рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рдгрд╛рд▓реА рдХреА рдЬрд╛рдирдХрд╛рд░реА

  • Next.js рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг: 9.0.1

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

Link рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗрдВ? рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди, рдХрдо рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХрдо рд╕реЗ рдХрдо <Link href="/" forwardRef>...</Link> рдЬреИрд╕рд╛ рдХреБрдЫ?

рд╕рднреА 32 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рднреАред рдпрджрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ:

        <Link href="/href">
          <Button
            type="custom"
            color="#FCFCFC"
          >
             buttonText
          </Button>
        </Link>

рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдЖрдк рдПрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:

        <Link href="/href">
          <button
            type="custom"
            color="#FCFCFC"
          >
            buttonText
          </button>
        </Link>

        <Link href="/href">
          <a>
            <Button
              type="custom"
              color="#FCFCFC"
            >
              buttonText
            </Button>
          </a>
        </Link>

рдХреНрдпрд╛ рдЗрд╕ рдмрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ? рд╣рдо рдЗрд╕реЗ 9 рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХ рд░рд╣реЗ рд╣реИрдВ, рдЬрдм рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣рд╛рдпрддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдмрд╕ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдпрд╣ 9.0.3 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрдХреНрдХрд░: /

рдЖрдк рдЗрд╕реЗ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

// TODO: Muting error, fix as soon as zeit/next.js/issues/7915 resolved
const originalError = console.error;

console.error = (...args) => {
  if (/Warning.*Function components cannot be given refs/.test(args[0])) {
    return;
  }
  originalError.call(console, ...args);
};

рдореИрдВ рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реВрдБред

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП <Link/> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк ref рдХреЛ рдЗрд╕ рддрд░рд╣ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const CustomComponent = React.forwardRef(function CustomComponent(props, ref) {
  return (
    <div/>
  );
});
<Link href={"/"}>
  <CustomComponent/>
</Link>

рдЪреЗрддрд╛рд╡рдиреА рджреЗрдХрд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ 9.0.4-canary.2 рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдХрдВрд╕реЛрд▓ рдкрд░ рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓рддреА рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?

Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

Check the render method of `Link`.

@ th0th рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ React.forwardRef рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣:

import React from 'react'
import Link from 'next/link'

const CustomComponent = React.forwardRef((props, ref) => (
  <a ref={ref} {...props}>
    Click
  </a>
))

export default () => (
  <Link href='/' passHref>
    <CustomComponent/>
  </Link>
)

Link рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗрдВ? рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди, рдХрдо рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХрдо рд╕реЗ рдХрдо <Link href="/" forwardRef>...</Link> рдЬреИрд╕рд╛ рдХреБрдЫ?

@Nickluger рд╕реЗ рд╕рд╣рдордд рдпрд╣ рдХрд╛рдЙрдВрдЯрд░-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЕрдиреНрдп рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ forwardRef рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рд╢рд╛рдпрдж рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ forwardRef рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп React.forwardRef рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ?

рд╣рд╛рдВ @nickluger рд╕реЗ рд╕рд╣рдордд Link рдЕрдВрджрд░ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рд╣реИред

рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ (@ijjk) рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдФрд░ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирдпрд╛ рдЦреЛрд▓ рджрд┐рдпрд╛ рд╣реИ?

рдореБрдЭреЗ рднреАред рдпрджрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ:

        <Link href="/href">
          <Button
            type="custom"
            color="#FCFCFC"
          >
             buttonText
          </Button>
        </Link>

рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдЖрдк рдПрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:

        <Link href="/href">
          <button
            type="custom"
            color="#FCFCFC"
          >
            buttonText
          </button>
        </Link>

        <Link href="/href">
          <a>
            <Button
              type="custom"
              color="#FCFCFC"
            >
              buttonText
            </Button>
          </a>
        </Link>

рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рдХрдВрд╕реЛрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛:

Warning: validateDOMNesting(...): <a> cannot appear as a descendant of <a>.

рдЬрдм рдореИрдВ рдиреЗрдХреНрд╕реНрдЯ рдЬреЗрдПрд╕ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдорд╛рд░рд╛ред рдХреНрдпрд╛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреЛрдИ рдлрд┐рдХреНрд╕ рд╣реИ?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдлреЙрд░рд╡рд░реНрдб рд░реАрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдореЗрд░реЗ рдШрдЯрдХ рдХреЛ рд▓рдкреЗрдЯреЗрдВред рдореЗрд░рд╛ рдмрдЯрдиред Js рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрди рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ ...ред

const Button = (props) => {
    return (<stuff />)
}

export default React.memo(Button)

рдКрдкрд░ рджреЗрдЦреЗрдВ, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЕрдиреБрд╡рд░реНрддреА рдЦреЛрд▓рд╛: https://github.com/zeit/next.js/issues/8962

рдЬрдм рдореИрдВ рдиреЗрдХреНрд╕реНрдЯ рдЬреЗрдПрд╕ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдорд╛рд░рд╛ред рдХреНрдпрд╛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреЛрдИ рдлрд┐рдХреНрд╕ рд╣реИ?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдлреЙрд░рд╡рд░реНрдб рд░реАрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдореЗрд░реЗ рдШрдЯрдХ рдХреЛ рд▓рдкреЗрдЯреЗрдВред рдореЗрд░рд╛ рдмрдЯрдиред Js рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрди рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ ...ред

const Button = (props) => {
    return (<stuff />)
}

export default React.memo(Button)

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

import {forwardRef} from 'react';
const Button = forwardRef(props, ref) => {
    return (<stuff ref={ref} />)
}

рдЖрдЧреЗ рдХреЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдПред рдбреЙрдХреНрд╕ рдиреЗ https://nextjs.org/docs#forcing -the-link-to-expose-href-to-its-child рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реИ

            <Link
              href={href}
            >
              <a>
                {text}
              </a>
            </Link>

рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдмрд╣реБрдд рд╡рд┐рд╖рдо рджрд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрджред)

9.0.2 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛

<a></a> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди a11y рдФрд░ рд╕рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рдЬреИрд╕реЗ "href рд╣реИ рдЪрд╛рд╣рд┐рдП", рдЖрджрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: 15mn рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛, рдпрд╣ рдмрд╣реБрдд рдЙрдмрд╛рдК рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреА рдмрд░реНрдмрд╛рджреА, рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд╛рд╡рдЬреВрдж рдареАрдХ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд▓рдЧрддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, https://github.com/zeit/next.js/issues/7915#issuecomment -511792629 рдкрд░ рдЬрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдПрдХ рдЕрд╕рд░ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

import React, { Fragment, useRef } from 'react';
import { MyFunctionalComponent } from './my-functional-component';

const App = props => {
  const myRef = useRef();

  return ( 
    <Link href={href}>
      <Fragment>
          <MyFunctionalComponent ref={myRef} />
      </Fragment>
    </Link>
  );
}

рдЬрд╣рд╛рдБ <MyFunctionalComponent> рдлреЙрд░рд╡рд░реНрдб рд░реЗрдлрд░реА:

import React, { forwardRef } from 'react';

const MyFunctionalComponent = forwardRef(props, ref) => (
  <div ref={ref} />
);

рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд HTML рд░реИрдкрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ ( <div /> ) рдФрд░ рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

@ Hill84 рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ myRef рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ?

@Vadorequest рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдФрд░ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝ рджрд┐рдП рд╣реИрдВред

@ Hill84 рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдерд╛:
`` `
const ButtonLink: рдПрдлрд╕реА= ({рдмрдЪреНрдЪреЗ, href, ... рдкреНрд░реЙрдкреНрд╕}) => (
<

@ Hill84 рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдерд╛:

const ButtonLink: FC<ButtonLinkProps> = ({ children, href, ...props }) => (
  <Link href={href}>
    <><Button link {...props}>{children}</Button></>
  </Link>
);

рдореИрдВ <><Component/></> рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп <div></div> рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдПрдХ рдШрдЯрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЙрдкрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ:

const propsUserBtn = user => ({
    className: "h-10 w-10 font-black rounded-full bg-orange-200 text-teal-700",
    title: user.first_name + ' ' + user.last_name,
    children: (user.first_name.charAt(0) + user.last_name.charAt(0)).toUpperCase()
})
<Link href='/profile'>
    <button { ...propsUserBtn(user) } />   
</Link>

рдЬрд╛рдБрдЪ рдХреА, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдХреНрдпреЛрдВ рдЗрд╕ рд░реЗрдлрд░реА рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓рд┐рдкрдЯреЗ рдШрдЯрдХ рдореЗрдВ href рдХреЗ рд╕рд╣реА рд╕реНрдерд╛рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрдм passHref рдХрд╛ рдЙрдкрдпреЛрдЧ <Link /> ?

рдпрд╣ рд╕реБрдкрд░ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдХрд╕реНрдЯрдо

рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдШрдЯрдХ рдореЗрдВ href рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред <Link href="/" passHref useRef /> ?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреЛ рд░реЗрдлрд░реА рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рджреЛрд╣рд░рд╛рд╡рджрд╛рд░ рднреА рд╣реИред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреЛ div рддрддреНрд╡ рдХреЗ рд╕рд╛рде @ namlq93 рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдореБрдЭреЗ рднреАред рдпрджрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ:

        <Link href="/href">
          <Button
            type="custom"
            color="#FCFCFC"
          >
             buttonText
          </Button>
        </Link>

рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдЖрдк рдПрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:

        <Link href="/href">
          <button
            type="custom"
            color="#FCFCFC"
          >
            buttonText
          </button>
        </Link>

        <Link href="/href">
          <a>
            <Button
              type="custom"
              color="#FCFCFC"
            >
              buttonText
            </Button>
          </a>
        </Link>

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрдд !!

рдПрдХ рд╕рдорд╛рди рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реВрдБ

рдЕрднреА рддрдХ рд╡рд╣реАрдБ

https://nextjs.org/docs/api-reference/next/link#if -the-child-is-a-function-Components

рдпрд╣ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИред

рдореИрдВ рдЕрдЧрд▓реЗ рджрд┐рди рдХреЙрдиреНрдлреНрд░реЗрдВрд╕ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдХрд┐ рджреВрд╕рд░реЗ рджрд┐рди "рд╡рд╛рд╣ рдиреЗрдХреНрд╕реНрдЯ рдЗрдЬ рдж рдлреНрдпреВрдЪрд░" рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЗрдХреНрд╕реНрдЯ рдФрд░ рд╡рд░реНрд╕реЗрд▓ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рдХреАрд▓ рдмрдиреЛред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд┐рдП рдЬрд╛рдиреЗ рдФрд░ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдЬреИрд╕реЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХреЛ рдХрдИ рдмрд╛рд░ рдкреВрд░реЗ рдореБрджреНрджреЛрдВ рдкрд░ рджреЗрдЦрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рд╛рдеред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ 3 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдорд╣рд╛рди рдбреАрдПрдХреНрд╕ рдирд╣реАрдВ рд╣реИред

  1. рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ React.forwardRefред рдШрдЯрдХ рдХреЛ React.forwardRef рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред рдпрд╣ рдмрд╣реБрдд рджреЛрд╣рд░рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  2. div , span , a , рдЖрджрд┐ рдЬреИрд╕реЗ рдЯреИрдЧ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рд▓рдкреЗрдЯреЗрдВ
  3. рд▓рд┐рдВрдХ рдХреЗ рдмрдЬрд╛рдп, рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдЦреАрдВрдЪреЗрдВ рдФрд░ router.push рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рднреА рдЕрдЬреАрдм рд╣реИрдВ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ / рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдЖрдХрд╕реНрдорд┐рдХ рд╣рдЯрд╛рдиреЗ / рд╕рдлрд╛рдИ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕