【问题标题】:How to display data read from a file using Electron and React?如何使用 Electron 和 React 显示从文件中读取的数据?
【发布时间】:2019-05-31 01:01:01
【问题描述】:

我的目标只是显示来自我的 Electron 应用程序本地存储的文件中的数据(使用 React)。我在实际读取和处理数据方面已经完成了一半,我只是不知道如何显示它

这是我的文件读取内容:

export function read() {
  let values = [];

  fs.readFile(
    path.resolve(__dirname, './files/test.txt'),
    'utf-8',
    (err, data) => {
      if (err) throw err;
      values = data.toString().split('\n');

      const listItems = values.map(val => <p>{val}</p>);
      return listItems;
    }
  );
}

这可以正常工作,并且我已经在控制台记录了所有正确的值。

让我感到困惑的部分是我想展示它的时候。这是我的反应组件:

// @flow
import React, { Component } from 'react';
import styles from './ReadFile.css';
import { read } from '../actions/fileread';

type Props = {};

export default class ReadFile extends Component<Props> {
  props: Props;

  render() {
    const result = read();

    return (
      <div className={styles.container} data-tid="container">
        <p>Read from File</p>
        {result}
      </div>
    );
  }
}

我希望这样做是调用read 函数,将其存储在result 中,然后使用{result} 打印结果。相反,它什么也不显示。它也没有给出任何错误。

我感觉这与 react 前端和读取文件的 node.js“后端”之间的一些奇怪的服务器/客户端关系有关。我不确定如何在这两个组件之间创建一个简单的接口来让它们工作。

【问题讨论】:

  • 无论服务器/客户端之间的通信如何,您的读取函数实际上都不会返回任何内容。该代码是异步的,因此您需要返回一个 Promise 或将回调传递给 read。此外,不能从 render() 中调用此异步代码,但您需要使用诸如 componentDidMount 之类的东西,使用 setState 将其存储在状态中,然后在渲染中读取状态。

标签: node.js reactjs electron


【解决方案1】:

正如我在评论中提到的,您的代码是异步的,您的 read() 方法没有返回任何内容。你应该有一些接近这个的东西:

export default class ReadFile extends Component<Props> {
  props: Props;
  constructor(props) {
    super(props);
    this.state = {};
  }
  componentDidMount() {
    read((result) => {
      this.setState({
        result,
      });
    });
  }

  render() {
    return (
      <div className={styles.container} data-tid="container">
        <p>Read from File</p>
        {this.state.result}
      </div>
    );
  }
}

对于 read() 这个:

export function read(callback) {
  let values = [];

  fs.readFile(
    path.resolve(__dirname, './files/test.txt'),
    'utf-8',
    (err, data) => {
      if (err) throw err;
      values = data.toString().split('\n');

      const listItems = values.map(val => <p>{val}</p>);
      return callback(listItems);
    }
  );
}

【讨论】:

  • 试过这个确切的代码,我现在得到一个错误,上面写着Uncaught TypeError: Cannot read property 'result' of null
  • 你需要在构造函数中初始化状态。我更新了答案。
猜你喜欢
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多