【问题标题】:Passing a function to edit state from class component to function based component through props not working通过 props 传递一个函数来编辑从类组件到基于函数的组件的状态不起作用
【发布时间】:2020-11-23 22:15:32
【问题描述】:

我有一个反应前端,我的大部分组件都是基于类的组件,但碰巧这些类组件中的一个组件必须是功能组件,所以我目前有一个基于类的功能组件组件。

在功能组件内部,我有一个触发 fetch 调用的按钮。在这个 fetch 调用完成后,我希望更新基于类的(父)组件的状态。

我的方法是在基于类的组件(称为 setSubscriptoin)中创建一个函数来调整基于类的组件的状态,然后通过 props 将该函数传递给函数式组件,并在之后使用 .then 承诺调用该函数fetch 调用。

但是,似乎当我通过道具传递函数时,功能组件甚至无法检测到该函数,并且出现此错误: Uncaught (in promise) TypeError: e.setSubscription is not a function.

这里是重要的代码:

基于类的组件:

class OuterComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {subscription: {}}
    }

    setSubscription(subscription) {
        this.setState({subscription: subscription})
    }

    render() {
        return(
            <Elements>
                <FunctionComponent setSubscription={this.setSubscription.bind(this)}></FunctionComponent>
            </Elements>
        )
    }
}

我想包括元素部分,因为我不确定这是否会影响它。 FunctionComponent 包装在 Stripe Elements 提供程序中。不知道为什么会这样做,但我想我应该包括它以防万一。

功能组件:

const FunctionComponent = (props) => {
    const fetchSomething = () => {
        fetch('fetch is made here and is successful')
        .then(response => {
            if (some_condition) {
                props.setSubscription({value1: 1, value2: 2}))
            }
        } 
    }
} 

问题在于函数组件甚至无法将 props.setSubscription 识别为函数(如错误所示)。

我已经尝试在控制台记录 props 变量,它实际上有 setSubscription 函数,所以我不知道问题可能是什么。我一直试图弄清楚这一点,我完全被难住了。有谁知道为什么会发生这个错误?

【问题讨论】:

    标签: javascript reactjs react-hooks stripe-payments react-props


    【解决方案1】:

    then 应该有一个回调试试这个:

    const FunctionComponent = (props) => {
        const fetchSomething = () => {
            fetch('fetch is made here and is successful')
            .then(()=>props.setSubscription({value1: 1, value2: 2}))  
        }
    }
    

    【讨论】:

    • 对不起,这只是我的 stackoverflow 问题中的一个错字,我的实际代码就是这样。此外,该函数是从 if 语句中调用的,这可能值得注意。您知道在这种情况下可能出现什么问题吗?
    • 我编辑了问题中的代码以更准确
    • 我已经为你创建了一个沙箱代码codesandbox.io/s/admiring-golick-2ngjr?file=/src/Child.js
    • 感谢所有帮助。我在这里实现了所有东西,由于某种原因,它仍然给出完全相同的类型错误。最奇怪的是,如果你执行 console.log(props),setSubscription 函数就会出现,但如果你调用 props.setSubscriptoin(),它会说该函数不存在。知道它可能是什么吗?
    • 只需为您的代码创建一个代码框,这样我就可以更好地帮助您。
    猜你喜欢
    • 2018-08-31
    • 2021-10-20
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多