我使用反应原生0.48,我想知道以下是否可能。
所以我的目的是让我的代码更加可重用。 我有4个类,每个类在componentDidMount中都有类似的代码。 它们共享类似的代码componentDidMount(),但render方法中的其余代码有点不同。
我的想法是跨类共享代码:
class 1
componentDidMount(){
componentDidMountTemplate().bind(this);
}
其中insideDidMountTemplate(它只是一个导出的函数),使用“this”关键字的代码应该对类1中的对象进行操作,或者基本上是任何调用和绑定它的类
但是行componentDidMountTemplate()。bind(this);生成此错误:
无法将类作为函数调用
任何解决方案?想法?
答案 0 :(得分:2)
你没有绑定任何东西,bind方法返回一个新的实例而你没有将它存储在任何地方,并且最重要的是你没有在它自己的函数上运行绑定,而是你在返回的值上做了它该功能与您使用()
并调用它一样
我不确定你在代码中重复使用的是什么,因为你没有提供更多的细节,但基本上你根本不需要绑定它,只需将this
对象传递给外部函数。
所以你有两个主要选择:
componentDidMountTemplate
被声明为箭头函数,那么绑定将不起作用,因为箭头函数在词汇上下文中使用this
(参见我的示例)。这只是一个小概念验证的片段:
class MyClass {
externalFunc = ref => {
console.log("passing the this explicit as a parameter", ref.state);
};
externalFunc2() {
// depending on bind and praying for the best!
console.log("depending on bind ", this.state);
}
externalFunc3 = () => {
// with arrow functions bind won't work
//because `this` is bound in a lexical context
console.log("arrow function", this.state);
};
}
const MyClassInstance = new MyClass();
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
someValue: "123"
};
this.externalFunc2 = MyClassInstance.externalFunc2.bind(this);
this.externalFunc3 = MyClassInstance.externalFunc3.bind(this);
}
componentDidMount() {
MyClassInstance.externalFunc(this);
this.externalFunc2();
this.externalFunc3();
}
render() {
return (
<div>
<div>Look at the console!</div>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
答案 1 :(得分:0)
您可以使用类属性并将componentDidMount
定义为组件内部的箭头函数(而不是方法)。箭头函数使用词法this
,因此您不必费心使用函数绑定。例如:
componentDidMount = () => {
// you can access `this` safely
}
答案 2 :(得分:0)
componentDidMountTemplate().bind(this);
应该是
this.componentDidMountTemplate = componentDidMountTemplate.bind(this);
.bind()
返回一个新的绑定函数。您需要将该函数存储在一个值中,然后调用它。
现在您可以致电this.componentDidMountTemplate()
此外,只要您在函数旁边写()
,该函数就会被调用
答案 3 :(得分:0)
您可以绑定该函数,然后立即调用它:
componentDidMount() {
(componentDidMountTemplate.bind(this))();
}
它由两部分组成 - 首先,将组件上下文绑定到函数(.bind(this)
),然后再调用返回的函数。
答案 4 :(得分:0)
你得到的错误是可疑的。虽然您似乎错误地使用bind
,但我希望错误:Cannot read property 'bind' of undefined
你的componentDidMountTemplate
是一堂课吗?我假设您要将其更改为某个功能,然后按照以下有关bind
的建议。
如果要调用绑定功能,则需要()
之后的bind()
。否则,您正在调用未绑定的函数,然后尝试绑定从它返回的任何内容。
componentDidMount(){
componentDidMountTemplate.bind(this)();
}
这意味着创建了一个新的绑定函数,然后立即调用
正如许多其他答案所暗示的那样,React组件通常最初绑定函数并存储对绑定函数的引用。但是在您的情况下,您可能只调用一次,因为componentDidMount
生命周期方法只调用一次。