Apollo ClientでcurrentTargetをcacheに保存できない
ReactのstateをApollo Clientのcacheに置き換えようとしています。
useStateを使ってcurrentTargetを保存する処理をApollo Clientで置き換えようとしたところ、エラーが出力され、実行できません。
なお、保存したcurrentTargetはmaterial-uiのMenuのanchorElに設定して使う想定です。
https://material-ui.com/api/menu/
正しくcurrentTargetをcacheに格納する方法か代替案を教えてください。
以下のコードを実行すると、
(App.js)
import React from 'react';
import gql from 'graphql-tag'
import { useMutation } from '@apollo/react-hooks';
function App() {
const setElementMutation = gql`mutation
SetElement($el: Element) {
setElement(el: $el) @client
}
`;
const [setElement] = useMutation(setElementMutation);
const onClickHandler = (e) => {
setElement({variables: {el: e.currentTarget}})
}
return (
<input type="button" value="SEND" onClick={onClickHandler}/>
);
}
export default App;
(index.js)
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloProvider } from '@apollo/react-hooks'
const resolvers = {
Mutation: {
setElement: (_, v, { cache }) => {
const data = {
el: v.el
}
cache.writeData({ data })
return null;
}
}
}
const client = new ApolloClient({
cache: new InMemoryCache(),
resolvers: resolvers
});
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById('root')
);
serviceWorker.unregister();
以下のエラーが出力されます。
bundle.esm.js:76 Uncaught (in promise) Error: Network error: Maximum call stack size exceeded
at new ApolloError (bundle.esm.js:76)
at Object.error (bundle.esm.js:1313)
at notifySubscription (Observable.js:157)
at onNotify (Observable.js:196)
at SubscriptionObserver.error (Observable.js:253)
at bundle.esm.js:1126
backend.js:1 Uncaught TypeError: Converting circular structure to JSON
--> starting at object with constructor 'HTMLInputElement'
| property '__reactInternalInstance$cubckm44auj' -> object with constructor 'FiberNode'
--- property 'stateNode' closes the circle
at Object.stringify (<anonymous>)
at u (backend.js:1)
(おそらくcurrentTargetが循環参照になっており、currentTargetをJSON形式でリゾルバにうまく渡せていないか、cacheに書き込めてないと思われます。)
npmの環境は以下の通りです。
"dependencies": {
"@apollo/react-hooks": "^3.1.3",
"apollo-cache-inmemory": "^1.6.3",
"apollo-client": "^2.6.4",
"graphql-tag": "^2.10.1",
"react": "^16.11.0",
"react-dom": "^16.11.0",
"react-scripts": "3.2.0"
},