React-nodebird -05
15740 ワード
イメージキャッシュユニット
今私が作成しているツイッターのようなNode Buddプロジェクトでは、基本的な文章のほかに、画像、ハッシュラベルなどを公開することができます.
イメージの仕事をしましょう
まずpost reduceの最初の投稿には3つの画像が追加されています.
現在は3つの画像しかアップロードされていないので大きな問題ではありませんが、たくさんの画像が入っていたら?投稿の長さが長すぎる(画像の数のため)、または投稿が望むフォーマットとは思えないように見えます.
したがって、投稿に3つ以上の画像がある場合は、画像ライブラリを使用してクリック表示機能を作成します.
画像焦点距離とは、画像をスライドさせて横に見ることができるものです.
では、この機能をどのように使用すればいいのでしょうか.
react-slickライブラリ.このライブラリを使用して数式ドキュメントを参照すると、画像キャッシュユニットを簡単に実現できます.
最初はこのライブラリだけ使えばいいと思っていたのに、盲目的にやってしまって、間違えてしまいました.react-slickエラーを防止するには、フォーマットを再調整する必要があります.
このようにして、イメージは奇妙な場所に現れた.
import styled, { createGlobalStyle } from "styled-components";
import { CloseOutlined } from "@ant-design/icons";
export const Global = createGlobalStyle`
.slick-slide {
display: inline-block;
}
.ant-card-cover {
transform: none !important;
}
`;
export const Overlay = styled.div`
position: fixed;
z-index: 5000;
top: 0;
left: 0;
right: 0;
bottom: 0;
`;
export const Header = styled.header`
height: 44px;
background: white;
position: relative;
padding: 0;
text-align: center;
& h1 {
margin: 0;
font-size: 17px;
color: #333;
line-height: 44px;
}
`;
export const SlickWrapper = styled.div`
height: calc(100% - 44px);
background: #090909;
`;
export const CloseBtn = styled(CloseOutlined)`
position: absolute;
right: 0;
top: 0;
padding: 15px;
line-height: 14px;
cursor: pointer;
`;
export const Indicator = styled.div`
text-align: center;
& > div {
width: 75px;
height: 30px;
line-height: 30px;
border-radius: 15px;
background: #313131;
display: inline-block;
text-align: center;
color: white;
font-size: 15px;
}
`;
export const ImgWrapper = styled.div`
padding: 32px;
text-align: center;
& img {
margin: 0 auto;
max-height: 750px;
}
`;
スタイル-componsesを使用してフォーマットと使用を調整します.//component 가 많아지고 복잡해지면 이렇게 폴더 안에 만듬.
//why ?
import React, { useState } from "react";
import PropTypes from "prop-types";
import Slick from "react-slick";
import {
Overlay,
Header,
CloseBtn,
SlickWrapper,
ImgWrapper,
Indicator,
Global,
} from "./styles";
const ImagesZoom = ({ images, onClose }) => {
const [currentSlide, setCurrentSlide] = useState(0);
return (
<Overlay>
<Global />
<Header>
<h1>상세 이미지</h1>
<CloseBtn onClick={onClose} />
</Header>
<SlickWrapper>
<div>
<Slick
initialSlide={0}
beforeChange={(slide, newSlide) =>
setCurrentSlide(newSlide)
}
infinite
arrows={false}
slidesToShow={1}
slidesToScroll={1}
>
{images.map((v) => (
<ImgWrapper key={v.src}>
<img src={v.src} alt={v.src} />
</ImgWrapper>
))}
</Slick>
<Indicator>
<div>
{currentSlide + 1} /{images.length}
</div>
</Indicator>
</div>
</SlickWrapper>
</Overlay>
);
};
ImagesZoom.propTypes = {
images: PropTypes.arrayOf(PropTypes.object).isRequired,
onClose: PropTypes.func.isRequired,
};
export default ImagesZoom;
公式ドキュメントを確認し、Clickを使用します.レッスンはこれで終わります.escキーを押してstateを変更してクリックを終了したい場合は、どうすればいいですか?
Slickを含む素子の一番外側の素子OverlayにonKeyDownを置けばよい.
const exit = useCallback((e)=>{
if(e.keyCode === 27){
onClose();
}
},[]);
これにより、ボタンを押すだけでなく、escキーを押すときにもslickを閉じることができます.Reference
この問題について(React-nodebird -05), 我々は、より多くの情報をここで見つけました https://velog.io/@mrvanc/React-nodebird-05テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol