iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 14
1
Data Technology

GraphQL + ApolloData 入門系列 第 14

ApolloData & Mutation (二)

介紹

在Mutation 的部分 ,config Apollo 提供了許多不錯的函式庫, 大體使用跟 Query 很相似,以下來介紹 config 有哪些可以 method 可以使用

跟 query 一樣 第一個參數使用 gql 配置如何 mutation 。第二個參數裡面可以放options 如下方所示位置

export default graphql(gql`mutation { ... }`, {
  options: {
    // 這裡
  },
})(MyComponent);

可以直接用使用 props 定義method,這部分也都跟 Query 一樣。

export default graphql(gql`mutation { ... }`, {
  options: (props) => ({
    // 這裡可以自定義props 包含 method 
  }),
})(MyComponent);

當然如果要直接在元件使用mutate 只要把 mutate 拿出來用就可以了

function MyComponent({ mutate }) {
  return (
    <button onClick={() => {
      mutate({
        // 直接在元件裡下 mutate
      });
    }}>
      Mutate
    </button>
  )
}

export default graphql(gql`mutation { ... }`)(MyComponent);

options.variables:使用 variables 接收 props 觸發 mutation 這部分也跟 Query 一樣

export default graphql(gql`
  mutation ($foo: String!, $bar: String!) {
    ...
  }
`, {
  options: (props) => ({
    variables: {
      foo: props.foo,
      bar: props.bar,
    },
  }),
})(MyComponent);

options.optimisticResponse 樂觀反應是為了增加使用者體驗,一般會發Request到後端去撈完資料在回寫道程式碼中,但是這樣的等待時間會降低UX體驗,所以樂觀回應也有人稱會樂觀UI, 當下先給預期反應,等到Server response 後Update正確的資料

function MyComponent({ newText, mutate }) {
  return (
    <button onClick={() => {
      mutate({
        variables: {
          text: newText,
        },
        // 下方先指定樂觀UI反應狀況
        optimisticResponse: {
          createTodo: {
            id: -1, // 一個暫時的ID,實際會以Server返回的為主
            text: newText,
            completed: false,
          },
        },
      });
    }}>
      Add Todo
    </button>
  );
}

export default graphql(gql`
  mutation ($text: String!) {
    createTodo(text: $text) {
      id
      text
      completed
    }
  }
`)(MyComponent);

總結

mutation 跟 Query Options 語法幾乎是一樣 , 比較不同的是 optimisticResponse (給一個預期暫時的值來增加使用者的體驗).後面章節再介紹其他差異性


上一篇
ApolloData & Mutaion (一)
下一篇
ApolloData & Mutation (三)
系列文
GraphQL + ApolloData 入門30

尚未有邦友留言

立即登入留言