LoginSignup
0
0

More than 1 year has passed since last update.

アプリ作成時に使用したReactのライブラリ

Posted at

目次

1. アイコン表示
2. クラスネームの複数指定及び動的制御
3. モーダル表示
4. ドラッグ&ドロップの機能実装

1. アイコン表示

ライブラリをインストール

$ npm install react-icons

react-iconsの公式ページより使いたいアイコンを調べる
react-icons

react-icons/[最初の2文字]でインポートする

App.js
import { AiOutlineCloseCircle } from 'react-icons/ai';

function App = () => {

  const onClickDel = e => {
    //クリック時の処理
  }

  return (
    <span onClick={onClickDel}>
      <IconContext.Provider value={{ size: '28px', style: { cursor: 'pointer'} }}>
        <AiOutlineCloseCircle />
      </IconContext.Provider>
    </span>
  )
};
export default App;

2. クラスネームの複数指定及び動的制御

ライブラリをインストール

$ npm install classnames

クラス名を複数指定したり、useStateを使って動的に制御出来る

App.js
import classNames from 'classnames';

function App = () => {

  const [status, setStatus] = useState("progress");
  const testClassNames = { panel: true, base: status === "progress" };

  return (
    <div className={classNames(testClassNames)}>
      //略
    </div>
    <div className={classNames("panel", "base")}>
      //略
    </div>
  )
};
export default App;

3. モーダル表示

ライブラリをインストール

$ npm install react-modal

呼び出し側の記述
setShowUser(true);でモーダルが表示される

App.js
import ReactModal from 'react-modal';
import UserModal from './UserModal';

function App = () => {

  /* Userダイアログの開閉ステータス */
  const [showUser, setShowUser] = React.useState(false);
  /* Userダイアログのデータ */
  const [userData, setUserData] = React.useState(new Map());

  /* Userモーダルを開いた時の処理 */
  const userOpen = () => {

  }

  /* Userモーダルを閉めた時の処理 */
  const userClose = () => {

  }

  const [innerHeight, setInnerHeight] = React.useState(window.innerHeight);

  return (
      {/* Userモーダル */}
      <UserModal
        showModal={showUser}
        modalOpen={UserOpen}
        modalClose={UserClose}
        modalData={UserData}
        setModalData={setUserData}
        innerHeight={innerHeight}
      />
  )
};
export default App;

呼び出し側のsetShowUser(true);で表示されるモーダル
ReactModal.Stylesのcontent内の値を変更して表示位置等を調整出来る
※例は画面下部から380px幅100%のモーダルを表示している

UserModal.js
import React,{ useState,useEffect,Component } from 'react';
import ReactModal from 'react-modal';

const UserModal = ({showModal, modalOpen, modalClose, modalData, setModalData, innerHeight }) => {

  var modal_top = (Number(innerHeight)-380)+'px';
  var modal_height = '380px';
  var select_size = 'is-normal';

  /* モーダルのスタイル */
  const modalStyle : ReactModal.Styles = {
    content: {
      position: 'absolute',
      top: modal_top,
      left: '0px',
      right: 'auto',
      bottom: 'auto',
      height: modal_height,
      width: '100%',

//      marginRight: '-50%',
//      transform: 'translate(-50%, -50%)'
    },
    // 親ウィンドウのスタイル(ちょっと暗くする)
    overlay: {
      background: 'rgba(0, 0, 0, 0.2)'
    }
  };

  return (
    <ReactModal
      isOpen={showModal}
      onAfterOpen={modalOpen}
      onRequestClose={modalClose}
      style={modalStyle}
      contentLabel="Settings"
      
      overlayClassName={{
        base: "overlay-base",
        afterOpen: "overlay-after",
        beforeClose: "overlay-before"
      }}
      className={{
        base: "content-base",
        afterOpen: "content-after",
        beforeClose: "content-before"
      }}
      closeTimeoutMS={500}
    >
      <div>
        //略
      </div>
    </ReactModal>
  );
}

export default UserModal;

4. ドラッグ&ドロップの機能実装

ライブラリをインストール

$ npm install react-smooth-dnd
$ npm install array-move

Container コンポーネントで全体を囲み、その中の移動させたい要素を Draggable コンポーネントで囲む
onDropでドラッグ&ドロップした時に呼ばれる関数を定義する
※removedIndexとaddedIndexで元の位置と挿入する位置のindexを取得できる

App.js
import React,{ useState,useEffect,Component } from 'react';
import { Container, Draggable } from 'react-smooth-dnd';
import { arrayMoveImmutable } from 'array-move';

function App = () => {

  /* ドラッグ&ドロップさせるデータ */
  const [draggableDatas, setDraggableDatas] = React.useState([{}]);

  /* リストをドラッグ&ドロップした時のイベント */
  const onDrop = ({ removedIndex, addedIndex }) => {
    if(removedIndex!=addedIndex) {
      /* データを入れ替え */
      const sortDraggables = arrayMoveImmutable(draggableDatas, removedIndex, addedIndex);
      setDraggableDatas(sortDraggables);
    }
  }

  useEffect(() => {
    //draggableDatasを取得する処理
  }, []);

  return (
    <div>
      <Container onDrop={onDrop}>
        {draggableDatas.map(draggableData => (
          <DraggableList
            draggableData={draggableData}
          />
        ))}
      </Container>
    </div>
  )
};

/* ドラッグ&ドロップさせるリスト */
function DraggableList({draggableData}) {

  return (
    <Draggable key={draggableData.key}>
      <div>
        <table>
          <tr>
            </td>{draggableData.listNo}</td>
            </td>{draggableData.listName}</td>
          </tr>
        </table>
      </div>
    </Draggable>
  );
}
export default App;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0