【问题标题】:React native typescript: usecontext functions not firing from inside child component反应本机打字稿:usecontext函数不会从子组件内部触发
【发布时间】:2020-12-03 00:38:38
【问题描述】:

当我尝试在 React 本机 Android 应用程序的子组件内使用上下文中的函数时遇到问题。

以下是我的上下文代码,以及我在其中使用它的表单组件(为简洁起见,已删除)。

“isFormOpen”对象可以从包含在提供程序中的任何子组件中毫无问题地读取,但是当我尝试从同一个子组件调用“toggleForm”函数时,它什么也不做,也没有控制台错误。

我有另一个上下文,它在结构和语法上是相同的,除了变量名和函数名等,而且效果很好,所以我有点困惑为什么这不起作用。我删除了其他上下文,认为可能存在某种类型的冲突,但没有解决。

AccountContext.tsx

import React, { FC, createContext, useContext, useState } from 'react';

interface AccountContextType {
    isFormOpen: boolean,
    toggleForm: (toggle: boolean) => void
};

export const AccountContext = createContext<AccountContextType>({
    isFormOpen: false,
    toggleForm: () => null
});

export const AccountContextProvider: FC = props => {
    const [formOpen, setFormOpen] = useState<boolean>(false);

    const toggleForm = (toggle: boolean) => {
        setFormOpen(toggle);
    }

    const value: AccountContextType = {
        isFormOpen: formOpen,
        toggleForm
    }

    return (
        <AccountContext.Provider value={value}>
            {props.children}
        </AccountContext.Provider>
    )
}

export const useAccountContext = () => useContext(AccountContext);

TrackUploadForm.js

import React from 'react';
import { SafeAreaView } from 'react-native';
import { Button } from 'react-native-paper';

import { useAccountContext } from '../contexts/AccountContext';
import { AccountContextProvider } from '../contexts/AccountContext';

const TrackUploadForm = () => {
    const accountContext = useAccountContext();

    return (
        <AccountContextProvider>
            <SafeAreaView>
                <Button onPress={() => accountContext.toggleForm(false)} mode='outlined'>Cancel</Button>
            </SafeAreaView>
        </AccountContextProvider>
    )
};

export default TrackUploadForm;

【问题讨论】:

    标签: reactjs typescript react-native use-context


    【解决方案1】:
    1. useAccountContext 在提供者之外被调用
    export default function App() {
      return (
        <AccountContextProvider>
          <Content />
        </AccountContextProvider>
      );
    }
    
    const Content = () => {
      const accountContext = useAccountContext();
      return (
        <div className="App">
          <h1>{accountContext.isFormOpen ? "true" : "false"}</h1>
          <Button onPress={() => accountContext.toggleForm(false)} mode='outlined'>Cancel</Button>
        </div>
      );
    };
    
    1. accountContext.toggleForm(false) accountContext.toggleForm(!accountContext.isFormOpen)

    我们在一起 https://codesandbox.io/s/cranky-panini-yo129

    【讨论】:

    • 哦,哇,成功了。我不认为它会的原因是因为我确实将包装器在树中向上移动,但只是没有包装整个应用程序。我的印象是您可以包装您想要的任何组件及其所有子组件都可以使用上下文,并且它的重点是只允许某些组件使用上下文。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多