0

使用 javascript ES6 (React),我无法调用导入类的简单方法。

这段代码有什么问题?

类型错误:WEBPACK_IMPORTED_MODULE_1__Seed .a.test 不是函数

// App.js
import React from 'react';
import Seed from './Seed';

class App extends React.Component {

  constructor(props) {
    super(props);
    console.log('start1');
    Seed.test();
  }

  render() {
    return("ei");
  }

}

export default App;

// Seed.js
import React from 'react';

class Seed extends React.Component {

  constructor(props) {
    super(props);
    console.log('seed1');
  }

  test() {
    console.log('seed test');
  }

};

export default Seed;
4

3 回答 3

3

选项很少,具体取决于您要执行的操作

1) 如果此函数与 Seed 的实例无关,则将其设为静态。

class Seed extends React.Component {
  static test() {
    console.log('seed test');
  }
  // ...etc
}

然后你可以用你已经调用它的方式来调用它。

2)如果它需要绑定到种子的特定实例,您可以新建一个然后调用它。例如:

const mySeed = new Seed();
mySeed.test();

鉴于 Seed 是一个 react 组件,这很可能不是您想要做的,因为您应该让 react 进行组件的实例化,然后通过 props 与之交互

3)使用 refs 让 react 给你一个组件的引用。我假设您使用的是 react 16 或更高版本,因此可以访问 React.createRef

constructor(props) {
  super(props);

  this.seedRef = React.createRef();
}

componentDidMount() {
  this.seedRef.current.test();
}

render() {
  return <Seed ref={this.seedRef}/>
}

这更好,但是您是否希望直接与组件交互仍然值得怀疑。

4)使用props,不要直接调用。究竟如何执行此操作取决于您要执行的操作,但假设您只想在某些条件为真时调用该方法。然后你可以将一个道具传递给种子,种子会调用方法本身。

// in App:

render() {
  render <Seed shouldDoStuff={true} />
}

// In seed:

constructor(props) {
  super(props);
  if (props.shouldDoStuff) {
    this.test();
  }
}
于 2018-09-11T03:50:26.827 回答
2

您可以像这样将测试声明为静态

class Seed extends React.Component {

  static test() {
    console.log('seed test');
  }

  constructor(props) {
    super(props);
    console.log('seed1');
  }

};

如果您想调用testSeed 组件,请使用Seed.test()

于 2018-09-11T03:45:28.640 回答
2

你不能像这样访问一个类的方法,因为它不是static

您需要App使用 a 进行渲染<Seed />并获取该组件的引用

// App.js
import React from 'react';
import Seed from './Seed';

class App extends React.Component {
  constructor(props) {
    super(props);
    console.log('start1');
    this.seedRef = React.createRef();
  }

  componentDidMount() {
    // seedRef is the Seed instance
    this.seedRef.current.test();
  }

  render() {
    return(<Seed ref={this.seedRef} />);
  }
}

export default App;
于 2018-09-11T03:46:06.857 回答