こんにちは!かたつむり(@Katatumuri_nyan)です!
Reactを触ってみて、サイト的なものは作れるようになりました(*´ω`)
そこで、次はReactNativeを触ってみようと思い、簡単なテキストエディタを作成しようと企んでおります(笑)
Dockerでの環境構築が難しかったので、やっとWSLで環境構築できました~!
これからテキストエリアを作成していきたいと思います!
最初から見る↓
【1】React Nativeでテキストエディタを作ってみる!【下調べ編】
前回を見る↓
【4】React Nativeでテキストエディタを作ってみる!【再び環境構築編】
目次
環境
- Windows10
- WSL2
- Expo
- React Native
- AndroidStudio
- iPhone
- iPad
WSL2にReact NativeとExpoが入っています!
とりあえず、タブレット用の画面を作っていきます!
iPadとAndroidStudioのタブレットエミュレーターを確認しながら作ります。
iPadは横向きになるけど、Androidはならないですね💦
ExpoかReact Native側の設定かなー💦
横向きはできるんですが、Expoを開くと横から縦になるんですよね。なんでだろう。
iPhoneも横向きにならない💦
コードで改善するかもなので進めます。
画面の向き検知
【ReactNative】端末の向き変更を検知する
↑より、コード変更してみます。
コンソールってどこに表示されるのかなw(npm start したターミナルや19002の開発ツールに表示されました!)
React Nativeで画面を回転させた際に再描画させる方法
expoでdefaultの画面の向きを設定する。
↑これで一応横にはなりました!でも、次は縦にならないww
とりあえず、横向きになったので、これでいきます!
テキストエリアの作成
React Nativeにテキストエリアコンポーネントの準備がない!
自作するとエラーがでる!
ってことで↓
What is an alternative of textarea in react-native?
TeaxtInputコンポーネントが使えるそうなので使います。
でか、HTMLもCSSも使えないじゃん!
Reactと違いすぎるw
困ってしまってワンワンわわん
ウェブビューみたいなの使ったら使えた気もしますが、、ちょっと分からないので進めていきます。
スタイルの設定
この辺から集中して作ってるので、メモ書きになります💦
URLとかペタペタ張っていくかも。
とりあえず、関数による動的なスタイルの作成の仕方が分かった。
import React from 'react'; import { FC, useEffect, useState} from 'react'; import { StyleSheet, TextInput, View, Dimensions} from 'react-native'; export default function App() { const [windowWidth, setWidth] = useState(100) const [windowHeight, setHeight] = useState(100) useEffect(() => { let Width = Dimensions.get('window').width; let Height = Dimensions.get('window').height; setWidth(Width) setHeight(Height) }, []); function AppStyle(){ return ({ flex: 1, flexDirection: 'row', flexWrap: 'wrap', alignItems: 'stretch', width: windowWidth, height: windowHeight, backgroundColor: 'black', }) } return ( <View style={AppStyle()}> <MyPanel value="panel" /> <MyTextArea/> <MyPreview value="ぷれびゅ~" /> </View> ); }
大分怪しい見た目ですが、とりあえず、パネル+テキストエリア+ぷれびゅ~のエリアは作成できました。
入力をぷれびゅ~に反映
マークダウンで書くことを想定しているので、PreviewはHTMLのつもりです。
ですが、まずはテキストエリアに書いた物をそのままPreviewしていきたいと思います。
できたぁ
これはReactのコンポーネント間の値の受け渡し方と一緒ですね。
テキストエリアのスタイル変更
テキストエリアの文字の位置変更
なぜかAndroidだけ、テキストエリアの真ん中に文字がくるので変えます。
公式ドキュメントにありました!
textAlignVertical
ちなみに、CSS的な物を書けるのですが、数値は0
みたいに数字だけ書くか、"0%"
みたいに%つけてクウォーテーションで囲むらしいです。
AndroidとiPadと全然適応が違いすぎてむずかしいですう。
テキストの頭に数字をつける
できなさそう…。
マークダウンに対応してみる。
iamacup/react-native-markdown-display
ライブラリの使い方がまだ謎ですが、挑戦してみます!
npm install -S react-native-markdown-display
とりあえず、使ってみましたがエラー…?
Failed building JavaScript bundle. Unable to resolve module punycode from /home/mymai/ReactNative_TextEditor/node_modules/markdown-it/lib/index.js: punycode could not be found within the project.
punycode
がないらしいですね。
npm i punycode
してみます。
expo再起動
(果たしてライブラリが使えるように私はなるのか!)
↑いけました!
右上のtext
ってやつですね。中身は## text
なので、ちゃんとできてます。
Previewコンポーネントと置き換えていきます。
なぜか文字を打つと右側に出現するようになりましたww
どうやら置き換えるんじゃなくて、中に入れるといいらしい
<Markdown style={styles.preview}> {props.value} </Markdown>
↓
<Text style={styles.preview}> <Markdown> {props.value} </Markdown> </Text>
iPadでpaddingがきかない😢
Androidは入力中にMarkdownコンポーネントが動くwww
なんやこれw
- Android→謎
- iPad→Markdownコンポーネントが浮いてるっぽい
こちらは、Markdownライブラリのスタイルを上書きすることで治りました。
メニューバーの追加
メニューバーを上に追加していきます。
こればコンポーネントでいけそう
ViewコンポーネントがHTMLでいうdiv
みたいな物っぽいので、それを使っていきます。
import React, { Component } from 'react'; import { View,StyleSheet, Text} from 'react-native'; export default function MenuBar(props) { return ( <View style={styles.menuBar}> <Text>バー</Text> </View> ); }; const styles = StyleSheet.create({ menuBar: { backgroundColor: '#35071e' } });
色が怪しいですが、こんな感じで基礎を作りました。
ここに閉じるボタンとかおきたい。
ボタンの追加
ボタンコンポーネント使っていきます。
ボタンのスタイルが変えられない💦
Expoにボタンの作り方があったのでこちらからボタンを作ります。
あと、iPhoneなどで角が見切れちゃうので、メニューバーのView
をSafeAreaView
に変更。
またまた怪しいですが、とりあえずのボタン完成ですw
<SafeAreaView style={styles.menuBar}> <Pressable style={styles.button}> <Text style={styles.buttonText}>閉じたい</Text> </Pressable> <Text>🐌SimpleMarkdown</Text> </SafeAreaView>
こんな調子でパネルやメニューバーに、色んなボタンを作っていこうかなと思います。
とりあえず、アプリが作れることは分かってきたので、今日はこの辺で終わります(*´ω`)
わーい!たのしい!
↓続き
【6】React Nativeでテキストエディタを作ってみる!【データ管理編】