>  > TEIN スプリング S.TECH ミディアム ロードスター NA8C SKM40M-1B00

TEIN スプリング S.TECH ミディアム ロードスター NA8C SKM40M-1B00

ブログのReactを16.8にあげてReact Hooksで書き換えてみた

devjavascriptreact

2019/02/06にReact16.8がリリースされ、16.7のalphaから入っていたBN SPORTS BNスポーツ フルセット 未塗装 セドリック 32
そこで今回このブログで使われているReactを16.8に上げて、ステートフルなコンポーネントをReact Hooksを使いFunction Compoenentに書き換えてみました。

React Hooksの解説をした記事はたくさんあると思うので、今回は書き換えてどう変わったかを見ていきましょう。
該当する部分はHeaderの検索フォームです。

プルリクエストだけ見たいかたはこちら。
SSR EXECUTOR CV02 8.0J-19 とHANKOOK VENTUS V12 evo2 K120 245/40R19の4本セット

TEIN スプリング GSX250R S.TECH 送料無料 ミディアム ロードスター NA8C SKM40M-1B00

スプリング S.TECH NA8C ミディアム TEIN SKM40M-1B00 ロードスター スプリング S.TECH

これはいろんな記事で言及されているuseStateを用いて書き換えます。
useStateに初期値を引数として与えると、値と更新用の関数が返ってきます。

js
const NewComponent = props => {
 const [query, updateQuery] = useState('')
 const handleInput = (e) => {
 updateQuery(e.target.value)
 }
 return <input onChange={handleInput}/>
}

【TL1000R/1998~用】前後タイヤ ミシュラン パイロットパワー 2CT 120/70ZR17 190/50ZR17 MICHELIN PILOT POWER 2CT componentDidMountの書き換え

書き換え前のClassComponentです。主にデータの取得とキーボードイベントのつけ外しです。
コンポーネントの各所に処理が散らばってて可読性が低い状態です。

js
class OldComponent from Component {
 async componentDidMount() {
 const res = await axios.get('/search.json')
 this.setState({ data: res.data })
 this.focusShortcutHandler = this.focusShortcut.bind(this);
 window.addEventListener('keydown', focusShortcutHandler)
 }
 componentWillUnmount() {
 window.removeEventListener('keydown', focusShortcutHandler)
 }
 focusShortcut(e) {
 if (e.keyCode === keyCodes.SLASH && !this.state.isActive) {
 this.focusInput()
 e.preventDefault()
 }
 }
}

useEffectで書き換えると以下のようになります。
useEffectはcomponentDidMount, componentDidUpdateのタイミングで呼ばれて、returnで返した関数がcomponentWillUnmountのタイミングで呼ばれるHookと考えてください 【送料無料】 175/70R14 14インチ KYOHO 共豊 スマック プライム ヴァニッシュ 5.5J 5.50-14 YOKOHAMA ヨコハマ エコス ES31 サマータイヤ ホイール4本セット フジコーポレーション。
つまりイベントの付け外しが同じHooksの中で操作出来るので、以前は散らばっていた同じような処理がまとめられ読みやすくなっていると思います。

また、axiosでデータ取得を行っている部分はコンポーネントがマウントされたタイミングでのみ実行したいので第2引数に[]を渡しています。(第2引数は監視したい値を配列で渡す。この場合変更を監視しないという意味でから配列を渡している)

useEffectに関してはReactの公式ドキュメントに詳しく書いてあるので読むといいでしょう。
https://reactjs.org/docs/hooks-effect.html

js
const NewComponent = (props) => {
 useEffect(() => {
 axios.get('/search.json').then(res => {
 updatePosts(res.data)
 })
 return undefined
 }, [])
 useEffect(() => {
 const focusShortcut = (e: KeyboardEvent) => {
 if (e.keyCode === keyCodes.SLASH && !isActive) {
 inputEl.current.focus()
 e.preventDefault()
 }
 }
 window.addEventListener('keydown', focusShortcut)
 return () => {
 window.removeEventListener('keydown', focusShortcut)
 }
 })
 return <div/>
} 

オリジナル ラゲッジマット プレミアム SUZUKI スズキ エブリイ (バン用ラゲッジ) 年式 H27/2~次モデル [エブリイ 10バン-ラゲッジ] 車種別 カーマット 床 車 【代引不可】【受注生産品】BELLEZZA(ベレッツァ):Selection セレクション シートカバー(ブラック) BESEM828B3 prevStateを利用するcomponentDidUpdateの書き換え

Hooksの公式Q&Aにもある内容ですが、prevStateとstateを比較して処理を行う部分があってその書き換えにusePreviousというCustom Hooksを利用しました。

もともとのコードがあまり綺麗でないのはご愛嬌…

js
const usePrevious = (value) => {
 const ref = useRef(null)
 useEffect(() => {
 ref.current = value
 })
 return ref.current
}
const NewComponent = () => {
 const inputEl = useRef(null)
 const prevMobileShow = usePrevious(props.isMobileShow)
 if (prevMobileShow !== props.isMobileShow) {
 window.setTimeout(() => {
 inputEl.current.focus()
 }, 10)
 }
 return <input ref={inputEl} />
}

js
const filterPosts = (posts, query) => {
 return posts.filter(item => {
 const itemString = `${item.title} ${item.tags.join('')}`.toLowerCase()
 if (!(itemString.indexOf(query) > -1)) {
 return false
 }
 return true
 })
}
const NewComponent = (props) => {
 const [query, updateQuery] = useState('')
 const [posts, updatePosts] = useState([])
 const filteredPosts = useMemo(() => filterPosts(posts, query), [posts, query])
 return <div />
}

React公式のスタンスとしては、React Hooksへの利用を強制するようなものではない…1としているので今まで通りの書き方を続けてもいいが、ぜひReactユーザーにはHooksを触って欲しいと思いました。

  1. You don’t have to learn Hooks right now. Hooks have no breaking changes, and we have no plans to remove classes from React. https://reactjs.org/blog/2019/02/06/react-v16.8.0.html [Bellezza] ベレッツァ プレミアム PVCタイプ シートカバー フレアワゴンカスタムスタイル MM53S H30/2~ 4人乗 [ハイブリッドXG] ※北海道は送料2300円(税込) 沖縄・離島は要確認

B!
dev

ReactのUIコンポーネントライブラリに「Sancho UI」はいかが?

GW満喫していますか?私はNext.jsとCloud Functionsを組み合わせたり、FirebaseをバックエンドとしたSPAの検証や、SwiftでiOSアプリを書いて満喫しています イグニッションコイル 6本セット 90919-02230 純正同等品【トヨタ ヴェロッサ GX110】。 こう

emotionreact
event

技術書典6にサークル参加したけど反省点が多すぎた

前回に引き続き、技術書典6にサークル主として参加させていただきました。 技術同人誌界隈はかつてない盛り上がりを見せており、今回のサークル当落発表の際は地獄のようなタイムラインになっていました。そうい

技術書典
summary

最近見つけた気になる作図系Webサービス3選

今年に入って見つけた作図、画像生成系のサービスをまとめてみました。 > BlobmakerBlobmaker 最近見かけることが多くなった、丸みのある形状をランダムで生成する画像メーカー NARDI ステアリング トヨタ ランドクルーザープラド 70系 S59~8/4 FET BOSS KIT(FET ボスキット)・NARDI(ナルディ) ステアリングセット ステアリングボス BOSS〔FB522〕/ステアリング〔N754〕。

{yahoojp} {mottox2.com}

{yahoojp}jpprem01-zenjp40-wl-zd-3663