React - チートシート

useState

import React, { useState } from 'react';
function Example() {
// カウントステートを宣言します
const [count, setCount] = useState(0);
return (
<div>
<p> {count} 回クリックしました</p>
<button onClick={() => setCount(count + 1)}>
クリックする
</button>
</div>
);
}

関数コンポーネントでstateを管理(stateの保持と更新)するためのReactフック

複数の state 変数を使う

import React, { useState } from 'react';
function ExampleWithManyStates() {
// 複数のステートを宣言
const [age, setAge] = useState(42);
const [fruit, setFruit] = useState('banana');
const [todos, setTodos] = useState([{ text: 'テスト' }]);
// ...
}

useEffect / useLayoutEffect

useEffect(() => {
applyEffect(dependencies);
return () => cleanupEffect();
}, [dependencies]);

useLayoutEffect(() => {
applyBlockingEffect(dependencies);
return cleanupEffect();
}, [dependencies]);

import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// componentDidMount や componentDidUpdateと似ています
useEffect(() => {
//APIを使ってドキュメントタイトルを更新
document.title = ` ${count} 回クリックしました`;
});
return (
<div>
<p> {count} 回クリックしました</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}

副作用の処理(DOM操作、変数代入、API通信などUI構築以外の処理)を関数コンポーネントで扱うフック

useReducer

function init(initialCount) {
return {count: initialCount};
}
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
case 'reset':
return init(action.payload);
default:
throw new Error();
}
}
function Counter({initialCount}) {
const [state, dispatch] = useReducer(reducer, initialCount, init);
return (
<>
Count: {state.count}
<button
onClick={() => dispatch({type: 'reset', payload: initialCount})}>
Reset
</button>
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}

状態管理のためのフック(useStateと似ている)

useRef

const ref = useRef();

import { useRef } from "react";
function TextInput() {
const inputRef = useRef(null);
const onBtnClick = () => inputRef.current.focus();
return (
<>
<input ref={ref} />
<button onClick={onBtnClick}>Focus the text input</button>
</>
)
}

要素への参照を行うフック

useCallback

const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);

function RandomColoredLetter(props) {
const [color, setColor] = useState('#fff')
const [letter, setLetter] = useState('a')
const handleColorChange = useCallback(() => setColor(randomColor()), []);
const handleLetterChange = useCallback(() => setLetter(randomColor()), []);
return (
<div>
<ColorPicker handleChange={handleColorChange} color={color} />
<LetterPicker handleChange={handleLetterChange} letter={letter} />
<hr />
<h1 style={{color}}>{letter}</h1>
</div>
)
}

パフォーマンス向上のためのフックで、メモ化したコールバック関数を返します

useMemo

const memoizedValue = useMemo(
() => expensiveFn(dependencies),
[dependencies]
);

function RandomColoredLetter(props) {
const [color, setColor] = useState('#fff')
const [letter, setLetter] = useState('a')
const handleColorChange = useMemo(() => () => setColor(randomColor()), []);
const handleLetterChange = useMemo(() => () => setLetter(randomColor()), []);
return (
<div>
<ColorPicker handleChange={handleColorChange} color={color} />
<LetterPicker handleChange={handleLetterChange} letter={letter} />
<hr />
<h1 style={{color}}>{letter}</h1>
</div>
)
}

関数の結果を保持するフック。結果が同じ場合の値などを保存(メモ化)し、そこから値を再取得

カスタムフック

import { useState, useEffect } from 'react';
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
};
});
return isOnline;
}

function FriendStatus(props) {
const isOnline = useFriendStatus(props.friend.id);
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}

React案件


フリーランスフルリモート
Rails/React.js/大手Web系企業でのアプリケーション開発業務/フルリモート

■仕事内容 Webアプリケーションの開発において、 仕様書を元にプロダクトマネージャーやUXデザイナーと連携しながら 新機能開発や既存機能の改修を行っていただきます。 スモールチームのため、自ら主体的に質問をしてガツガツ動ける方を募集しております! ─────────────────────── ■作業環境:Windows/Mac選択可 ■開発環境 ■プログラミング言語:Ruby TypeScript      ■データベース:MySQL       ■Webフレームワーク:Ruby on Rails React.js      ■環境・OS:AWS (Amazon Web Services)       ■ツール:Slack       ■その他:       ■開発工程 詳細設計|実装・構築・単体試験|結合試験|総合試験|受入試験|運用・保守 ■基本スキル ・Ruby on Raiksでの開発実務経験 1年以上 ・TypeScript React.js Reduxを用いた開発実務経験 1年以上 (※バックエンド フロントエンドの両方をご担当していただきます) ■尚可スキル ・インフラ(AWS)の構築経験 

80110万円/月
業務委託契約
Ruby on RailsTypeScriptReact
フリーランス副業週3〜フルリモート
【Go/TypeScript】Tiktok広告運用の管理ツール開発(フロントメイン)

【webツールのフルスタック開発】 ・自社開発の広告管理システムの開発、改善対応、バグの修正 ・仕様書の確認、実装、コードレビュー、バグの修正対応 ・エンジニアの経験5年以上 ・要件定義などの上流検討の経験 ・TypeScript,React.jsの開発経験2年以上 ・サーバーサイドの開発経験 ・負荷対応経験 ・デザインパターンを使った現場での開発経験または知見 ・DDDやクリーンアーキテクチャの知見・経験(知っている程度でも問題ございません) 最寄駅:渋谷駅 稼働率:0.6~1人月 年齢 :~40代迄 リモート状況:フルリモートでの就業を予定しております。 キーテク必要経験年数: インフルエンサーと提携し、SNSを用いた企業の広告効果を最大限に伸ばすための マーケティングサービスを提供している企業でございます。 フルリモートで、比較的時間も融通が聞くため働きやすい環境でございます。

