【React】函数组件强制渲染 模仿forceUpdate

场景

我遇到的问题是这样的:
维护一个state,类型是文件树类的实例,如下:

import { Node, Path } from './type';

export interface IFileeTree {
  tree: Node;
  currentNode: Node; // 当前节点
  paths: Path; // 当前文件路径
  isBackValid: boolean;
  goBack: () => void;
  intoFile: (target: Node) => void;
}

class FileTree implements IFileeTree {
  public tree;
  public currentNode;
  public paths: Path;

  constructor(tree: Node) {
    this.tree = tree;
    this.currentNode = tree;
    this.paths = [tree];
  }

  // 进入文件夹或文件
  public intoFile = (target: Node) => {
    this.currentNode = target;
    this.paths.push(target);
  };

  // 返回上一层
  public goBack = () => {
    if (!this.isBackValid) {
      return;
    }
    const { paths } = this;
    this.paths.pop();
    this.currentNode = paths[paths.length - 1];
  };

  // 当前路径是否可返回上一层
  get isBackValid() {
    return this.paths.length > 1;
  }
}

export default FileTree;

可以看到cur指针在实例中已经维护好了,在react组件中只需把tree绑定到state上就ok了。但我在展示层调用类上的方法,改变了cur指针,但是由于实例没变,引用没变,state就没有变化,所以不会render。但是我实例内部的cur指针确实是变了,react diff没查出来,但我不想再用一个state和树上的某些属性绑定,所以只能自己手动强行渲染。

解决方法

函数组件没有直接能用的hook,自己创建一个无意义state,仅用来用作强制渲染。

  const [ignored, forceUpdate] = useReducer((x) => x + 1, 0); // mimic forceupdate

比如再在组件内部调用

  const goBack = () => {
    tree?.goBack();
    forceUpdate();
  };

状态更新,所以重新render了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值