我的Reaction Native项目中有一个状态变量.它需要在调用特定函数时进行更新.然而,setState方法是异步的,这会导致我的变量在应该更新之后进行更新.

我需要做的是:

  • 屏幕以所述变量作为空数组开始;
  • 当屏幕被聚焦时,填充数组,并根据数组在屏幕上创建组件;

正在发生的情况是:

  • 屏幕以所述变量作为空数组开始;
  • 当屏幕被聚焦时,我try 用setState填充数组;
  • 在try 创建组件时,由于数组为空,因此什么也不会发生;
  • 在生成页面后填充array.

为了说明这是如何管理的,下面是我的代码:

const MyComponent: FC<MyComponentProps> = ({/*my component props*/}) => {
  const [rows, setRows] = useState<Array<boolean>>([]);

  useEffect(() => {
    console.log('rows on useEffect: ', rows);
  }, [rows]);

  async function OnFocus(): Promise<void> {

    await GetApplication();
  }

  async function GetApplication(): Promise<void> {
      const _state: ApplicationParameters = await ctrl.getApplicationParameters(
        ctrl.ctrl.getDevice()
      );
      
      console.log('_state.rows: ', _state.rows);
      console.log('rows before setRows()', rows);
      setRows(_state.rows!);

      console.log('rows after setRows()', rows);
    }

    return(
        <RowBars theme={theme} rows={rows} />
    )
}
 

上述代码的日志(log)显示:

LOG  _state.rows:  [true, true, true, true, true, true, true, true, true, true, true]
LOG  rows before setRows() []
LOG  rows after setRows() []
LOG  rows on useEffect() [true, true, true, true, true, true, true, true, true, true, true]
LOG  rows on useEffect() [true, true, true, true, true, true, true, true, true, true, true]

如果有什么触发了状态更新,数组将显示为已填充,但不会生成任何内容.

稍后使用我的变量的组件如下所示:

interface RowBarsProps {
  theme: AppColors;
  rows: Array<boolean>;
}

export const RowBars: FC<RowBarsProps> = ({ theme, rows }: RowBarsProps) => {
  const [Rows] = useState<number>(rows.length);

  const _rows = [];
  for (let i = 0; i < Rows; i++) {
    _rows.push(<RowBar theme={theme} isOn={rows[i]} />);
  }

  return <RowToRowLiteBars>{_rows}</RowToRowLiteBars>;
};

我试过:

  • 更新rowsuseEffect.然而,我没有一个可靠的变量来监视useEffect的依赖数组;
  • 从继承的props变量初始化行.然而,因为当rows被更新时,props变量还没有被更新,它试图从一个未定义的值设置rows.

推荐答案

仔细查看我的代码,我发现问题出在子组件上.发生的情况是,它不是为感知父组件中的变化而构建的.

我所做的是创建一个useEffect()来观察即将到来的rows的变化.

我不知道这是不是最好的做法,但效果很好.

export const RowBars: FC<RowBarsProps> = ({ theme, rows }: RowBarsProps) => {
  const [rowBars, setRowBars] = useState<RowBarsState>([]);

  // Updates the row bars according to `rows` current state
  useEffect(() => {
    setRowBars(() => {
      const newRowBars = rows.map((row) => <RowBar theme={theme} isOn={row} />);
      return newRowBars;
    });
  }, [rows, theme]);

  return <RowToRowLiteBars>{rowBars}</RowToRowLiteBars>;
};

Typescript相关问答推荐

typescribe不能使用值来索引对象类型,该对象类型满足具有该值的另一个类型'

TypeScrip:基于参数的条件返回类型

有条件地删除区分的联合类型中的属性的可选属性

使用打字Angular 中的通用数据创建状态管理

我可以以这样一种方式键入对象,只允许它的键作为它的值吗?

MatTool提示在角垫工作台中不起作用

函数重载中的不正确TS建议

如何在Typescript 中组合unions ?

布局组件中的Angular 17命名路由出口

确保对象列表在编译时在类型脚本中具有唯一键

我在Angular 17中的environment.ts文件中得到了一个属性端点错误

在组件卸载时try 使用useEffect清除状态时发生冲突.react +打字

17个Angular 的延迟观察.如何在模板中转义@符号?

如何通过属性名在两个泛型数组中找到匹配的对象?

在Reaction中折叠手风琴

三重融合视角与正交阵

React Context TypeScript错误:属性';firstName';在类型';iCards|iSearch';

有没有一种简单的方法可以访问Keyboard Shortcuts JSON文件中列出的每个命令的显示名称(标题)?

带有过滤键的 Typescript 映射类型

是否可以使用元组中对象的键来映射类型