- 投稿日:2020-04-09T22:52:17+09:00
【React Router】URLパラメーターを取得する
TyepeScriptでReactRouterを扱う際に、URLパラメーターを取得するところで失敗した。
App.tsximport React from 'react'; const Characters: React.FC<{}> = (props) => { return ( <> {props.match.params.name} </> ); } export default Characters;エラーメッセージは
Property 'match' does not exist on type '{ children?: ReactNode; }'. TS2339RouteComponentPropsを用いる
matchはpropsに渡るオブジェクトに定義されてない。
そこでRouteComponentPropsとpropsの型を結合することでmatchが渡される。App.tsximport React from 'react'; +import { RouteComponentProps } from 'react-router'; +//interfaceの結合 +type urlProps = {} & RouteComponentProps<{name: string}>; const Characters: React.FC<urlProps> = (props) => { return ( <> {props.match.params.name} </> ); } export default Characters;URLパラメーターが渡った
ちなみに...
VSCode上でRouteComponentPropsに左クリックしてGo to Definitionで定義ファイルを開くとmatchがプロパティにあることがわかる。
index.t.tsexport interface RouteComponentProps<Params extends { [K in keyof Params]?: string } = {},C extends StaticContext = StaticContext,S = H.LocationState> { history: H.History<S>; location: H.Location<S>; match: match<Params>; staticContext?: C; }
- 投稿日:2020-04-09T21:23:18+09:00
Invalid hook call warningへの対処(重複を減らす / gatsbyとの相性)
何度、くじけそうになったか…
React Hooksを使い始めた頃、CRAなどで作ったサイトはともかく
Gatsbyを使った時など、かなりの頻度でInvalid hook call warningに見舞われ、最悪の思いをした人も少なくないでしょう。
この記事では、Invalid hook call warningとなかよくなるための「いくつかのルール」を教えます。
※ 原因は、こちらを読んでください
https://ja.reactjs.org/warnings/invalid-hook-call-warning.html
Yarnを使う
「いろんなReactが混じっている」は、Yarnを使うことで解消されます。
yarn dedupe
と打ってみてください。error The dedupe command isn't necessary. `yarn install` will already dedupe.
yarn install
とした時点でパッケージの重複がなくなりInvalid hook call warningの確率が減ります。yarn workspaceを使う
複数のリポジトリを管理していると、下みたいにReactが被ります。
フォルダ構成root ├ packageA - React@^16.13.2 └ packageB - React@16.12.0例えば、「packageBでカスタムフックを用意して、packageAで使っている」ような状況です。
packageA -> packageB
(依存関係)こうした状況で、Invalid hook call warningは起きやすいです。
こうした場合は、Yarn Workspaceを使いましょう。
少しフォルダ構成を変えましょう。
フォルダ構成root └ packages ├ packageA - React@^16.13.2 └ packageB - React@16.12.0
root
のフォルダにpackages
フォルダを作っただけです。バージョンは揃えておきましょう
packageA
とpackageB
のReactのバージョンは、どちらかに揃えましょう。例cd packages/packageB yarn upgrade Reactyarn workspaceを導入しましょう
root
フォルダに移動しましょうcd <path to root>初期化します。
yarn init -y
package.json
にworkspaces
を足します。package.json{ ..., workspaces: ["packages/*"] }**
ここで、事前に各パッケージの node_modules / yarn.lock / package-lock.json を削除しておきましょう
**
さて、
root
にてyarnを実行します。
これで、
React
がルートフォルダのnode_modules
に集約され、Invalid hook call warning の確率が減ります。Gatsbyでの Invalid hook call warning
GatsbyでInvalid hook call warningが起きたときは、何か別の原因が邪魔をしている場合があります。
とりあえず
gatsby buildと打ってみましょう。
そうすると「真のエラー」が出てくると思います。
それを調べ、直してから、もう一度
gatsby develop
で開発に戻りましょう。おわりに
たぶん、ここまでやっても起こるときは起こるのですが、多少はエラーでスタックする時間を減らせると思っています。
お役に立ちますように。
- 投稿日:2020-04-09T20:07:44+09:00
ユニークなIDを生成するuuidの3系 -> 7.0.3に対応(Deep requiring like `const uuidv4 = require('uuid/v4');` is deprecated)
ユニークなIDを付与したい
例えば、あるオブジェクトに対して、ファイル名などの被りによって処理に競合が発生してしまうとしましょう。
そんな時に使うパッケージがuuid。
使い方は皆さん下記参照。
uuid 3系 -> 7.0.3にアップデート
importの仕方が変わります。
これをしないとdeprecationのWarningが出続けます。console.js:39 Deep requiring like `const uuidv4 = require('uuid/v4');` is deprecated as of uuid@7.x. Please require the top-level module when using the Node.js CommonJS module or use ECMAScript Modules when bundling for the browser. See https://github.com/uuidjs/uuid#deep-requires-now-deprecated for more information.importは以下のように変更します。
- import uuidv4 from 'uuid/v4'; + import { v4 as uuidv4 } from 'uuid';これで、Warningは消えます。
以上、久々に仕事で記事を書くネタがあったので戦闘力(Contributions)を上げるために投稿してみました。
- 投稿日:2020-04-09T17:20:27+09:00
React hooksでcomponentWillUpdateとcomponentDidUpdateっぽい事をする
export const Component = (props: Hoge) => { const [hoge, setHoge] = useState(null) useEffect(() => { setHoge(props) // componentWillUpdate }, [props]) useEffect(() => { // componentDidUpdate }, [hoge]) return ( <div>{hoge}</div> ) }propsを一旦stateに格納する処理を挟むことで実現している。
アンチパターンだったら教えて下さい。
- 投稿日:2020-04-09T17:20:27+09:00
React HooksでcomponentWillUpdateとcomponentDidUpdateっぽい事をする
export const Component = (props: Hoge) => { const [hoge, setHoge] = useState(null) useEffect(() => { setHoge(props) // componentWillUpdate }, [props]) useEffect(() => { // componentDidUpdate }, [hoge]) return ( <div>{hoge}</div> ) }propsを一旦stateに格納する処理を挟むことで実現している。
アンチパターンだったら教えて下さい。
- 投稿日:2020-04-09T09:48:34+09:00