【问题标题】:react-electron ipcRenderer in useEffect does not rerenderuseEffect 中的 react-electron ipcRenderer 不会重新渲染
【发布时间】:2022-01-27 10:46:42
【问题描述】:

我正在尝试创建一个全局可访问对象,以便可以更改其值并可以从每个组件中读取。我创建了一个带有静态字段的类:

export default class Settings {
  static first: string;

  static second: string;
}

假设我在不同的文件中有两个组件:

import Settings from './Settings'

// located in firstComponent file
export default function FirstComponent() {
Settings.First = 'test'    <---------------- SET VALUE
return (some html)
}

// located in secondComponent file
export default function SecondComponent() {
let qq = Settings.First <----------------------- ASSUME HERE IS VALUE "TEST"
}

但它不起作用。如何创建可在 C# 静态类等所有组件中访问的静态类/字段。有可能吗?

提前致谢

UPD 看起来像 ipcRenderer 中的问题:

export default function SettingsEditor() {
  const [state, setState] = React.useState({
    ipAddress: Settings.ipAddress,
  });

  useEffect(() => {
    electron.ipcRenderer.once('readSettings', (args) => {
      console.log('Filling settings');
      console.log(args); <------ HERE WE HAVE VALUE like 10.10.10.10
      setState({ ...state, ipAddress: args.ipAddress});
      console.log(state.ipAddress); <------ UNDEFINED
      state.ipAddress = args.ipAddress;
      console.log(state.ipAddress); <------ UNDEFINED
      Settings.ipAddress= args.ipAddress;
      console.log(Settings.gateIpAddress); <------ UNDEFINED
    });
    electron.settingsApi.read();
  }, []);

我该如何处理?

【问题讨论】:

  • 设置后不能直接使用更新状态。 stackoverflow.com/questions/66607037/…
  • 为什么静态字段也没有更新,为什么页面没有重新呈现?
  • 可能有很多原因。 FirstComponent 不能在 SecondComponent 之前运行。
  • 看来我找到了原因,我不明白 =) 我会更新问题
  • 谢谢你,@evolutionxbox

标签: javascript reactjs typescript electron


【解决方案1】:

原因是——我很笨=)

当我保存设置时,我是这样做的:

    const settings = new Settings();
    settings.ipAddress= state.ipAddress;
    console.log(JSON.stringify(settings));
    electron.settingsApi.save(settings);   <------ PASS OBJECT

但是当我返回响应时,它是:

ipcMain.on('readSettings', (event, _) => {
  storage.getAll((err: Error, data: object) => {
    if (err) {
      return;
    }
    const { appSettings } = data;
    const settings = new Settings();
    settings.ipAddress= appSettings.ipAddress;
    console.log('reading settings');
    console.log(JSON.stringify(settings));
    event.reply('readSettings', JSON.stringify(settings)); <-------- FACEPALM
  });
});

我能说什么 - 天才

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2022-06-18
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多