React フックを使うと、React の機能をクラスを書かずに使えるようになります。useRef を使うとDOMを参照することができます。この記事では、useRefの使用例をあげています。
入力フォーム
ボタンをクリック時にインプット要素の値を取得します。
import React, { useRef } from "react";
function App() {
const inputRef = useRef(null);
const submit = (e) => {
e.preventDefault();
console.log(inputRef.current.value);
}
return (
<div className="App">
<form action="/">
<input type="text" ref={inputRef} />
<button type="submit" onClick={submit}>Send</button>
</form>
</div>
);
}
export default App;
1: useRef をインポートして、4: 初期化します。
14: input 要素の値を使いたいので ref={inputRef}
とします。
8: inputRef.current.value
でフォームの値を使うことができます。
スクロール
useRef を指定している要素まで、スクロールさせることができます。
src /
|-- App.css
`-- App.js
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.App {
width: 100%;
height: 200vh;
display: flex;
margin-top: 2rem;
align-items: center;
flex-direction: column;
justify-content: space-between;
gap: 1rem;
}
import React, { useRef } from "react";
import './App.css';
function App() {
const bottomRef = useRef(null);
const ScrollToBottom = () => {
bottomRef.current.scrollIntoView({
behavior: 'smooth',
block: 'start',
});
}
return (
<div className="App">
<button onClick={ScrollToBottom}>scroll</button>
<div ref={bottomRef}>bottom</div>
</div>
);
}
export default App;
scrollIntoView 15: ボタンをクリックすると、16: 指定した要素までスクロールします。
変数
useRef は変数として扱え、useState との違いは、変更しても再レンダリングされません。
import React, { useState, useRef } from "react";
function App() {
const [toggle, setToggle] = useState(false);
const inputRef = useRef(0);
return (
<div className="App">
{inputRef.current}
<butotn onClick={() => { inputRef.current++ }}> + </butotn>
<button onClick={() => { setToggle(!toggle) }}>show</button>
</div>
);
}
export default App;
10: useRef を使った変数の値をクリックで増加させます。値は増加しますが、再レンダリングされないので 9: 値に変化されません。
11: useState 更新時の再レンダリング時に 9: 値が反映されます。
以上です。