反応JSで回転木馬アプリをつくる方法



始めましょう.
この記事では、create-react-appを使用して反応する単純なイメージカルーセルを実現するために、いくつかの簡単な手順に従います.この記事は、読者が反応して、等しく反応するフックで働くほとんどまたは基本的な知識がないと仮定します.注意する最初のことは、我々は、状態管理のための反応フックを利用しながら、機能的なコンポーネントを使用して、このカルーセルアプリを構築することです.上記に加えて、我々はまた、ゼロから独自のカスタムフックを構築します.あなたが私のような誰かであるならば、あなたは多分本当の行動にすでにキックしたいです.


  • カルーセルアプリ作成create-react-appを使用してカルーセルアプリを作成して起動します.あなたがこれをすることに関する知識がないならば、あなたはCreate react app link hereで彼らのドキュメンテーションを訪問することができます.彼らには詳細な説明があります.
    最後には、我々のアプリとは、モジュールが含まれてフォルダを持つ必要があります.すべてのコードは、アプリケーションに書き込まれます.srcフォルダにあるjsファイル

    アプリを編集します.以下のコードのように見えるJSファイル
        import React from "react"
    
        export default function Carousel() {
            return (
                <div>This is our carousel container</div>
            )
        }
    


  • アプリに我々のイメージを追加
    Webpackにはいくつかのビルドの問題があります.この問題の周りで最も簡単で最も簡単な作業は、パブリックフォルダ(私たちのindex . htmlが見つかりました)で我々のイメージを保存することです、これはウェブ・パックにビルドプロセスの間、我々のイメージを含めさせます.

    我々は、すべてのカルーセルイメージを保持するためにパブリックフォルダの中にイメージフォルダを作成します.よく、あなたはどんな問題も引き起こさないパブリックディレクトリに直接彼らを置くことに決めることができました、しかし、特定のコンベンションに従うために、あなたはイメージフォルダに彼らを入れました.


  • パブリックフォルダで見つけられたすべてのイメージパスとcurrentimgと呼ばれる変数を保持する配列を作成しましょう.現在の値のsrcの値でイメージタグを作成します.
    export default function Carousel() {
        const gallery = ['/images/bark-cake-bg.jpg','/images/birthday-cake.jpg','/imageschocolate.jpg/','/images/cupcakes3.jpg']
        const currentImg = gallery[0]
            return (
                <div>
                    <img src={currentImg} alt="slide" />
                </div>
            )
    }
    
    
    この方法を実行しているのは、ギャラリーの配列をループ/イテレートし、この配列インデックスを使用してレンダリングする別の画像パスを選択するためです.
    たった今、表示されるイメージはcurrentimgの値に依存します.我々は、それが上記のように静的であるよりむしろそれの価値を変える方法を必要とします.
    最善の方法は、状態を導入することです.我々は機能的に反応するコンポーネントを使用しているので、それに状態を追加する唯一の方法は、反応フックを使用することです.
        import React, {useState, useEffect} from "react"
    
        export default function Carousel() {
            const [count, setCount] = useState(0)
            const gallery = ['/images/bark-cake-bg.jpg','/images/birthday-cake.jpg','/imageschocolate.jpg/','/images/cupcakes3.jpg']
            const currentImg = count
            return (
                <div>
                    <img src={currentImg} alt="slide" />
                </div>
            )
    }
    
    

  • カウント状態の処理
    今、私たちは、カウントされた状態を変更する方法を見つけなければなりません.このためには、UseIntervalと呼ばれるカスタムフックを作成し、間隔を設定し、アンマウントされたときにその間隔をクリアします.
        const callback = () => {
            //Can read new state and props
            setCount(count + 1)
            //when count is already greater than our array size go back to the first index.
            if (previousCount > gallery.length - 2)
            setCount(0)
        }
    
        function useInterval(callback) {
            useEffect(() =>
                {
                    let timer = setInterval(callback, 1000)
                    return () => clearInterval(timer)
                }
            )
        }
    
        useInterval(callback)
    
    これを実行した後に、間隔が必要に応じてクリアされないことに気づくでしょう.これは、ClearIntervalとsetIntervalが不一致を持っているためです.NOTシェルでは、setIntervalの種類は2回実行されますが、ClearIntervalは1つの間隔だけをきれいにします.これは、間隔の変更として繰り返し続けている.

    どうやって解決できるの?
    問題を解決するための最良の方法は、間隔をポイントし、それがクリアされる参照される間隔です反応リREFを作成することです.
        function useInterval(callback) {
            //create my reference object
            const savedCallback = useRef()
    
            useEffect(() => {
                //after every render save the newest callback our reference object
                savedCallback.current = callback
            })
    

    なぜ効果?
    我々は、最新の間隔をアドレスしたいので、これを行う.

    次は?
    今すぐに行うには、我々のsetintervalで上記の新しい間隔を使用することです.そして、間隔がそれをクリアするとき.
        function useInterval(callback) {
            //create my reference object
            const savedCallback = useRef()
    
            useEffect(() => {
                //after every render save the newest callback our reference object
                savedCallback.current = callback
            })
    
            function tick() {
                //call the latest timer 
                savedCallback.current();
            }
    
            let timer = setInterval(tick)
            return () => clearInterval(timer)
        }
    

    どのような場合は一時停止することができます/私たちの間隔を再生?
    これを実現するには、私たちのuseintervalを少しダイナミックにする必要があります.IsRunningという新しい状態を初期化し、インターバルを実行するかどうかをフックに伝えます.
        const [isRunning, setIsRunning] = useState(true)
    
        function useInterval(callback, delay) {
            //create my reference object
            const savedCallback = useRef()
    
            useEffect(() => {
            //after every render save the newest callback our reference object
            savedCallback.current = callback
            })
    
            useEffect(() => {
                function tick() {
                    //call the latest timer 
                    savedCallback.current();
                }
    
                /*Using delay instead of isRunning because useEffect won't trigger a re-render when a boolean changes
                Whereas delay here is a parameter which isn't a boolean, and changes depending on isRunning state. 
                */
                if (delay !== null) {
                    let timer = setInterval(tick, delay)
                    return () => clearInterval(timer)
                }
            }, [delay])
        }
    
        useInterval(callback, isRunning ? 5000 : null)
    
    それで、私たちが遊びたい/間隔を休止したいならば、私たちがしなければならないすべては、is - running状態を変異させることです.
    おめでとうございます.今、あなたは反応で機能的なカルーセルアプリを持っている.