1. 程式人生 > 實用技巧 >[React] Manipulate the DOM with React refs

[React] Manipulate the DOM with React refs

React is really good at creating and updating DOM elements, but sometimes you need to work with them yourself. A common use case for this is when you’re using a third party library that wasn’t built for or with React specifically. To do this, we need to have some value that’s associated with our component (like state) to store a reference to the DOM element, but doesn’t trigger re-renders when it’s updated (unlike state). React has something specifically for this and it’s called aref

.

You create arefobject with theuseRefhook and that object’scurrentproperty is the current value of theref. It can be anything, but if you pass thatrefobject to a component as a prop calledref, then React will set thecurrentproperty to the DOM element it creates so you can reference it and manipulate it in youruseEffect

hook.

In this lesson we’ll get to see how that works with a cool library calledvanilla-tilt.

function Tilt({ children }) {
      const tiltRef = React.useRef();

      // refs provide a way to access DOM nodes or React elements created in the render method.
// we need to access DOM thought ref, so we need to render the DOM first, useEffect hook
// is the prefect place to do it.
React.useEffect(() => { // useRef returns a mutable ref object whose .current property is initialized to the passed argument (initialValue). const tiltNode = tiltRef.current; // The returned object will persist for the full lifetime of the component. const vanillaTiltOptions = { max: 25, speed: 400, glare: true, 'max-glare': 0.5 }; // Initiating VanillaTilt and passing tiltNode and vanillaTiltOptions VanillaTilt.init(tiltNode, vanillaTiltOptions); return () => { // ensuring that any node refs in memory get garbage collected // prevent memory leaks tiltNode.vanillaTilt.destroy(); }; // adding a dependencies array, to avoid multiple renders }, []); return ( // Referencing the useEffect hook return <div ref={tiltRef} className="tilt-root"> <div className="tilt-child">{children}</div> </div> ); }