- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
什么是forwardRef用angular做的,它的用法是什么?
这是一个 example :
import {Component, Injectable, forwardRef} from '@angular/core';
export class ClassCL { value; }
@Component({
selector: 'my-app',
template: '<h1>{{ text }}</h1>',
providers: [{provide: ClassCL, useClass: forwardRef(() => ForwardRefS)}]
})
export class AppComponent {
text;
constructor( myClass: ClassCL ) {
this.text = myClass.value;
}
}
Injectable()
export class ForwardRefS { value = 'forwardRef works!' }
最佳答案
根据 Angular 的文档:
Allows to refer to references which are not yet defined.
我认为,为了更好地理解 forwardRef 的工作原理,我们需要了解 Javascript 引擎盖下的事情是如何发生的。我将提供您可能需要使用 forwardRef 的特定情况的示例,但请考虑可能出现的其他不同情况。
我们可能知道,Javascript 函数被提升到其执行上下文的顶部。函数本身就是对象,其他对象也可以从函数创建。因为函数允许程序员创建对象实例,ECMAScript 2015 创建了某种语法糖以使 Javascript 感觉更接近基于类的语言,如 Java。进入类(class):
class SomeClassName { }
如果我们进入 Javascript 编译器(在我的例子中我使用的是 Babel)并粘贴它,结果将是:
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SomeClassName = function SomeClassName() {
_classCallCheck(this, SomeClassName);
};
最有趣的部分是注意到我们现实中的类是后台的一个函数。与函数一样,变量也在其执行上下文中被提升。唯一的区别是,虽然我们可以调用函数(因为我们可以引用它的指针,即使它被提升了),变量也会被提升并赋予默认值 undefined。在运行时在赋值的给定行为变量分配一个值,可能不是未定义的值。例如:
console.log(name);
var name = 'John Snow';
实际上变成了:
var name = undefined;
console.log(name) // which prints undefined
name = 'John Snow';
好的,考虑到所有这些,现在让我们进入 Angular。假设我们的应用程序中有以下代码:
import { Component, Inject, forwardRef, Injectable } from '@angular/core';
@Injectable()
export class Service1Service {
constructor(private service2Service: Service2Service) {
}
getSomeStringValue(): string {
return this.service2Service.getSomeStringValue();
}
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private service1Service: Service1Service) {
console.log(this.service1Service.getSomeStringValue());
}
}
export class Service2Service {
getSomeStringValue(): string {
return 'Some string value.';
}
}
当然,我们需要提供这些服务。让我们在 AppModule 中提供它们:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent, Service1Service, Service2Service } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [Service1Service, Service2Service],
bootstrap: [AppComponent]
})
export class AppModule { }
AppModule 的元数据中重要的一行是:
providers: [Service1Service, Service2Service]
如果我们运行这段代码,我们会得到以下错误:
嗯嗯,很有趣...这是怎么回事?那么,根据前面的解释,Service2Service 变成了一个后台函数,但是这个函数被赋值到一个变量中。此变量已提升,但其值未定义。由于这一切,无法解析参数。
输入forwardRef
为了解决这个问题,我们有一个名为forwardRef 的漂亮函数。这个函数的作用是它接受一个函数作为参数(在我展示的例子中我使用了箭头函数)。这个函数返回一个类。 forwardRef 等到 Service2Service 被声明,然后它触发被传递的箭头函数。这导致返回我们创建 Service2Service 实例所需的类。因此,您的 app.component.ts 代码将如下所示:
import { Component, Inject, forwardRef, Injectable } from '@angular/core';
@Injectable()
export class Service1Service {
constructor(@Inject(forwardRef(() => Service2Service)) private service2Service) {
}
getSomeStringValue(): string {
return this.service2Service.getSomeStringValue();
}
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private service1Service: Service1Service) {
console.log(this.service1Service.getSomeStringValue());
}
}
export class Service2Service {
getSomeStringValue(): string {
return 'Some string value.';
}
}
总而言之,根据我提供的示例,forwardRef 允许我们引用稍后在我们的源代码中定义的类型,防止我们的代码崩溃并为我们在代码中组织事物的方式提供更大的灵 active 。
希望我的回答对您有所帮助。 :)
关于angular - forwardRef 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50894571/
我使用的技术是 react、typescript 和 styled-components。我正在尝试创建选择组件以便在 React Hook Form 中使用它。起初,看起来一切都是正确的,但我从 t
什么是forwardRef用angular做的,它的用法是什么? 这是一个 example : import {Component, Injectable, forwardRef} from '@an
我买了一个 Angular 4 模板,主要是为了看看布局是如何完成的,但包括工作组件,我注意到他们在应用程序组件中有一堆设置,主要用于菜单、更改样式、主要控制外部框架. 在菜单组件和其他一些组件中,它
这是我的带有 forwardRef 的自定义组件。 ref 在组件内部代码中是必需的,但父组件将其作为 prop 发送是可选的 const MyComponent = React.forwardRef
@Component({ selector: 'my-component', template: ``, providers: [ { provide: SourceCompone
TL;DR:我在库中有一个功能组件,它具有 react@^16.3.0 作为对等依赖项。如果我将此组件包装在 React.forwardRef 中,这是否是重大更改? 根据 forwarding Re
我当前正在运行 React 16.3.1 和 Styled Components 3.2.5,并且在尝试使用 React.forwardRef 时遇到问题。 我有一个输入组件,它由一个包含标签和输入字
我正在将我的应用程序移动到 Material UI V4,并且当以编程方式设置“to”属性时,我正在努力将我的 react 路由器链接组件移动到 forwardRef 包装的组件中。 下面的代码有效,
我不明白这是什么意思: const FancyButton = React.forwardRef((props, ref) => ( {props.children} )); 如果
我正在尝试使用 React.forwardRef,但对如何让它在基于类的组件(而非 HOC)中工作感到困惑。 文档示例使用元素和功能组件,甚至将类包装在高阶组件的函数中。 因此,从类似 this 的内
我有一个用 React.forwardRef 包装的组件,碰巧它也是一个复合组件。 我不知道该如何保养 Form.Item = FormItem; 同时 Form 组件函数被 forwardRef
父组件: const Parent = (props) => { const ref = useRef(); return } 和 child : const Child = forward
我已经使用 React 转发了 ref forwardRef 下面是我的代码: interface PropsDummy {} const ProfileMenu = forwardRef((prop
我需要访问组件内的文本区域的引用。在组件中,它很简单: const MyComponent = () => { const inputRef = useRef(); return } 现在
我正在尝试编写两个 React 样式的组件(使用 Emotion 10),将一些自定义渲染逻辑指定到其中一个中,并保留检索它们的“引用”的能力。 这是我的代码: const Foo = styled(
我对 React.forwardRef 的观点感到困惑.正如其 documentation 中所述,据我所知,它的主要用途是用于 父组件 访问 DOM 的元素子组件 .但我已经可以做到这一点,甚至不必
我收到警告 Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did
我有一个属于 UI 库的组件,我们称它为输入组件。使用这个库调用Input时,我可以调用的类型有很多。例如 现在我想给这个Input组件写一个wrapper,所以我这样写 type InputW
我需要使用 ref获取孙组件的状态,我使用 useImperativeHandle 对其进行了自定义,简化了整个代码 here . function App() { const ref = use
我目前在我的 React 应用程序中收到以下错误: Function components cannot be given refs. Attempts to access this refwill
我是一名优秀的程序员,十分优秀!