【问题标题】:Reset useLazyQuery after called once调用一次后重置 useLazyQuery
【发布时间】:2021-02-06 00:19:17
【问题描述】:

我使用useLazyQuery 触发按钮点击查询。查询被调用一次后,结果(数据、错误等)会在每次渲染时传递给组件渲染。例如,当用户输入新的文本输入以更改导致错误的原因时,这是有问题的:错误消息不断重复出现。所以我想“清除”查询(例如,当用户在 TextInput 中输入新数据时),以便查询结果返回到初始状态(一切 undefined)并且错误消息消失。

我在 Apollo 文档中找不到任何明确的方法来做到这一点,那么我该怎么做呢?

(我虽然将查询放在父组件中,因此它不会在每次重新渲染时更新,但我宁愿不这样做)

这就是我当前设置组件的方式:

import { useLazyQuery } from 'react-apollo'

// ...

const [inputValue, setInputValue] = useState('')

const [getUserIdFromToken, { called, loading, data, error }] = useLazyQuery(deliveryTokenQuery, {
  variables: {
    id: inputValue.toUpperCase(),
  },
})

useEffect(() => {
  if (data && data.deliveryToken) {
    onSuccess({
      userId: data.deliveryToken.vytal_user_id,
      token: inputValue,
    })
  }
}, [data, inputValue, onSuccess])

// this is called on button tap
const submitToken = async () => {
  Keyboard.dismiss()
  getUserIdFromToken()
}

// later in the render...

<TextInput
  onChangeText={(val) => {
    setInputValue(val)
    if (called) {
      // clean/reset query here?  <----------------------
    }
  })
/>

【问题讨论】:

  • 不使用效果,使用onCompleted,在submitToken中传递变量,不在查询def中

标签: react-native graphql react-apollo


【解决方案1】:

感谢@xadm 指出解决方案:我必须在 useLazyQuery 选项中提供 onCompletedonError 回调,并将变量传递给调用函数,而不是在 useLazyQuery 选项中。最后的工作代码如下所示:


const [inputValue, setInputValue] = useState('')
const [codeError, setCodeError] = useState<string | undefined>()

const [getUserIdFromToken, { loading }] = useLazyQuery(deliveryTokenQuery, {
  onCompleted: ({ deliveryToken }) => {
    onSuccess({
      userId: deliveryToken.vytal_user_id,
      token: inputValue,
    })
  },
  onError: (e) => {
    if (e.graphQLErrors &&  e.graphQLErrors[0] === 'DELIVERY_TOKEN_NOT_FOUND') {
      return setCodeError('DELIVERY_TOKEN_NOT_FOUND')
    }
    return setCodeError('UNKNOWN')
  },
})

const submitToken = () => {
  Keyboard.dismiss()
  getUserIdFromToken({
    variables: {
      id: inputValue
    },
  })
}

【讨论】:

  • 这行得通,但问题是loadingonCompleted/onError 被调用之前更新,这会导致不希望的渲染状态“闪烁”。
猜你喜欢
  • 2020-07-20
  • 2020-05-18
  • 1970-01-01
  • 2020-05-31
  • 2016-05-31
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多