質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1376閲覧

React hooksでGraphQLのvariablesを更新したい

katsun0921

総合スコア32

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/02/17 23:13

編集2020/02/17 23:16

前提

今GraphQLの勉強の一環でGitHub GraphQL APIから値を取得しています。
apolloを使用していますが、その際にuseQuery()のvariablesの値を<button onClick={}>で更新を試みているのですが、うまくいきません

該当のソースコード

jsx

1import React, { Component, useState } from 'react'; 2import { ApolloProvider, useQuery } from '@apollo/react-hooks'; 3import client from './client'; 4import {SEARCH_REPOSITORIES} from './graphql' 5 6const PER_PAGE = 5 7const DEFAULT_STATE = { 8 first: PER_PAGE, 9 after: null, 10 last: null, 11 before: null, 12 query: "フロントエンドエンジニア", 13} 14 15const QueryView = ({ queryVariables }) => { 16 const [stateNext, setGoNext] = useState(queryVariables); 17 const { loading, error, data } = useQuery(SEARCH_REPOSITORIES, { 18 variables: stateNext 19 }); 20 21 if (loading) return <p>Loading...</p>; 22 if (error) return <p>Error : {error.message}</p>; 23 const search = data.search 24 const repositoryCount = search.repositoryCount 25 const repositoryUnit = repositoryCount === 1 ? 'Repository' : 'Repositories' 26 const title = `GitHub Repositories Search Result - ${repositoryCount} ${repositoryUnit}` 27 console.log(stateNext) 28 return ( 29 <div> 30 <h1>{title}</h1> 31 <ul> 32 { 33 search.edges.map(edge => { 34 const node = edge.node 35 return ( 36 <li key={node.id}> 37 <a href={node.url} target="_blank" rel="noopener noreferrer">{node.name}</a> 38 </li> 39 ) 40 }) 41 } 42 </ul> 43 { 44 search.pageInfo.hasNextPage === true ? 45 46 <button onClick={ 47 setGoNext( 48 { 49 ...stateNext, 50 first: PER_PAGE, 51 after: search.pageInfo.endCursor, 52 last: null, 53 before: null 54 } 55 )}>Next</button> 56 : 57 null 58 } 59 </div> 60 ) 61} 62class App extends Component { 63 constructor(props) { 64 super(props) 65 this.state = DEFAULT_STATE 66 67 this.handleChange = this.handleChange.bind(this) 68 this.handleSubmit = this.handleSubmit.bind(this) 69 } 70 handleChange(event) { 71 this.setState( { 72 ...DEFAULT_STATE, 73 query: event.target.value 74 }) 75 } 76 handleSubmit(event) { 77 event.preventDefault(); 78 } 79 render() { 80 const { query, first, last, before, after } = this.state 81 return ( 82 <ApolloProvider client={client} > 83 <h2>Hello, GraphQL</h2> 84 <QueryView queryVariables={{ query, first, last, before, after }} /> 85 <form onSubmit={this.handleSubmit}> 86 <input type="text" value={query} onChange={this.handleChange} /> 87 </form> 88 </ApolloProvider> 89 ) 90 } 91}; 92 93export default App;

実現したいこと

stateNextのafterの値を更新したいです。
いま更新はできているのですが、下記のように<button>をクリックせず更新されてしまいまいた。
この場合何が問題になりますでしょうか?

bash

1App.js:27 {query: "フロントエンドエンジニア", first: 5, last: null, before: null, after: null} 2App.js:27 {query: "フロントエンドエンジニア", first: 5, last: null, before: null, after: "Y3Vyc29yOjU="} 3App.js:27 {query: "フロントエンドエンジニア", first: 5, last: null, before: null, after: "Y3Vyc29yOjEw"} 4App.js:27 {query: "フロントエンドエンジニア", first: 5, last: null, before: null, after: "Y3Vyc29yOjE1"} 5App.js:27 {query: "フロントエンドエンジニア", first: 5, last: null, before: null, after: "Y3Vyc29yOjIw"} 6App.js:27 {query: "フロントエンドエンジニア", first: 5, last: null, before: null, after: "Y3Vyc29yOjI1"}

補足情報(FW/ツールのバージョンなど)

package.jsonはこちらになります。

json

1 "dependencies": { 2 "@apollo/react-hooks": "^3.1.3", 3 "@testing-library/jest-dom": "^4.2.4", 4 "@testing-library/react": "^9.3.2", 5 "@testing-library/user-event": "^7.1.2", 6 "apollo-boost": "^0.4.7", 7 "graphql": "^14.6.0", 8 "react": "^16.12.0", 9 "react-dom": "^16.12.0", 10 "react-scripts": "3.4.0" 11 },

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

単純にonClickの引数を関数にすればよかった

jsx

1 <button onClick={ 2 setGoNext( 3 { 4 ...stateNext, 5 first: PER_PAGE, 6 after: search.pageInfo.endCursor, 7 last: null, 8 before: null 9 } 10 )}> 1112 <button onClick={ 13 setGoNext(() => 14 { 15 ...stateNext, 16 first: PER_PAGE, 17 after: search.pageInfo.endCursor, 18 last: null, 19 before: null 20 } 21 )}>

投稿2020/02/18 03:42

katsun0921

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問