5060万円/月
業務委託契約
渋谷駅
GoTypeScriptReact
フリーランスフルリモート
【Javascript/React】大規模動画配信サービスのフロントエンドエンジニア

事業戦略やユーザーの声をもとに顧客満足度の高い動画配信サービスを目指し、 アプリ開発のフロントエンドエンジニアとして事業成長を推進に携わって頂きます。 ・BtoCのWebアプリケーション開発経験2年以上 ・JavaScriptを使った開発経験 3年以上またはReactを使った開発経験2年以上の経験 ・エンタメサービスや動画ストリーミングサービスへの興味 ・Smart TV、PS4などWeb以外の複数デバイス対応への興味(HTML5ベースです) ・英語レベル:高いほどGoodですが、現状は問いません ・SEO対応の経験 最寄駅:二子玉川駅 年齢 :~40代迄 リモート状況:リモートに関しては、週2を想定しております。 キーテク必要経験年数: 某有名サービスのフロントエンド開発に従事して頂きます。 社員食堂にて無料で食事を摂ることができ大変おすすめ案件となっております。

6070万円/月
業務委託契約
ReactJavaScript
フリーランスフルリモート
【React.js/TypeScript】ブロックチェーンを活用した新規プロジェクト

自社独自開発のブロックチェーンを活用した新規プロジェクトに フロントエンドエンジニアとして携わって頂きます。 【業務内容】 基本設計から開発に至るまでを一気通貫して業務を行っていただきます。 また、顧客からの要望や市場の動向から未来を見据えた新機能開発や、 実証実験の実施、リファクタリングも実施していただきます。 ・エンジニア経験4年以上 ・React.jsでの開発経験2年以上 ・TypeScriptでの開発経験 ・Hooksを用いた開発経験 ・React Nativeを用いたアプリ開発経験 ・React.jsを用いた大規模システムの開発経験 年齢 :~40代迄 リモート状況:フルリモートでの就業を予定しております。 キーテク必要経験年数:2年 自社独自のブロックチェーン開発などを行っている企業でございます。 働き方もリモート、フレックスを推進しているオススメの現場でございます。 スキルアップも見込めるので、エンジニアとして成長が可能です。

6570万円/月
業務委託契約
ReactTypeScript
フリーランス20代活躍30代活躍週3〜週5〜週4〜実務経験なしNG短期案件安定稼働
【週3~副業OK/フルリモート】接客業店舗の従業員が利用する業務Webアプリケーションの開発エンジニア募集!

弊社が経営する接客業店舗の従業員が利用する業務系(収支管理、在庫管理、顧客管理、従業員管理、予約管理)の機能を持たせたWebアプリケーションの作成を募集しています。 【依頼内容の詳細】 ・システム構成の相談と設計 ・使用するプログラミング言語/フレームワークの選定 ・機能の相談と設計 ・画面デザインの相談と設計 ・コーディング ・画面および動作確認レビュー ・インストールおよび操作のマニュアルの作成 【システム要件】 ・OS:Linux(Ubuntu Server 20.04 以降) ・使用言語:実装したい機能が実現できるもの ・データベース:実装したい機能が実現できるもの ・対応表示ブラウザ:Chrome、Safari  (タブレット端末での利用を想定しています) 【実装機能の一覧】 ・ログイン機能 ・収支管理機能  ・売上、経費入力  ・収支確認 ・在庫管理  ・在庫情報の確認  ・商品情報の登録、更新、削除  ・棚卸 ・顧客管理  ・顧客情報の確認  ・顧客情報の登録、更新、削除  ・来店、販売記録の登録、更新、削除 ・従業員管理  ・従業員情報の確認  ・従業員の登録、更新、削除  ・従業員のシフト作成  ・従業員の出退勤入力 ・予約管理  ・予約情報確認  ・予約情報の登録、更新、削除 募集背景 2021年に起業したばかりの弊社ですが、弊社事業であるコンサル事業・酒販事業・イベント事業から派生するITビジネスの引き合いが多数あり2022年は弊社のITビジネス事業の規模を拡大する計画です。 弊社が企画・提供する新規サービスの開発など、堅実でより良いサービスが提供できるようエンジニアを増員し、体制強化を図ります。

25003750円/時
業務委託契約
桜山駅
PHPJavaScriptDjangoLaravelReactVue.js
20代活躍30代活躍フリーランスフルリモート新技術に積極的長期案件安定稼働実務経験なしNG週5〜週4〜フリーランス多数
【React】前澤ファンドより資金調達決定!選挙・政治活動をスマートに支援する「スマート選挙」のフロントエンドエンジニア

自社サービス「スマート選挙」Web開発チームで React によるフロントエンド(UIフロント)作成 募集背景 この度前澤ファンドの審査に合格し、資金調達を実施することになりました! (プレスリリースはこちら: https://bit.ly/3o44G7U ) そこで、上場に向けて事業を爆速で成長させるために新しい仲間を探しています! スタートアップのスピード感で一気に上場まで駆け抜けましょう! 1人でも多くの方にお会いできるのを楽しみにしております!

60100万円/月
業務委託契約
表参道駅
HTML5CSS3TypeScriptReact