#概要
この記事ではVuexストア内からGraphQLを扱う方法を解説します。
Vueコンポーネントから扱う方法や、NuxtプロジェクトにGraphQLを導入する方法自体は、Nuxt.jsでGraphQLを扱う方法に詳しく解説されています。
※以下ではApolloクライアントの導入および設定はできているものとします。
クエリの発行
Vuexストア内ではthis.app.apolloProvider.defaultClient
でApolloクライアントにアクセスできます。
import fetchUser from '~/apollo/queries/fetchUser'
export const actions = {
async fetchUser(context) {
const response = await this.app.apolloProvider.defaultClient.query({
query: fetchUser,
})
console.log(response)
}
}
{
user {
id
}
}
また、以下のようにクエリをベタ書きすることもできます。
(graphql-tag
パッケージのインストール&インポートが必要です)
import gql from 'graphql-tag'
export const actions = {
async fetchUser(context) {
const response = await this.app.apolloProvider.defaultClient.query({
query: gql`
{
user {
id
}
}
`,
})
// ユーザーIDをセットする
context.commit('setUser', response.data.user.id)
}
}
#ミューテーションの発行(変数なし)
ミューテーションの場合はmutate()
関数を使用します。
import updateUser from '~/apollo/mutations/updateUser'
export const actions = {
async updateUser(context) {
const response = await this.app.apolloProvider.defaultClient.mutate(
{
mutation: updateUser,
}
)
}
}
{
updateUser(
user: { id: 1, nickname: 'nick' }
)
}
#ミューテーションの発行(変数あり)
ミューテーションを使う場合、送る内容はつど変わるのが普通だと思います。
そういう場合は変数をmutate()
のvariables
に格納します。
import updateUser from '~/apollo/mutations/updateUser'
const user = {
id: 1,
nickname: 'nick',
}
export const actions = {
async updateUser(context) {
const response = await this.app.apolloProvider.defaultClient.mutate(
{
mutation: updateUser,
variables: {
user: user,
}
}
)
}
}
mutation updateUser(
$user: UserInput
) {
updateUser(
user: $user
)
}
上記の2番目の$user
に、mutate()
のvariables
に指定したuser
の値が入る形になります。
#感想
NuxtもGraphQLも情報がまだ少なくつらみがありますが、慣れると便利でよいですね。