LoginSignup
henrry-sakurazaka
@henrry-sakurazaka

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Next.jsのuseClientが使えなくて困ってます。

解決したいこと

情報求む。
Next.jsのパッケージのnext/clientが何回インストールしても欠落してて困ってます。GitHubにも公開されてるものは無く、新しくプロジェクトを作成しても同じ結果で意味は無く
useClient()が使えません。副作用を多く含んだコンポーネントを使うのでuseEffectは必須。解決策ありますか? 
Next.jsのバージョンは13.4.19です。

発生している問題・エラー

Unhandled Runtime Error
TypeError: (0,next_client__WEBPACK_IMPORTED_MODULE_1__.useClient) is not a function. (In '(0,next_client__WEBPACK_IMPORTED_MODULE_1__.useClient)()', '(0,next_client__WEBPACK_IMPORTED_MODULE_1__.useClient)' is undefined)




または、問題・エラーが起きている画像をここにドラッグアンドドロップ

### 該当するソースコード

"use client";

import { useClient } from "next/client";
import { useState, useEffect } from 'react';
import React from 'react';
import MusicLog from './MusicLog';

useClient();

const AudioComponent = () => {

  useEffect(() => {
    if (typeof window !== "undefined") {
      // クライアントサイドのコード
      const currentURL = window.location.href;
      // ここでcurrentURLを使用できます
    }
  }, []);

  


  useEffect(() => {
    const [isAudioPlaying, setIsAudioPlaying] = useState(false);
  
  });

  useEffect(() => {

    //  ローカルストレージに再生状態を保存
  
    const saveAudioState = localStorage.getItem('audioIsPlaying');
    if (saveAudioState !== null) {
      setIsAudioPlaying(saveAudioState === 'true');
    }

  });
  
  // オーディオ再生状態をクッキーに保存
useEffect(() => {

  document.cookie = `audioIsPlaying=${isAudioPlaying}; expires=Fri, 31 Dec 9999 23:59:59 GMT`;


  const cookies = document.cookie.split(';');
  for(const cookie of cookies) {
    const [name, value ] = cookie.split('=');
    if(name === 'audioIsPlaying' && value === true) {
      setIsAudioPlaying(true);
    }
  } 

}, []);

 useEffect(() => {

  // オーディオ再生状態を設定する関数
  const setAudioState = (isPlaying) => {
    setIsAudioPlaying(isPlaying);

    localStorage.setItem('audioIsPlaying', isPlaying);
  };


 }, []);
  

// オーディオソースをプリロード
const audioSource = '././music-app/build/music/palm-tree-lullaby.mp3';
// メモ
const AudioMemo = memo((audioSource) => {});


// ボタンクリック時に呼ばれるコールバック関数
  
    const handleAudioButtonClick = () => {

      useEffect(() => {

            const audio = document.querySelector('#audio');
            const logo = document.querySelector('.sound-logo');
            audio.preload = 'auto';

            if(audio.paused) {
                audio.play();
                logo.setAttribute('src', '././music-app/build/media/audio-svgrepo-com.svg');
              if(typeof setIsAudioPlaying === 'function') {
                    setIsAudioPlaying(true);   
              }                      
            } else {
                audio.pause();
                logo.setAttribute('src', '././music-app/build/media/mute-svgrepo-com.svg');
                if(typeof setIsAudioPlaying === 'function') {
                    setIsAudioPlaying(false);            
                }           
            }  
      }, []); 

      function getCurrentURL() {
        if (typeof window !== "undefined") {
          // クライアントサイドのコード
          return window.location.href;
        }
        return null;
      }
      getCurrentURL();
    }

    
      return(
        <MusicLog isAudioPlaying={isAudioPlaying} handleAudioButtonClick={handleAudioButtonClick}/>
      )

}
  
 

export default AudioComponent;






### 自分で試したこと
ここに問題・エラーに対して試したことを記載してください。

Next.jsのアンインストール、再インストール、next/clientのインストール、プロジェクトの再起動
キャッシュのクリア、新規プロジェクトの作成、最新バージョンへのアップデート。
0

2Answer

そもそもuseClient() なんてフックはないはずなので、それのインポート部分と実行部分を削除すれば動きそうですが...
"use client"; とファイルの最初に書くだけでいいはずです。

1Like

Comments

  1. ありがとうございます。useClient()なんてフックはないのですね。アドバイス頂いた通りに実践したら正常に動きました!

質問に関係のないところですが、 以下の2つの側面から見て、不要な useEffect が多くあります。

Rules of Hooks

「useEffect の中で useState を使う」「イベントハンドラの中で useEffect を使う」これらは正しく動作しません。コンポーネントの関数の中に直接置かなければいけません。

- useEffect(() => {
-   const [isAudioPlaying, setIsAudioPlaying] = useState(false);  
- });

+ const [isAudioPlaying, setIsAudioPlaying] = useState(false);

You might not need an Effect

useEffect の使い方が間違っています。「副作用をすべてuseEffect に書かなければならない」とお考えかも知れませんが、誤りです。

useEffect は、副作用のうち、 レンダリングの直後に、 React のステート以外のモノと React のステートに結びつける場合のみに使用する ための機能です。

あるコードがエフェクトにあるべきか、イベントハンドラにあるべきかわからない場合は、そのコードが実行される理由を自問してください。コンポーネントがユーザに表示されたために実行されるべきコードにのみエフェクトを使用してください。

0Like

Comments

  1. アドバイス有難うございます。理解しました。

Your answer might help someone💌