[2番目の項目]GREAM-Radioを使用したファミリー実装


🏅 Carouselで達成した目標

  • labelをクリックして画像
  • にナビゲートします.
  • 次へ」ボタンをクリックして次の画像
  • に移動します.
  • の前のボタンをクリックすると、前の画像
  • に移動します.
  • 移動時に色あせ効果を付与
  • .

    labelをクリックして画像に移動&移動時に色あせ効果を与える


    Q.labelとラジオはどうやって接続しますか?


    labelのプロパティfor=を使用すればよい.Reactはforではなくhtml forを使用していることを覚えておいてください.
    <Controls>
            {RADIOS.map(id => {
              return (
                <Label key="id" htmlFor={id}>
                  <Radio
                    type="radio"
                    name="radio"
                    id={id}
                  />
                </Label>
              );
            })}
          </Controls>

    Q.複数のタグのうち、クリックしたタグに対応する画像のみを表示する方法

  • buttonIdという名前のステータス
  • を作成
  • タグをクリックすると、ステータスのタグに対応する定数データのidがステータス(画像にもタグと同じidがある)
  • に保存されます.
    コード
  • mapを記述し、idとstateに格納されたidが一致する画像を不透明にする:1
    const Carousel = () => {
      const [buttonId, setButtontId] = useState('r1');
      
      ...
      
      const handleRadioChange = e => {
        setButtontId(e.target.value);
      };
      
      ...
      
    return (
        ...
    
    <Controls>
      {RADIOS.map(id => {
         return (
          <Label key="id" htmlFor={id} checked={id == buttonId}>
            <Radio
              type="radio"
              name="radio"
              id={id}
              value={id}
              onChange={handleRadioChange}
             />
           </Label>
          );
       })}
    </Controls>
        ...
      
    )};
    ...
      
    const Image = styled.img.attrs(props => ({
      src: 'http://source.unsplash.com/1000x1000/?flower',
    }))`
      position: absolute;
      height: 70%;
      width: 70%;
      transition: all 0.5s linear;
      box-shadow: 2px 2px 5px #000;
      border-radius: 1%;
      opacity: ${({ checked }) => (checked ? 1 : 0)};
    `;

    次のボタンをクリックして次の画像に移動


    Q.state buttonIdを使えばいいのですが、どうやって使うのでしょうか?


    上記のパラメータid==buttonIdと比較したcheckedプロパティが真の場合、コードを記述して画像を表示するので、buttonIdを次のidに設定するだけでよい.
    buttonIdに格納されているIDはr1の形式であり、数字のみを利用するために変数を個別に宣言し、sliceでインデックス1の対応する部分のみを格納する.
    論理を構成し、次のボタンを押すと、idの数字部分に格納された変数1のみが加算され、最後尾でボタンを押すと、最初のidが設定される.
    const moveRight = () => {
     const changedNum = Number(buttonId.slice(1));
     setButtontId(`r${changedNum + 1}`);
     changedNum === RADIOS.length && setButtontId(`r1`);
    };
    
    return (
      ...
      
      <LeftButton onClick={moveLeft}>
        <i class="fas fa-chevron-left" />
      </LeftButton>
      
      ...
      
    );

    前の画像に移動するには、前のボタンをクリックします。


    前のボタンは次のボタンと論理的に似ています.次のボタンを押したときに1を足すと、前のボタンから1を引くことができ、最初の画像であればbuttonIdを末尾画像のidに再設定することができます.
      const moveLeft = () => {
        const changedNum = Number(buttonId.slice(1));
        setButtontId(`r${changedNum - 1}`);
        changedNum === 1 && setButtontId(`r${RADIOS.length}`);
      };

    完成!