간단한 쇼핑 앱을 만들고 있습니다. 로드가 발생하면 장바구니가 있는지 여부를 확인하는 쿼리를 작성합니다. 현재 해당 쿼리는 항상 null
을 반환합니다 (아직 장바구니가 있는지 여부를 확인하기위한 로직을 아직 구현하지 않았습니다). 그런 다음 사용자가 "장바구니 만들기"를 클릭하면 우리는 돌연변이를 만들어 만듭니다. 마지막으로 돌연변이가 완료된 후 refreshQueries
을 사용하여 돌연변이에서 반환 된 ID로 카트 (및 해당 제품)를 가져옵니다. 그런 다음 해당 제품을 순수한 구성 요소로 렌더링합니다.Apollo와 React : onClick()에서 발생한 돌연변이에서 refreshQueries가 작동하지 않습니다.
내가 만나는 문제는 사용자가 버튼을 클릭 한 후 다시 렌더링하지 않으며 refreshQueries
이 발생한다는 것입니다. 내 개발자 도구의 네트워크 탭을보고 쿼리가 전송되고 제품이 포함 된 생성 된 장바구니가 반환됩니다. 아폴로가 변화를 느끼지 않는 것 같습니다.
몽고는 제 백 엔드입니다. 것이 도움이 있다면 여기,
// query
import { gql } from 'react-apollo';
export const cartQuery = gql`
query CartQuery($cartId: ID) {
cart(cartId: $cartId) {
_id,
products {
_id,
name
}
}
}
`;
// mutation
import { gql } from 'react-apollo';
export const createCartMutation = gql`
mutation CreateCartMutation {
createCart {
_id
}
}
`;
// Apollo + React stuff
import React from 'react';
import { graphql } from 'react-apollo';
import { createCartMutation } from '../../mutations';
import { cartQuery } from '../../queries';
const BuildCart = ({ mutate }) => (
<button
onClick={() => {
// even when I hardcode the ID of a cart that exists and contains products, it doesn't matter
mutate({
refetchQueries: [{ query: cartQuery, variables: { cartId: '12345abcd' } }],
});
}}
>
Click
</button>
);
const BuildCartConnected = graphql(createCartMutation)(BuildCart);
const Cart = ({ data, data: { cart, loading } }) => {
console.log(cart); // always null, even after clicking button
return (
<div>
<BuildCartConnected />
{loading && <p>Loading...</p>}
// never gets to this step, even though the response is a properly formed cart with an array of products
{cart && cart.products.map(product => (
<p key={Math.random()}>{product.name}</p>
))}
</div>
);
};
const CartConnected = graphql(cartQuery)(Cart);
export default CartConnected;
refetchQueries
에서 응답이 네트워크 탭과 같은 작업은 다음과 같습니다 :
다음은 관련 코드입니다 {"data":{"cart":{"_id":"12345abcd","products":[{"_id":"abcdef12345","name":"Product A","__typename":"Product"}],"__typename":"Cart"}}}
답변 해 주셔서 감사합니다. 그것은 올바른 길로 나를 옮기고 있습니다. 그러나 처음에 'cartId' 변수를 사용하여'Cart '쿼리를 호출해도 버튼을 클릭해도 아무 것도 작동하지 않습니다. –
모든 코드를 보지 않고 무엇이 잘못되었는지 정확히 알기가 어렵습니다. 당신은 요점 또는 repo 연결을 세울 수 있고 나는 볼 수 있었다. –
refetchQuery는 문자 그대로 작동하지 않습니다. 이것이 문서화 된 것은 얼마나 실망 스럽습니다. –