如何在父组件中强制刷新子组件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在父组件中强制刷新子组件相关的知识,希望对你有一定的参考价值。

参考技术A

尝试,得知:在第一次首页渲染完成之后,点击 待办任务 或者 已提交任务 ,只有表格视图的局部重新渲染,而分页组件不会再次渲染,故传值无法实现。

如果要在组件内部中进行强制刷新,则可以调用 this.$forceUpdate() 强制重新渲染组件,从而达到更新目的。

在父组件中发生事件后禁用子组件中的按钮,而无需刷新页面以使禁用生效

【中文标题】在父组件中发生事件后禁用子组件中的按钮,而无需刷新页面以使禁用生效【英文标题】:Disable button in Child Component after an event in parent component without having to refresh the page for the disable to take effect 【发布时间】:2020-09-14 18:25:02 【问题描述】:

我的代码有效,但仅在页面刷新后。例如。我可以单击“继续”按钮,页面将刷新而不是在应用程序中向前移动,现在该按钮将被禁用。但是我正在寻找的是,一旦从父组件的下拉列表中选择了某个值,就禁用该按钮。继续按钮是它自己的子组件,因为它在应用程序中的许多其他组件中使用。在 Angular 版本 6 上。

父组件.html

... //Select dropdown that sets the disableContinueButton value based on what is selected

<df-child-component
    [forwardOnly]="true"
    [isAppLoading]="isAppLoading"
    [forwardDisabled]="disableContinueButton$ | async"
    [submitButtonText]="'Continue'"
  >
</df-child-component>

父组件.ts

export class ParentComponent implements OnChanges, OnInit 
      disableContinueButton$ = of(false);
      ...
      onSelectEvent() 
          //Sets the disableContinueButton flag based on what is selcted.
      

子组件.ts

import 
  Component,
  ChangeDetectionStrategy,
  Output,
  EventEmitter,
  Input,
 from '@angular/core';

@Component(
  selector: 'df-child-component',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush,
)
export class ChildComponent 
  @Input()
  forwardOnly: boolean;
  @Input()
  isAppLoading: boolean;
  @Input()
  forwardDisabled: boolean;
  @Input()
  submitButtonText: string;

  @Output()
  back = new EventEmitter();
  @Output()
  forward = new EventEmitter();

子组件.html

      <button
        type="Submit"
        class="btn btn-primary col-sm-2 order-1 order-sm-2 mb-2"
        (click)="forward.emit()"
        [disabled]="isAppLoading || forwardDisabled"
        id="nav-continue"
      >
         submitButtonText 
      </button>

【问题讨论】:

你如何更新 disableContinueButton$? 使用重新赋值:this.disableContinueButton$ = of(true); 【参考方案1】:

我无法重现这一点,但我的猜测是您的更改检测由于某种原因没有捕获更改。

我建议您使用 BehaviorSubjectSubject 而不是 observable:

export class ParentComponent implements OnChanges, OnInit 
      disableContinueButton$ = new BehaviourSubject(false);
      ...
      onSelectEvent() 
          this.disableContinueButton.next(true); // true or false
      

如果这仍然不起作用,您可以通过注入 ChangeDetectorRef 并在其上调用 markForCheckdetectChanges 来强制运行更改检测:

export class ParentComponent implements OnChanges, OnInit 
    constructor(private readonly _changeDetectorRef: ChangeDetectorRef)  

    onSelectEvent()
        // Update the value
        this._changeDetectorRef.markForCheck();
    

【讨论】:

你能举个例子吗?【参考方案2】:

使用 ViewChild 将允许您从父组件触发子组件中的函数。

【讨论】:

以上是关于如何在父组件中强制刷新子组件的主要内容,如果未能解决你的问题,请参考以下文章

vue 强制刷新子组件

vue 强制刷新组件

vue 强制刷新子组件

子组件的动态刷新问题

vue如何组件强制刷新组件

Vue组件强制刷新的解决方案