反应原生上下文和不推荐使用的超级用法

Posted

技术标签:

【中文标题】反应原生上下文和不推荐使用的超级用法【英文标题】:React native context and deprecated super usage 【发布时间】:2021-01-01 02:55:53 【问题描述】:

我已经离开 React Native 编程一周了,当我回来时,在一些 VSCode 更新之后,我注意到我在类构造函数中的许多 super(props) 调用现在被标记为已弃用。原因似乎是一些遗留上下文 API 问题,在此链接中对此进行了解释:React Native Legacy Context

我从链接中了解了一些影响上下文使用的问题。但是,我现在有点困惑是否需要拨打super()super(props) 或根本不拨打电话。我之前的理解是,编写一个扩展基类的类,总是需要调用super()。如果基类构造函数还使用构造函数中接收到的任何道具,则还需要使用super(props) 传递道具。

在我的代码中,如果我需要一个有状态的组件,我几乎总是扩展 React.Component。我很少需要在constructor()s 中使用this.props,如果需要,我只使用它来设置初始状态对象,之后我会处理生命周期方法的更改。以下是我的大多数类组件的外观:

class ExampleComponent extends React.Component 
    constructor(props)
        super(props);  // super marked as deprecated here
        // super();    // super NOT marked as deprecated here

        this.state = 
            value: this.props.initialValue || 0
        ;
    

    componentDidUpdate = (prevProps, prevState, snapshot) => 
        // I would not actually do that, but for the sake of an example
        if (this.state.value > 10)
            this.setState( value: 10 );
        
    

    increment = () => 
        const value = this.state.value + 1;
        this.setState( value );
    

    render = () => 
        return <View>
            <Text>Current value is:  this.state.value </Text>
            <TouchableOpacity onPress= this.increment >
                <Text>Add one!</Text>
            </TouchableOpacity>
        </View>;
    

有人可以帮我理解super 在 React Native 环境中的正确用法吗?我还应该提到我正在使用基于 React 16.11 发布的 Expo SDK 38。我不清楚上述弃用是否也会影响这个版本的 React/React native。

【问题讨论】:

【参考方案1】:

在进一步研究之后,似乎我对super()super(props) 的使用的了解是正确的。我遇到super(props) 被标记为已弃用的问题是由于 React 的 TS 定义中的错误弃用标记。

应该被标记为弃用的是 super 的重载形式 super(props, context),它采用了 React 的遗留上下文 API 使用的 context 属性。

在 Microsoft 的 TypeScript github 页面上的这个(当前开放的)问题上更好地描述和讨论了这个问题:https://github.com/microsoft/TypeScript/issues/40511

在问题得到解决之前,可以放心地忽略弃用警告。

【讨论】:

好像patch 正在路上。

以上是关于反应原生上下文和不推荐使用的超级用法的主要内容,如果未能解决你的问题,请参考以下文章

如何在本机反应中模拟上下文消费者反应元素

基于类的项目中的反应原生黑暗主题

更新的反应上下文值未反映在上一个屏幕中

IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,谁用谁知道)

反应原生导航在屏幕之间移动

如何将反应上下文与反应导航一起使用