😭
【Nuxt3】useFetchでリアクティブな値が更新されない
問題
useFetch
内で使用してるリアクティブな値が更新されん……とここ数日悩んでいましたが解決しました。おそらく慣れている人には当たり前の話だと思うのですが、一応備忘録として残します。
例
const { authKey } = useAuth(); // authKeyの型はRef<string | null>
const { data } = useFetch("/api/hoge", {
method: "GET",
headers: {
authorization: `Bearer ${authKey.value}`,
},
watch: [authKey],
});
useAuth
から認証用のキーを取得して、それをヘッダに与えています。watch
も設定したし、準備万端! と思いきや、authkey.value
の値がnull
のまま更新されません。
問題点その 1
ずばり、最初の問題点はBearer ${authKey.value}
の部分です。これはテンプレートリテラルですが、テンプレートリテラル自体はリアクティブではなくただの文字列なので、はじめに代入したauthKey.value
の値で固定されてしまいます。
したがって、この部分をcomputed
に置き換えます。
const { authKey } = useAuth(); // authKeyの型はRef<string | null>
const authorization = computed(() => `Bearer ${authKey.value}`);
const { data } = useFetch("/api/hoge", {
method: "GET",
headers: {
authorization: authorization.value,
},
watch: [authKey],
});
イイ感じですね!
問題点その 2
イイ感じなわけがありません。
まだ大きな見落としをしています。
ずばり、
headers: {
authorization: authorization.value,
}
の部分です。
Bearer ${authKey.value}
がダメなら、これもダメなのです。
したがって、headers
もcomputed
にしましょう。
const { authKey } = useAuth(); // authKeyの型はRef<string | null>
const authorization = computed(() => `Bearer ${authKey.value}`);
const headers = computed(() => ({
authorization: authorization.value,
}));
const { data } = useFetch('/api/hoge', {
method: 'GET',
headers,
watch: [authKey],
});
headers
はHeadersInit
もRef<HeadersInit | undefined>
も受け入れてくれるようなのでheaders: headers.value
と書く必要はないみたいです。
イイ感じですね!
おわりに
これでホントにイイ感じであって欲しい。
Discussion
なんか変な風になってたのを修正しました