😵‍💫

Reactで全角カナ→半角カナに変換

2024/06/01に公開

今までの過程

正規表現を用いた変換、マッピングを用いた変換を組み合わせていた

ライブラリ

mojiを使う
npm i moji

実装

import React, { useState, useEffect } from "react";
import moji from "moji";
import { Box, TextField, Typography, styled } from "@mui/material";

const StyledBox = styled(Box)(({ theme }) => ({
  border: "1px solid black",
  backgroundColor: "#fff",
  width: 220,
}));

function App() {
  const [inputValue, setInputValue] = useState("");
  const [convertedValue, setConvertedValue] = useState("");
  const [editedValue, setEditedValue] = useState(""); // 追加

  useEffect(() => {
    //ひらがなからカタカナへ変換
    const hiraToKana = moji(inputValue)
      .convert("HG", "KK") // ひらがな→カタカナ
      .convert("ZS", "HS") // 全角スペース→半角スペース
      .convert("ZK", "HK") // 全角カナ→半角カナ
      .convert("ZE", "HE") //全角記号→半角記号
      .toString();
    setConvertedValue(hiraToKana);
    setEditedValue(hiraToKana); // 追加
  }, [inputValue]);

  const handleChange = (event) => {
    setInputValue(event.target.value);
  };

  const handleEdit = (event) => {
    // 追加
    setEditedValue(event.target.value);
  };

  return (
    <div className="App">
      <Typography>入力欄</Typography>
      <TextField
        type="text"
        value={inputValue}
        onChange={handleChange}
        sx={{ backgroundColor: "#fff" }}
      />
      <Typography>出力欄</Typography>
      <Box>
        <TextField
          value={editedValue}
          //   onChange={handleEdit} //バックスペースしか正しい動き基本出来ない
          sx={{ backgroundColor: "#fff" }}
        />{" "}
        {/* 変更 */}
        <StyledBox>
          <Typography>{convertedValue}</Typography>
        </StyledBox>
      </Box>
    </div>
  );
}

export default App;

まとめ

あの長々したマッピングを書いていた時間は何だったのか...
便利なライブラリを見つけるって大事

とはいえ、やはりReact、というかjavascriptで入力欄自体にリアルタイムで半角カナを入力するのは現状厳しい

Discussion