Tapuscrit Réagir personnalisé crochet ref à l'élément div

0

La question

EDIT: j'ai configuré un codesandbox: https://codesandbox.io/s/magical-poitras-yogur?file=/src/App.tsx

Je suis en train de personnaliser un crochet à l'élément div à réagir à ajouter des écouteurs d'événement.

J'ai trouvé ce "général" de la solution:

function useMyCustomHook<T extends HTMLElement>{
    const myRef = useRef<T>(null)

    // do something with the ref, e.g. adding event listeners

    return {ref: myRef}
}

function MyComponent(){
    const {ref: myElementRef} = useMyCustomHook<HTMLDivElement>()

    return <div ref={myElementRef}>A Div</div>
}

de: Impossible d'attribuer RefObject<HTMLDivElement> pour RefObject<HTMLElement> exemple

Que j'ai essayé de mettre en œuvre dans mon code ci-dessous. J'ai joué pendant des heures et finalement eu une seule erreur, mais je ne sais pas comment le résoudre. L'erreur est dans mon useHover la fonction de l'expression à la première =. l'erreur est: '(' expected.ts(1005)

mon code maintenant:

const Hooks = (props: any) => {
    const [hoverRef, hovered] = useHover();
    const style = {
        backgroundColor: hovered ? "red" : "",
    };

    return (
        <div ref={hoverRef} style={style}>
            <h1>Hooks!</h1>
        </div>
    );
};

                                          
const useHover:<HTMLDivElement extends HTMLElement> = () => {
                                      // ERROR HERE ^ the first equal sign. '(' expected.ts(1005)
    const [value, setValue] = useState(false);
    const ref = useRef<HTMLDivElement>(null);

    const handleMouseOver = () => setValue(true);

    useEffect(() => {
        const node = ref.current;
        if (node) {
            node.addEventListener("mouseover", handleMouseOver);

            return () => {
                node.removeEventListener("mouseover", handleMouseOver);
            }
        }
    }, []);

    return [ref, value];
};

Toute aide est appréciée!

react-hooks reactjs typescript
2021-11-24 05:57:28
1

La meilleure réponse

1

Essayez ceci: au Lieu d'utiliser un ref et impérativement la manipulation de natifs de DOM événements, créer des attributs de l'élément pour les événements que vous souhaitez traiter, et le retour de ces pour une utilisation avec votre Réagissent élément:

Remarque: Vous pouvez ignorer les CSS et les quatre premiers <script> éléments (ils sont juste là pour que le Tapuscrit de Réagir de la syntaxe du travail dans l'extrait de la démo).

body {
  font-family: sans-serif;
}

.target {
  border: 1px solid;
  padding: 1rem;
}
<script src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/[email protected]/babel.min.js"></script>
<script>Babel.registerPreset('tsx', {presets: [[Babel.availablePresets['typescript'], {allExtensions: true, isTSX: true}]]});</script>

<div id="root"></div>

<script type="text/babel" data-type="module" data-presets="tsx,react">

/**
 * The following line is here because this Stack Overflow snippet uses the
 * UMD module for React. In your code, you'd use the commented `import` lines
 * below it.
 */
const {useMemo, useState} = React;

// import {useMemo, useState} from 'react';
// import type {DetailedHTMLProps, HTMLAttributes, ReactElement} from 'react';

type HoverData<T extends HTMLElement> = {
  hoverProps: DetailedHTMLProps<HTMLAttributes<T>, T>;
  isHovered: boolean;
};

function useHover <T extends HTMLElement>(): HoverData<T> {
  const [isHovered, setIsHovered] = useState(false);

  const hoverProps: HoverData<T>['hoverProps'] = useMemo(() => ({
    onMouseEnter: () => setIsHovered(true),
    onMouseLeave: () => setIsHovered(false),
  }), [setIsHovered]);

  return {hoverProps, isHovered};
}

function Example (): ReactElement {
  const {hoverProps, isHovered} = useHover<HTMLDivElement>();

  return (
    <div>
      <h1>Hover the text below</h1>
      <div {...hoverProps} className="target">
        {isHovered ? 'Now move it away' : 'Move pointer here'}
      </div>
    </div>
  );
}

ReactDOM.render(<Example />, document.getElementById('root'));

</script>

2021-11-29 06:48:48

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................