データやリストをuseStateで型宣言する

any型エンティティの配列形式データ

	const [termData, setTermData] = useState<any[]>([]);
	
リスト

	const [termComparison, setTermComparison] = useState<string[]>([]);
	

子コンポーネントの基本

親コンポーネント


import Neko from './Neko';

const List = () => {

	const [nekoName, setNekoName] = useState<string>('ロイヤルアナロスタン');
	const [nekoEnt, setNekoEnt] = useState<any>({});


	return (
		<div>
			<Neko nekoName={nekoName} setNekoName={setNekoName} nekoEnt={nekoEnt} setNekoEnt={setNekoEnt} />

	

子コンポーネント


import { useEffect, useState } from 'react';
import {Button, Input,} from 'antd';

const Neko = ({nekoName, setNekoName, nekoEnt, setNekoEnt}) => {

	const [nekoBark, setNekoBark] = useState<string>('猫の吠え方');
	//const [nekoEnt, setNekoEnt] = useState<any>({});//■■■□□□■■■□□□ useStateは親で適用しているので不要。



	useEffect(() => {
		setNekoBark('アオーアオー');
		console.log('初期化イベント');//■■■□□□■■■□□□
	}, []);
	
	
	useEffect(() => {
		console.log('他のコンポーネントでnekoEntが変更された時、発動するイベント');//■■■□□□■■■□□□
	}, [nekoEnt]);


	const testFunction = () => {
		console.log(nekoName);//■■■□□□■■■□□□
		
	};
  
  	const updateNekoEnt = (key, value) => {


		const newEnt = {...nekoEnt, [key]: value};
		setNekoEnt(newEnt); // 親のsetメソッドを用いて変更したエンティティをセットする。
		
		nekoEnt[key] = value; // 推奨されていないがこの方法も可能■■■□□□■■■□□□

	};
  
	return (

			<div>
				<Button onClick={testFunction}>テスト猫が吠える</Button>
				<Input
					placeholder="Neko name"
					value={nekoEnt.name}
					onChange={(e) => updateNekoEnt('name', e.target.value)}
				/>
			</div>		

	);
};

export default Neko;



	

配列データのループ | JSX


	<div>
		{termData.map((orData, index) => (
			<div key={index}>
				ハロー{index}
			</div>
			
			{index === termData.length - 1 ? (
				<div>
					<strong>ラスト行:</strong>
				</div>
			) : (
				<div>中間行</div>
			)}
		))}
	</div>	
	
フィルタリングしながらループ

	{animalData.filter(row => row.inUseAnimal === 1).map((row, index) => (
		<tr key={`key-${index}`}>
			<td>{row.id}</td>
			<td>{row.customTagId}</td>
		</tr>
	))}
	

通常ボタン


	const testFunction = () => {
		console.log('はろーわーるど');

	};
	

	<Button onClick={testFunction}>テスト猫ボタン</Button>
	

リスト内のキーをキャメル記法からスネーク記法に変換する


	// リスト内のキーをキャメル記法からスネーク記法に変換する
	const convKeyCamelToSnake = (list) => {
		const newList = {};
		for(let key in list){
			const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();
			console.log(`Converting ${key} to ${snakeKey}`);
			newList[snakeKey] = list[key];
		}
		return newList;
	};
	

日付テキストボックス | 日付ピッカー | DatePicker

日付テキストボックスとしてantdにはDatePickerが用意されている。 しかし、このままでは使いづらいためラップして使う。 ラッパーとしてDatePickerExコンポーネントを用意した。親コンポーネントからの使い方と合わせて紹介する。 親コンポーネント

	import DatePickerEx from './DatePickerEx';
	
	~略~
	
	const updateDatePickerEx = (value) => {

		// 入力日付のvalueをデータへ反映する処理
	}
	
	~略~
	
	<div style={{display:friendAddDateDisplay}}>
		<DatePickerEx 
			dateValue={animalDate}
			updateDatePickerEx={updateDatePickerEx} 
		/>
	</div>	
	
DatePickerEx.tsx

import { useEffect, useState } from 'react';
import {DatePicker ,} from 'antd';
import moment, { Moment } from 'moment';

interface DatePickerExProps {
	dateValue: string;
	updateDatePickerEx: (dateString: string) => void;
}

const DatePickerEx = ({ dateValue, updateDatePickerEx }: DatePickerExProps) => {

	const [date, setDate] = useState<Moment | null>(null);

	useEffect(() => {
		// dateValue が日付として有効な場合に moment オブジェクトに変換
		if (moment(dateValue, 'YYYY-MM-DD', true).isValid()) {
			setDate(moment(dateValue, 'YYYY-MM-DD'));
		} else {
			setDate(null); // 無効な日付の場合は null をセット
		}
	}, [dateValue]);
	
	const handleDateChange = (date: Moment | null, dateString: string) => {
		setDate(date);
		updateDatePickerEx(dateString);
	};
	
	return (

			<div>
				<DatePicker 
					value={date}
					onChange={handleDateChange}
					format="YYYY-MM-DD"
				/>
			</div>		

	);
};

export default DatePickerEx;

	

TSXのIF文による分岐処理


	{and_index === termData.length - 1 ? (
		<div>
			イワシ
		</div>
	) : (
		<div>
			サバ
		</div>
	)}
	

本日の日時を取得 | 現在日時 | 日時フォーマット


	
	const nowDatetime = formatDate(new Date()); // 現在の日時を取得する
	
	~略~
	
	const formatDate = (date: Date): string => {
		const padZero = (num: number) => num.toString().padStart(2, '0');
		return `${date.getFullYear()}-${padZero(date.getMonth() + 1)}-${padZero(date.getDate())} ${padZero(date.getHours())}:${padZero(date.getMinutes())}:${padZero(date.getSeconds())}`;
	};
	

TSX データをループする

まずデータの構造に注意しないといけない。 データのキーは必ずインデックスである必要がある。 連想配列型のデータだと失敗する。 インデックスは0から順に自然数の連番を割り当てる事。例えば「0,1,2,3,,」という感じ。「0,5,9,,」などのように飛び番にするとインデックスでなく連想配列扱いになり、ループに失敗するので注意すること。

最初のタグに必ずkey属性を記述し、インデックスをセットすること。必ず最初の要素にkeyを指定すべきだがタグの種類はdivでなくても良い。

正しいデータの型→ [{}]
誤ったデータの型→ {{}}


	{termData.map((termEnt, index) => (
		<div key={index} >

		</div>
	))}
	

ボタン形式のリンク


	import {Link,} from 'react-router-dom';
	import {Button,} from 'antd';

	~ 略 ~
	
	<Button
		type="primary"
		icon={<PlusOutlined />}
		onClick={() => {
		// ボタンクリック時の処理(ここでは特に何もしない)
		}}
		style={{ marginRight: '10px' }}
	>
		<Link to={`/custom_tag_term/list`}>
		カスタムタグ作成
		</Link>
	</Button>