Next.js入門①~初めでつまづく~
Next.jsを始めるとすると、用語がたくさん出てきます。
ここでは、用語を挙げるにとどめます(自分も説明できるほど理解できていない)
React経験者とそうでない場合に分けたいと思います。
[非React経験者編]
React、JSX、コンポーネント、ルーティング、状態(state)、React Hooks、ライフサイクル、副作用、Redux、redux tool kit、
[React経験者編]
App Router、Pages Router、SSR、CSR、SSG、Edge Runtime、TypeScript、ESLint、Tailwind
と挙げればキリがない。
ここでは、覚書きのような書き方になるので、もう少し構造的なHP見たい方は下記参照。
JavaScriptがわからなくても大丈夫!Next.jsのやさしい入門ガイド
ここでは、Next.js14で、Pages Routerでやっていきます。(上のホームページも、Next.jsのバージョンは不明だが多分そうやっている)
npx create-next app [プロジェクト名] のコマンドを使用します。
Pages Routerのときと、App Routerの時では、ディレクトリ構造が異なりますので留意が必要です。ページはpagesディレクトリ以下に作成し、その他のファイルはpagesと同レベルに、componentsディレクトリを作成し、その中に入れていきます。
調べていくと、React.jsはライブラリで、その延長上にNext.jsというフレームワークがあるというのは正しいようで誤りであるのかもしれません。
Next.jsで、React.jsっぽく書くことはできますが、Next.jsではそれ以外の選択肢も複数あります。まずは、React.jsっぽく書く、すなわち、前提条件を作ってReact.jsと同じかきかたで書いていくこととします。(この時点で自分でも半分意味が分かっていません)
SSRは使用せず(SSR用のメソッドを使用しない)、API Routeは使用せず(今は知らないからどうせ使えない)、React.js同様レンダリングでのデータ取得はCSRでとるということにすれば(また、fetchやaxiosはuseEffect内に記載)、React.jsと同じように扱えるし、ビルドの時も少し設定を変えるだけでビルドできる。
プログラミングしたプロジェクトを動かして見たいというのはだれしも思うものである。firebase hostingは割合なじみがあるのでそれでやってみることとする。
https://blog.hatena.ne.jp/yuuzaki2022/yuuzaki2022.hatenablog.com/edit?entry=4207112889967093862
expo-sqliteが新しくなっていて使いやすいので使ってみる
下記HPを参照にします。
React NativeからローカルのSQLiteデータベースを操作する方法を確認 | アールエフェクト
① 以前のものと比べてどうなっているかを、共通点と相違点を押えながら、簡単に書いてみます。
・openDatabaseメソッドではなく、openDatabaseAsyncメソッドに変更されてます
。引数の数と階層の深さが圧倒的に減ってます。
・executeSQLメソッドが、execAsync メソッドに変更されてます。
` `の中に、SQL分を記載することができるし、データベースに入れたい値を、プレースホルダーを使用することなく、JSXの特性を生かして、INTEGER(数値)なら単に、 ${ intValue }でよく、テキストは、'${valueText}'と記載することで使える。
② さて、これを踏まえて、用語とその説明を記入するテキストボックスがあって、
その下の『確定』ボタンを押すと、データベースに保存され、下記のリストへ表示されるようにする。
App.js
ただし、これでは、下記のエラーが出ます。
VirtualizedLists should never be nested inside plain ScrollViews with the same orientation because it can break windowing and other functionality - use another VirtualizedList-backed container instead.
どういったエラーかというと、ScrollViewにFlatListを入れたらダメというエラーです。
次はこれについて考えていきます。
ググるといろいろな対処法が出てきます。
上のコードで、ScrollViewをViewに変更するとどうなるかですが、上の部分は固定で、
リストの一覧表示のところだけスクロールできるようになります。
【React Native(Expo)】 知らないと意外とアプリ作成に手間取るアイコン利用の仕方
はじめに
アイコンをつかうのは、アプリ作成では必須です。これはライブラリを使ってみます。
前提
要約
これを、react-native-vector-iconsライブラリで実現します。といっても、
react-native-vector-iconsライブラリの使用方法は割合ネットにあります。
ここでは、アイコンを置く位置の決め方と、イベント処理の追加をやってみます。
本文
プロジェクト内に、Fontsディレクトリを作成し、そこに、node-modulesのreact-native-vector-icons内の、AntDesign.ttfをコピーしたものをペーストする。
そして、冒頭に下記を記載する。
これで、Iconコンポーネントが使用できるようになる。
App.js
containerスタイルに、position: 'relative' を入れておいて、
その子コンポーネントに、postion: 'absolute' 、top:100、left: 100
を追加すればよい。
後で知ったのですが、Iconコンポーネントに、onPress属性が使えるようです。
総論
アイコンが使えるようになると、アプリ作成に便利ですね。
【React Native(Expo)】 端末の向きを変更した際に、自動回転させる
はじめに
端末の向きを変更した際に、自動回転させたいと思い、React Nativeでどのようにこれを実現するかということを調べてみました。
前提
主要なライブラリのバージョンは下記のようになってます。
"expo": "~51.0.28",
"react": "18.2.0",
"react-native": "0.74.5"
要約
端末(スマホなど)の向きを変更した際に、アプリ(今回はボタンが2つあるだけ)が自動回転するようにしてます。
ここではライブラリは使用せず、Dimensionsを使用して作成してます。
本文
やり方ですが、
①まず、app.json内の、"orientaion"のところを、unkown(あるいはundefined)にします。
② 下記のように、DimensionsのaddEventListenerメソッドを使用して実現します。
App.js
総論
DimensionsのaddEventListenerメソッドを利用してますが、書き方が少しややこしい感じがしますが、端末の向きを検知して、縦横の表示を変えるなら、これが正解でしょう。
react-native-orientaion-lockerなどのライブラリを使用する方法もありますが、ここでは記載しておりません。
基本情報技術者試験の聞き流し動画のようなアプリを作る


『First Item』を押すと、

まあ、これは置いておいて、
『聞き流し』ボタンを押すと、用語と用語の説明を、聞き流しできる。
App.js
ListHomeScreen.js
DetailScreen.js
dataSet.js
store.js
これを作るうえで、はまってしまったところがありました。
React Navigationで、ページ遷移の際に、遷移先ページに『値』をオブジェクトリテラルで送ろうとしたら、どうしてもうまくいきませんでした。
リストのアイテムを押したら、Alertモーダルでは、押したアイテムを正しく表示されるのに、いざ、ページ遷移すると、1つ前の『値』が送られ、遷移先ページでは、1つ前の値が表示される。
useStateでは、stateが次のレンダーで更新されるようです。
これらややこしいので、zustandを使用して、自分が使いやすいように、
set関数も作成し、値も、どのコンポーネントからもとってこれるようにしてます。
上の問題の対処法としては、どうやら、別の変数に一度代入しておくという方法があるようです。今度試してみます。
*1:set) => ({
Math.random()の留意点
0~10の整数をランダムに出力したい場合、
const random_Number = Math.floor(Math.random( ) * 11) ;
なぜ、11を掛けるかは下記HP参照
【JavaScript入門】乱数の作り方(範囲指定/重複なし/ランダム文字列) | 侍エンジニアブログ (sejuku.net)
AsyncStorageへの保存の復習+『配列と、配列のコードの文字列との変換』
react vavigationを使ってます。
この辺は、完全に忘れてましたが、復習しました。
改めて、Amazon Q And Codewispererは、こういうときにかなり便利。
App.js
HomeScreen.js
*1:) => {
NextScreen.js