Как запустить запрос graphql при изменении ссылки с помощью vue composition api?

#javascript #typescript #vue.js #graphql #vue-component

#javascript #typescript #vue.js #graphql #vue-компонент

Вопрос:

С помощью генератора кода graphql Vue мы создали следующий рабочий запрос, который возвращает настройки приложения:

 const { result, loading, error } = useViewerQuery()
const preference = useResult(result, null, (data) => data.viewer.preference)
  

Мы хотели бы получать настройки только один раз, сразу после аутентификации пользователя в MainLayout.vue компоненте, поэтому мы можем использовать счетчик, основанный на loading ссылке, прежде чем мы сможем отобразить полный пользовательский интерфейс на правильном пользовательском языке (который исходит из настроек).

Проблема, с которой мы сталкиваемся, заключается в том, чтобы запускать userViewerQuery запрос только тогда, когда ссылка isAuthenticated установлена true в функции MainLayout.vue настройки. Кажется, мы не можем выставить loading error ссылки и, когда они находятся внутри watchEffect функции.

 // MainLayout.vue
<script>
import { defineComponent, watchEffect } from '@vue/composition-api'
import { isAuthenticated } from 'src/store/authStore'
import { useViewerQuery } from 'src/graphql/generated/operations'

export default defineComponent({
  setup(_, { root }) {
    watchEffect(() => {
      if (isAuthenticated.value === true) {
        const { result, loading, error } = useViewerQuery()
      }
    })

    return {
      isAuthenticated,
      loading,
      error,
    }
  },
})
</script>
  

Затем позже мы просто хотели бы использовать настройки, полученные в Settings.vue компоненте. Поскольку они уже извлечены данные для настроек должны быть кэшированы и легкодоступны:

 // Settings.vue
const { result } = useViewerQuery()
const preference = useResult(result, null, (data) => data.viewer.preference)
  

Возможно, мы подходим к этому неправильно. Любая помощь или совет приветствуются.

Ответ №1:

Я понял это благодаря этому совету . При использовании useQuery с Vue Apollo вызывается опция enabled , которая определяет, выполняется ли запрос или нет.

Из документов:

 const enabled = ref(false)

const { result } = useQuery(gql`
  ...
`, null, () => ({
  enabled: enabled.value,
}))

function enableQuery () {
  enabled.value = true
}
  

Применяя эту логику к моей собственной ситуации, когда я хочу, чтобы запрос выполнялся только тогда, когда пользователь вошел в систему, а ссылка isAuthenticated установлена на true :

 export default defineComponent({
  setup(_, { root }) {
    const { result, loading, error } = useViewerQuery(() => ({
      enabled: isAuthenticated.value,
    }))

    watchEffect(() => {
      console.log('MainLayout isAuthenticated: ', isAuthenticated.value)
    })
    watchEffect(() => {
      console.log('MainLayout result: ', result.value)
    })

    return {
      isAuthenticated,
      loading,
      error,
    }
  },
  

Я надеюсь, что это поможет другим с подобной проблемой.

Ответ №2:

Я думаю, вы могли бы расширить ссылки и добавить свойство, которое вызывает конечную точку gql. Что-то вроде…

 export default defineComponent({
  setup() {
    const { result, loading, error, call } = useViewerQuery()
    watchEffect(async () => {
      if (isAuthenticated.value) {
          await call()
      }
    })

    return {
      isAuthenticated,
      loading,
      error
    }
  }
})
  

Комментарии:

1.Я попробовал ваше предложение, но useViewerQuery() оно всегда выполняется и не возвращает функцию, которая будет использоваться в качестве вызывающей. useMutaton имеет эту функциональность с mutate помощью функции, но useQuery не выполняет.