【问题标题】:How to call a function from another class in React-Native?如何从 React-Native 中的另一个类调用函数?
【发布时间】:2017-04-27 04:01:58
【问题描述】:

我正在研究 React-Native,我想从不同的类调用一个函数,但是当我尝试这样做时,它显示了一些错误。

A 类

import B from './B.js';

class A extends Component {
    _onItemPressed(item){
        B.abc();
    }

    render() {
      return (
         <TouchableHighlight
            underlayColor={Colors.colors.lightgrey}
            style={{padding: 15}}
            onPress={this._onItemPressed.bind(this)}>
         <Text>Click Me !</Text>
         </TouchableHighlight>
      );
    }
}

B 类

class B extends Component {

    abc(){
      alert('Hello World');
    }

    render() {
      return (
         <View>
            <Text>Welcome to React Native</Text>
         </View>
      );
    }
}

但按下 A 类中的按钮后出现错误消息,'undefined is not a function (evalating 'B.default._abc()')'

请仔细阅读我的帖子并建议我一些解决方案。

谢谢

【问题讨论】:

  • 您要直接使用组件类吗?您需要实例化该类或将方法更改为静态才能调用它。
  • 嘿,谢谢,但我想让函数静态,没有静态你知道如何访问这个函数

标签: react-native


【解决方案1】:

你有两个选择,要么使用对象,要么使用类名,让我们从对象开始

class B {
  abc() {
    alert("Hello World");
  }
}
const b = new B();
export default b;

所以当你调用这个文件时,你可以像下面这样访问函数 abc

import b from './B.js';
class A extends Component {
    _onItemPressed(item){
        b.abc();
    }
...

另一种方法是使用类代替如下

class B{}
B.abc = function(){
    alert("Hello World");
}
module.exports = {
  functions: B
};

所以当你调用这个文件时,你可以像下面这样访问函数 abc

import b from './B.js';
class A extends Component {
    _onItemPressed(item){
        b.functions.abc();
    }
...

注意:B类不应该是一个组件,你可以将它作为一个帮助类。

另外,您可以使用单例模式增强处理对象的方式,正如我在 React native- Best way to create singleton pattern

UPDATE:如果坚持使用组件而不是类函数,可以通过引用调用,如下:

export default class B extends Component {
  constructor(props) {
    super(props);
    this.abc = this.abc.bind(this);
   }
    abc(){
      alert('Hello World');
    }

    render() {
      return null
    }
}

现在在 A 组件中,您可以通过引用调用 B

import B from "./B.js";
class A extends Component {
  _onItemPressed(item) {
    this._b.abc();
  }
  render() {
    return (
      <TouchableHighlight
        underlayColor={Colors.colors.lightgrey}
        style={{ padding: 15 }}
        onPress={this._onItemPressed.bind(this)}
      >
        <Text>Click Me !</Text>
        <B ref={ref => (this._b = ref)} />
      </TouchableHighlight>
    );
  }
}

【讨论】:

  • hello hussam kurd 在组件 B 中我正在使用 setState,它会引发如下错误:警告:无法在尚未安装的组件上调用 setState。这是一个无操作,但它可能表明您的应用程序中存在错误。相反,直接分配给this.state 或在A 组件中定义具有所需状态的state = {}; 类属性。你能帮我吗
  • B组件中的setState是在哪里执行的?
【解决方案2】:

您没有开始上课,要解决此问题,您需要将B.abc() 更改为new B().abc()

【讨论】:

  • 我不知道为什么这没有被选为正确答案!
【解决方案3】:

我注意到你没有导出你的 B 类。试试

class B extends Component {
   static abc(){
     alert('Hello World');
   }}
export default B

然后在A类中导入它

import B from './B';

如果这对你有用,请告诉我。

【讨论】:

  • 在 A 类中我如何使用它。
【解决方案4】:

您必须使用构造函数创建父类,访问超级方法以很好地扩展组件类,然后导出父类并将其扩展到您可以通过该类的上下文访问此功能的类 A

export default class B extends Component {
    constructor(props){
      super(props);
    }
    abc(){
        alert('Hello World');
    }

    render() {
        return (
            <View>
                <Text>Welcome to React Native</Text>
            </View>
        );
    }
}






import B from './B.js';

export default class A extends B {

    _onItemPressed(item){
        this.abc();
    }

    render() {
        return (
            <TouchableHighlight
                underlayColor={Colors.colors.lightgrey}
                style={{padding: 15}}
                onPress={this._onItemPressed.bind(this)}>
                <Text>Click Me !</Text>
            </TouchableHighlight>
        );
    }
}

【讨论】:

    【解决方案5】:

    我在此页面上尝试了各种解决方案,但都没有奏效。我在这里从另一个网页复制解决方案。非常简单和令人印象深刻。可能会帮助寻找简单解决方案的人:

    How to Call Another Class Function From Default Class in React Native

    这是完整的示例代码:

    import { StyleSheet, View, Alert, Platform, Button } from 'react-native';
    
    export default class MyProject extends Component {
    
      constructor(props) {
    
           super(props)
    
          Obj = new Second();
    
         }
    
         CallFunction_1=()=>{
    
          Obj.SecondClassFunction() ;
    
         }
    
         CallFunction_2=()=>{
    
                Obj.SecondClassFunctionWithArgument("Hello Text");
    
        }
    
      render() {
    
        return (
    
          <View style={styles.MainContainer}>
    
            <View style={{margin: 10}}>
    
              <Button title="Call Another Class Function Without Argument" onPress={this.CallFunction_1} />
    
            </View>
    
            <View style={{margin: 10}}>
    
              <Button title="Call Another Class Function With Argument" onPress={this.CallFunction_2} />
    
            </View>
    
          </View>
    
        );
      }
    }
    
    class Second extends Component {
    
      SecondClassFunction=()=>{
    
        Alert.alert("Second Class Function Without Argument Called");
    
      }
    
      SecondClassFunctionWithArgument=(Value)=>{
    
        Alert.alert(Value);
    
      }
    
    }
    
    const styles = StyleSheet.create(
    {
      MainContainer: {
        justifyContent: 'center',
        alignItems: 'center',
        flex: 1,
        backgroundColor: '#F5FCFF',
        paddingTop: (Platform.OS) === 'ios' ? 20 : 0
      }
    
    });
    

    【讨论】:

    • 我也在尝试。我可以从另一个类调用方法,但我不能改变状态
    • 酷....除了它可能比你上面解释的更简单,但它确实有帮助。
    【解决方案6】:

    我可以看到您没有导出 B 类,您只是在导入。请尝试在 B 类文件的底部添加 export 语句,如 export default B

    希望对你有帮助

    【讨论】:

      【解决方案7】:

      将 abc 函数设为静态并导出 B 类。

      export default class B extends Component {
      
          static abc(){
            alert('Hello World');
          }
      }
      

      【讨论】:

        【解决方案8】:

        在另一个类中导入第一个类,您要在其中使用第一个类中定义的函数。在这种情况下,我们使用的是在 class1 到 class2 中定义的函数。

        export default class class1 extends React.Component{
        constructor(props)
        {
        ...
        }
        
        static function(){
        ...
        }
        }
        
        
        **Now import it to another class i:e; class2**
        
        import class1 from 'class1';
        
        export default class class2 extends React.Component{
        
        componentWillMount()
        {
        class1.function();
        }
        
        
        
        }
        

        【讨论】:

        • 请与您的代码分享一些解释作为答案。
        猜你喜欢
        • 2019-03-24
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        相关资源
        最近更新 更多