当钩子的初始值是来自数据库的查询结果时,“比上一次渲染期间渲染的钩子更多”错误

Posted

技术标签:

【中文标题】当钩子的初始值是来自数据库的查询结果时,“比上一次渲染期间渲染的钩子更多”错误【英文标题】:"Rendered more hooks than during the previous render" error when the initial value for the hook is a query result from a database 【发布时间】:2020-04-07 21:26:12 【问题描述】:

我正在使用 React 的钩子,我希望有一个从数据库中检索的值作为初始值。但是,我收到以下错误:

Invariant Violation: Invariant Violation: 渲染的钩子多于 在上一次渲染期间。

const  data, loading, error  = useQuery(GET_DATA)
const  initialValue  = data
const [value, setValue] = useState(initialValue)

我正在使用 React Apollo 钩子。

更新

export default NotificationScreen = ( navigation ) => 
    const  data: initialNotificationSettings, loading: loadingInitialSettings, error: initialSettingsError  = useQuery(GET_NOTIFICATION_SETTINGS)
    if (loadingInitialSettings) 
        return (
            <View style=[styles.container, styles.horizontal]>
                <ActivityIndicator size="large" color="#FF5D4E" />
            </View>
        )
    
    if (initialSettingsError) return <Text>Error...</Text>

    const 
        borrowerLendingNotificationToken,
     = initialNotificationSettings.me
    const [borrowerPending, notifyBorrowerPending] = useState(borrowerLendingNotificationToken)

    return (
        <SafeAreaView style=styles.container>
        </SafeAreaView>
    )

【问题讨论】:

你能分享你的组件的完整代码吗? @TuanLuong 我已经包含了完整的代码 【参考方案1】:

问题是你在返回下面使用钩子。尝试更新

export default NotificationScreen = ( navigation ) => 
    const  data: initialNotificationSettings, loading: loadingInitialSettings, error: initialSettingsError  = useQuery(GET_NOTIFICATION_SETTINGS)

    const [borrowerPending, notifyBorrowerPending] = useState("")

    useEffect(() => 
        if (initialNotificationSettings.me) 
            const  borrowerLendingNotificationToken  = initialNotificationSettings.me
            notifyBorrowerPending(borrowerLendingNotificationToken);
        
    , [initialNotificationSettings]);

    if (loadingInitialSettings) 
        return (
            <View style=[styles.container, styles.horizontal]>
                <ActivityIndicator size="large" color="#FF5D4E" />
            </View>
        )
    
    if (initialSettingsError) return <Text>Error...</Text>

    return (
        <SafeAreaView style=styles.container>
        </SafeAreaView>
    )

【讨论】:

如果 loadingInitialSettings 或 initialSettingsError 为真,则不会呈现您的 borrowerPending。组件内部的所有钩子在每次渲染时都必须相同。 你让我开心,谢谢! 不断给予的礼物.. 感谢您的回复!!

以上是关于当钩子的初始值是来自数据库的查询结果时,“比上一次渲染期间渲染的钩子更多”错误的主要内容,如果未能解决你的问题,请参考以下文章

错误:渲染的钩子比上一次渲染时更多

渲染的钩子比上一次渲染时更多

Next.JS“比上一次渲染时渲染了更多的钩子”

React Hooks 渲染的钩子比上一次渲染时更多

React - 出现“渲染的钩子比上一次渲染时更多”错误

使用 useEffect 渲染的钩子比上一次渲染时更多