Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Electron项目总结 #23

Open
SunXinFei opened this issue Aug 28, 2019 · 13 comments
Open

Electron项目总结 #23

SunXinFei opened this issue Aug 28, 2019 · 13 comments

Comments

@SunXinFei
Copy link
Owner

SunXinFei commented Aug 28, 2019

技术栈 electron + react + sqlite + immutable + redux

npm包功能总结

  • 获取文件大小字符串转换: https://github.com/avoidwork/filesize.js
  • 重命名文件 https://github.com/sindresorhus/move-file
  • 剪切/复制/删除文件以及判断路径是否存在 https://github.com/jprichardson/node-fs-extra
  • 文件放置回收站 https://github.com/sindresorhus/trash
  • 递归获取某路径内的所有文件(包括所有文件夹内的文件)列表 https://github.com/daaku/nodejs-walker
  • 获取某路径内的文件结构树 https://github.com/mihneadb/node-directory-tree (v2.2.4不支持depth) 和 https://github.com/MisaZ10/tree
  • Electron 精彩插件与项目 https://github.com/sindresorhus/awesome-electron#boilerplates
  • "pdf.js": https://github.com/mozilla/pdf.js //PDF读取器
  • "viewer.js": https://github.com/fengyuanchen/viewerjs //JavaScript图像查看器
  • "typejs": http://www.typejs.org/ //排版工具,可提供更好的网页类型。 Type.js允许您编写新的CSS属性以对Web上的字体样式进行更好的排版控制。
  • "sweetalert2": https://sweetalert2.github.io/ //美观的alert框,模态框
  • "colorpicker": https://www.eyecon.ro/colorpicker/ //颜色选择器
  • "videojs": https://videojs.com/ //开源HTML5和Flash视频播放器
  • "apng-canvas.js": https://github.com/davidmz/apng-canvas //在canvas中执行apng
  • "bignumber.js": https://github.com/MikeMcl/bignumber.js //数字精度运算库,一个用于任意精度十进制和非十进制算术的JavaScript库
  • "html2canvas.js" //html转canvas
  • "is.js" : https://github.com/arasatasaygin/is.js //功能强大的校验js,检查类型,正则表达式,状态,时间等
  • "PhotoSwipe.js": https://github.com/dimsemenov/PhotoSwipe //适用于移动和台式机,模块化,框架独立的JavaScript图片库
  • "mousetrap.js": https://github.com/ccampbell/mousetrap //用于处理键盘快捷键的简单库
  • "selectize.js": https://github.com/selectize/selectize.js/ //文本框和<select>框的混合体。它基于jQuery,具有自动完成功能和本机感觉的键盘导航;用于标记,联系人列表等 //// 使用react-select
  • "pinyin": https://github.com/creeperyang/pinyin //轻量的 汉字转拼音 JavaScript库。可以轻松获取汉字的拼音
  • "wavesurfer.js": https://github.com/katspaugh/wavesurfer.js //基于Web Audio和Canvas构建的可导航波形
  • "electron-notarize": "^0.1.1",//无缝公证您的Electron应用程序
  • "fontmin": "^0.9.7-beta", //无缝缩小字体
  • "forcefocus": "^1.0.0",//该模块规避了SetFocus()中的限制,并允许任何窗口窃取焦点。 它在其他平台上重用了Electron内置的焦点。
  • "images": "^3.0.1",//Node.js轻量级跨平台图像编解码库
  • "json-rest-light": "^2.0.2",//轻量级,纯Node.js,不依赖Json REST服务器,使用HTTP服务器
  • "md5": "^2.2.1",//一个JavaScript函数,用于使用MD5对消息进行哈希处理。
  • "mozjpeg": "^6.0.1",//mozjpeg是一种生产质量的JPEG编码器,可在保持与大多数已部署解码器兼容的同时提高压缩率
  • "opentype.js": "^0.11.0",//opentype.js是用于TrueType和OpenType字体的JavaScript解析器和编写器。 它使您可以从浏览器或Node.js访问文本的字母形式。
  • "sudo-prompt": "^8.2.5",//使用sudo运行非图形终端命令,并在必要时通过图形OS对话框提示用户。对于需要Node.js的后台Node.js应用程序或本机Electron应用程序很有用。
  • "windows-foreground-love": "^0.2.0",//AllowSetForegroundWindow的API包装器,使指定的进程能够使用SetForegroundWindow函数设置前景窗口
  • "winreg": "1.2.4",//node模块,可通过REG命令行工具访问Windows注册表
  • "electron": "^2.0.12",
  • "electron-packager": "^8.5.1",//electorn打包程序
  • "electron-rebuild": "^1.7.3",//将根据您的Electron项目使用的Node.js版本重建本机Node.js模块
  • "adm-zip": "^0.4.11",//nodejs的zip的Javascript实现。允许用户在内存或磁盘中创建或提取zip文件
  • "app-root-path": "^2.0.1",//确定项目的根路径
  • "archiver": "^2.1.1", //用于存档生成的流接口 //用于压缩包相关
  • "async": "^2.4.1", //一个实用程序模块,它提供直接,强大的功能来处理异步JavaScript
  • "auto-launch": "^5.0.5", //登录时自动启动您的应用程序 //开机启动
  • "auto-updater": "^1.0.2", //Node.js自动更新插件。 将本地package.json与存储库package.json进行比较,如果版本不匹配,则下载最新的zip并将其解压缩。
  • "bagpipe": "^0.3.5", //灵活地限制异步处理方法的并发量
  • "better-sqlite3": "^4.1.4", //Node.js中最快,最简单的SQLite3库
  • "buffer-equal": "^1.0.0", //返回两个缓冲区是否相等
  • "cancellation": "^1.0.0", //一种使异步操作可取消的方法
  • "check-disk-space": "^1.5.0", //多平台库可从路径检查磁盘空间
  • "chinese_convert": "^1.0.8", //簡繁體轉換
  • "color-convert": "^1.9.0", //JavaScript中的纯色转换功能
  • "compare-versions": "^3.0.1", //比较版本号大小 // 10.0.0.1 < 10.0.0.2
  • "deep-assign": "^2.0.0", //类似于lodash.merge
  • "delta-e": "0.0.7", //将数字用于感知的颜色差异
  • "electron-edge-js": "^8.3.6",//在Windows,MacOS和Linux上在线运行.NET和Node.js代码
  • "electron-log": "^2.2.7", //只是适用于您的Electron应用程序的简单日志记录模块
  • "electron-osx-sign": "^0.4.10",//Codesign Electron macOS应用程序
  • "electron-referer": "^0.3.0",//electron应用程序的引荐控件。 //不懂
  • "electron-settings": "^2.2.2", //Electron的简单持久用户设置框架
  • "electron-util": "^0.6.0", //electron程序和模块的有用实用程序
  • "electron-window-state": "^4.0.2",//一个库,用于存储和还原Electron应用程序的窗口大小和位置
  • "extract-zip": "^1.6.7",//解压缩zip
  • "fast-glob": "^2.2.2",//该软件包提供了遍历文件系统的方法,并根据Unix Bash shell使用的规则返回了与指定模式的定义集匹配的路径名,并进行了一些简化,同时以任意顺序返回结果。快速,简单,有效。
  • "ffi": "^2.2.0",//Node.js外部函数接口
  • "file-type": "^3.9.0",//检测Buffer / Uint8Array / ArrayBuffer的文件类型
  • //"fluent-ffmpeg": "^2.1.2",//一个流畅的api针对ffmpeg,用于记录,转换和流传输音频和视频。
  • "fs-extra": "^1.0.0",//fs对象的额外方法,例如copy(),remove(),mkdirs()
  • "get-folder-size": "^1.0.0",//通过递归遍历其所有子文件夹(文件&&文件夹)来获取文件夹的大小。
  • "get-json": "0.0.3",//在Node和浏览器上获取请求的JSON文档
  • "graceful-fs": "^4.1.11",//graceful -fs可以替代fs模块,从而进行了各种改进。 这些改进旨在使不同平台和环境之间的行为规范化,并使文件系统访问更能抵抗错误。
  • "image-size": "^0.5.1",//一个Node模块,用于获取任何图像文件的尺寸
  • "isnumber": "^1.0.0",//判断是否为数字
  • "jpeg-js": "^0.2.0",//用于node.js的纯JavaScript JPEG编码器和解码器
  • "mime": "^2.3.1",//全面,紧凑的MIME类型模块
  • "mksnapshot": "^0.3.1",//为Electron创建快照文件
  • "moment": "^2.22.2",//时间
  • "node-huaban": "^1.4.0",//花瓣(http://huaban.com) 画板下载器
  • "node-iptc": "^1.0.4",//该模块从JPEG文件中提取IPTC信息。 IPTC是关于图像的(主要是非技术性的)结构化元数据,具有创建者/艺术家,版权,关键字,类别等字段。 有关更多信息
  • "node-machine-id": "^1.1.9",//唯一的计算机(桌面)ID(无需管理员权限
  • "node-watch": "^0.4.1",//fs.watch的包装和增强功能。监听文件的增删改重命名等
  • "nodejieba": "^2.2.5",//中文分词的Node.js版本
  • "nodobjc": "^2.1.0",//Node.js => Objective-C桥
  • "normalize-strings": "^1.1.0", //用utf-8字符规范化字符串
  • "nsfw": "^1.0.16",//超级快速且可扩展的文件监视程序,可在Linux,OSX和Windows上提供一致的界面
  • "omggif": "^1.0.8",//GIF 89a编码器和解码器的JavaScript实现
  • "os-locale": "^2.1.0",//获取系统区域设置
  • "pngparse": "^2.0.1",//pngparse是Node.JS的纯JavaScript库,用于将PNG文件转换为像素值数组
  • "pngquant": "^1.3.0",//pngquant是一个命令行实用工具,是用于PNG图像有损压缩的库。
  • "pngquant-bin": "^4.0.0",//pngquant bin-wrapper,使其可以作为本地依赖项无缝使用http://pngquant.org
  • "probe-image-size": "^3.0.0",//无需完全下载即可获取图像大小。支持的图像类型:JPG,GIF,PNG,WebP,BMP,TIFF,SVG,PSD。
  • "promise.ify": "^0.3.0",//ES5中使用promise
  • "pupa": "^1.0.0",//当您需要填写一些占位符时很有用。
  • "read-chunk": "^2.0.0",//读取某文件的某一个位置的信息
  • "read-multiple-files": "^1.1.1",//读取多个文件
  • "ref": "^1.3.5",//获取地址的指针
  • "request": "^2.87.0",//简化的HTTP请求客户端
  • "request-progress": "^3.0.0",//踪随请求发出的请求的下载进度,从而洞察各种指标,包括进度百分比,下载速度和剩余时间
  • "sanitize-filename": "^1.6.1",//清理字符串以用作文件名
  • "sharp": "^0.20.5",//高性能Node.js图像处理,是调整JPEG,PNG,WebP和TIFF图像大小的最快模块
  • "sips": "^1.0.3",//这是Mac OS X附带的sips命令的简单包装,用于查询和修改图像。 sips命令具有四种模式(图像查询,配置文件查询,图像修改,配置文件修改),在该模块中它们分为4个单独的类
  • "stopword": "^0.1.9",//停用词是节点和浏览器的模块,允许您从输入文本中删除停用词。在自然语言处理中,“停止词”是经常使用的词,可以安全地从文本中删除它们而不会改变其含义。
  • "stream-to-buffer": "^0.1.0",//该存储库已弃用。请改用stream-to。 将可读流的数据连接到单个Buffer实例中
  • "sumchecker": "^2.0.2",//Sumchecker是用于验证校验和文件中指定的文件的纯Node.js解决方案,该文件通常由诸如sha256sum之类的程序生成
  • "systeminformation": "^3.49.2",//Node.JS的系统信息库
  • "unused-filename": "^0.1.0",//通过添加数字来获取未使用的文件名(如果存在)
  • "watch": "^1.0.2",//在node.js中监视文件树的实用程序
  • "write-file-atomic": "^2.3.0"//这是节点fs.writeFile的扩展,使它的操作原子化,并允许您设置所有权(文件的uid / gid)
@SunXinFei SunXinFei changed the title ## Electorn文件管理项目总结 Electron文件管理项目总结 Aug 28, 2019
@SunXinFei
Copy link
Owner Author

SunXinFei commented Aug 28, 2019

Electron调试Redux

我们使用electron-devtools-installer 这个插件,

electron.app.on('ready', () => {

  installExtension(installExtension.VUEJS_DEVTOOLS)
    .then(() => {})
    .catch(err => {
      console.log('Unable to install `vue-devtools`: \n', err)
    })
    //添加Redux_DevTools
  installExtension(installExtension.REDUX_DEVTOOLS)
    .then(() => {})
    .catch(err => {
      console.log('Unable to install `redux-devtools`: \n', err)
    })
})

其中store的js文件中我们需要配置添加composeWithDevTools

import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import FileManageStore from './test/reducer';
import { combineReducers } from 'redux-immutable';
import thunk from 'redux-thunk';
import Immutable from 'immutable';

let store = createStore(
	combineReducers({ FileManageStore }),
	Immutable.Map({}),
	composeWithDevTools(applyMiddleware(thunk))
);
export default store;

即可见Redux插件变化
image

参考:electron-devtools-installer

@SunXinFei
Copy link
Owner Author

SunXinFei commented Aug 29, 2019

将immutable.js引入到项目中的改造

将immutable.js引入到项目中的改造

Redux的本地持久化存储与获取

Redux的本地持久化存储与获取

@SunXinFei
Copy link
Owner Author

stat属性

stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};

@SunXinFei
Copy link
Owner Author

SunXinFei commented Aug 30, 2019

双击和单击事件绑定到同一个DOM上冲突

解决方案类似js截流,200ms之内如果双击则cleartimeOut

  let timer = 0;
  let delay = 200;
  let prevent = false;

  doClickAction() {
    console.log(' click');
  }
  doDoubleClickAction() {
    console.log('Double Click')
  }
  handleClick() {
    let me = this;
    timer = setTimeout(function() {
      if (!prevent) {
        me.doClickAction();
      }
      prevent = false;
    }, delay);
  }
  handleDoubleClick(){
    clearTimeout(timer);
    prevent = true;
    this.doDoubleClickAction();
  }
 < button onClick={this.handleClick.bind(this)} 
    onDoubleClick = {this.handleDoubleClick.bind(this)} > click me </button>

参考:
onClick works but onDoubleClick is ignored on React component
https://stackoverflow.com/questions/25777826/onclick-works-but-ondoubleclick-is-ignored-on-react-component

e.target和e.currentTarget区别

e.target : 触发事件的元素,谁触发就是谁,用来区分事件委托和冒泡
e.currentTarget :绑定事件的元素,不管是不是触发的对象中子元素,依旧是绑定的元素,用来直接获取父元素的一些状态

space-between 实现节点左靠布局

使用空元素填充,来实现
image

chrome浏览器属性-webkit-box-orient 和 css-loader

为了防止css-loader编译这个属性,需要这么写

/* autoprefixer: off */
-webkit-box-orient: vertical;
 /* autoprefixer: on */

babel编译装饰器

babel 6.x
npm install babel-plugin-transform-decorators-legacy
.babelrc中"plugins"添加"transform-decorators-legacy"
如果是babel 7.x+
npm install @babel/plugin-proposal-decorators --save-dev

{
“plugins”: [
    ["@babel/plugin-proposal-decorators", { “legacy”: true }]
 ]
}

border显示与隐藏切换不影响元素宽高

实现方式有三种:

  1. box-shadow: 0 0 0px 1px rgb(42, 96, 228);
  2. outline,但是圆角只有火狐浏览器支持
  3. 初始border透明,切换颜色

@SunXinFei
Copy link
Owner Author

SunXinFei commented Sep 2, 2019

Redux中的action异步操作

问题:我们在实际的组件拆分中,我们经常会遇到相同的一些业务逻辑,比如aaa触发了,都需要发送ajax请求,我们这里是文件路径保存给redux之前都需要判断路径是否存在,而且判断路径是一个异步操作。在这里我们介绍下Redux-thunk。
Redux-thunk是一个Redux是中间件,如下入所示,他位于 Action与 Strore中间,简单的说,他就是对store.dispatch进行了一次升级,他通过改造store.dispatch,可以使得store.dispatch可以接受函数作为参数。
image
actions.js代码前后变化:

//旧的代码
// 选择文件夹路径在边栏
export const setFolderPathActiveInSider = (data) => {
	return {
		type: actionType.SETFOLDERPATHACTIVEINSIDER,
		data
	};
}
//新的代码
// 选择文件夹路径在边栏
export const setFolderPathActiveInSider = (data) => {
	return {
		type: actionType.SETFOLDERPATHACTIVEINSIDER,
		data
	};
}

// 选择文件夹路径在边栏
export const setFolderPathActiveInSiderAsync = (data) => {
	return async (dispatch) => {
		const exists = await fsExtra.pathExists(data);
		if (!exists) {
			message.error('路径未找到;该路径已被删除或移动');
			return false;
		}
		dispatch(setFolderPathActiveInSider(data));
		return true;
	}
}

所以在新的代码中,我们利用dispatch来人为的控制Redux中的action的触发,dispatch我们可以写在异步或者回调函数之中都可以,这样我们就可以利用action做一些统一的处理比如ajax请求等等

参考:
Redux-thunk https://www.jianshu.com/p/159919acb4d0
redux-thunk - redux的中间件 https://www.jianshu.com/p/b1a039feac26
Redux中间件之redux-thunk使用详解 https://www.jianshu.com/p/a27ab19d3657

@SunXinFei
Copy link
Owner Author

SunXinFei commented Sep 2, 2019

项目目录引用与别名

webpack中的别名配置

resolve: {
    alias: {
      '@filemanage': path.join(__dirname, '../src/renderer/views/filemanage2')
    },
    extensions: ['.js', '.jsx', '.vue', '.json', '.css', '.node']
  },

//js中的文件路径以及图片路径

import { setFolderPathActiveInSiderAsync } from '@filemanage/store/action';
const CardImage = ({ type, extension }) => {
  let imgSrc = require(`@filemanage/assets/icon_file/file.png`);

  return (
    <img src={imgSrc} alt="File-icon" />
  )
}

//less中的文件路径

@import "~@filemanage/style/variables.less";
.filemanage-content-option{
  padding: 2px 10px;
  width: 100%;
  height: @filemanageContentOptionHeight;
  border-bottom: 1px solid #e8e8e8;
}

@SunXinFei
Copy link
Owner Author

SunXinFei commented Sep 3, 2019

React中的Loading组件

参考:
从 loading 的 9 种写法谈 React 业务开发 https://www.yuque.com/es2049/blog/xel32z
React Hooks 深入不浅出 https://www.yuque.com/es2049/blog/durwgr

react中实现类似vue中的scoped

这里使用css-loader的配置,就可以实现scoped的效果,会将className进行hash处理,相当于vue语法中的scoped;如果不想hash处理就是global化,相当于vue中去掉scoped

参考:
CSS Modules 用法教程 http://www.ruanyifeng.com/blog/2016/06/css_modules.html

React中Mixin的有害性

参考:Mixins Considered Harmful

@SunXinFei
Copy link
Owner Author

SunXinFei commented Sep 5, 2019

使用asar命令行解压asar文件 --用来解读app文件

  1. 运行命令npm install asar -g,全局安装asar;
  2. 从应用程序列表中右击目标app,然后选择显示包内容;
  3. 在Resources目录下,运行命令asar e app.asar app,表示将asar文件解压到app的文件夹中

@SunXinFei
Copy link
Owner Author

SunXinFei commented Nov 4, 2019

Electorn中使用better-sqlite3报错

错误信息如下:

 The module '/node_modules/better-sqlite3/build/better_sqlite3.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 57. This version of Node.js requires
NODE_MODULE_VERSION 64. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).

解决方法:

  1. npm install --save-dev electron-rebuild
  2. 使用electron-rebuild进行重新编译
    node_modules/.bin/electron-rebuild -f -w better-sqlite3
    参考:Help me use Electron! WiseLibs/better-sqlite3#126

sqlite3

在开发时,会生成.db文件,为了方便我们查看数据,我们使用sqlitebrowser来可视化查看。

@SunXinFei
Copy link
Owner Author

SunXinFei commented Nov 20, 2019

Electron中获取文件路径

在Electron中常用到操作用户的本地路径

(electron.app || electron.remote.app).getPath('home'); // 获取用户根目录
(electron.app || electron.remote.app).getPath('userData'); // 用于存储 app 用户数据目录
(electron.app || electron.remote.app).getPath('appData'); // 用于存储 app 数据的目录,升级会被福噶
(electron.app || electron.remote.app).getPath('desktop'); // 桌面目录
(electron.app || electron.remote.app).getAppPath();//当前应用程序所在目录

在 main process 中通过 electron.app 调用,在renderer process中,通过 remote 模块调用。
参考:

https://electronjs.org/docs/api/app
whxaxes/blog#8

Node中的路径处理

path.join()该方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径(只是拼接各个path片段)
path.resolve()该方法会把一个路径或路径片段的序列解析为一个绝对路径。(除了拼接各个字段还拼接了工作目录的路径)
如果想获取某路径的上一层路径,则使用../进行拼接

__dirname 表示当前执行代码的文件所在的目录的绝对路径
__filename 表示当前执行代码的文件的绝对路径
module.filename ==== __filename 等价
process.cwd() 返回运行当前脚本的工作目录的路径

@SunXinFei
Copy link
Owner Author

SunXinFei commented Nov 20, 2019

通过require.context使Reducer模块自动加载

目录结构如下
image

import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import { combineReducers } from 'redux-immutable';
import thunk from 'redux-thunk';
import Immutable from 'immutable';

const modules = {}
const context = require.context('./reducers', false, /\.js$/) // carrega reducers de todos os componentes

context.keys().forEach((filename) => {
    const key = filename.replace(/(\.\/|\.js)/g, '')
    const ctx = context(filename)
		
    if (ctx.default) {
        modules[key] = ctx.default
    }
})

let store = createStore(
	combineReducers(modules),
	Immutable.Map({}),
	composeWithDevTools(applyMiddleware(thunk))
);
window.$store = store;

export default store;

image
image
以上代码是redux中自动加载reducer,在vuex中同样适用
参考:

https://github.com/agalwood/Motrix/blob/master/src/renderer/store/modules/index.js

@SunXinFei
Copy link
Owner Author

Electron平台判断

  • win系统: win或者win32,即--platform=win或者--platform=win32
  • mac系统:mac或者darwin,即--platform=mac或者--platform=darwin
  • Linux系统:linux, 即--platform=linux
  • 所有平台:all, 即--platform=all

@SunXinFei
Copy link
Owner Author

SunXinFei commented Jan 13, 2020

React 16.3以上版本 parent父组件获取循环loop中children子组件的dom结构

需求背景:文件管理页面常见的框选需要在容器层面给body绑定mouse事件,同时获取文件card的位置来判断是否在框选范围内。

//渲染子组件Card
getCardList(files) {
    let cardList = []
    this.cardObjList = []
    files.map((file, index) => {
      cardList.push(
        <Card getRef={elm => (  this.cardObjList.push(elm.getBoundingClientRect())  )} key={index} index={index} file={file} />
      )
    })
    return cardList
  }
//父组件
render() {
    const { isContentLoading, isShowContextMenu, files } = this.props;
    const { selectEle } = this.state;
    return (
      <div onClick={this.cancelSelectCard}
        onMouseDown={this.down}
        onMouseMove={this.move}
        onMouseUp={this.up}>
        {
          this.getCardList(files)
        }
      </div>
    );
  }
//卡片子组件
render() {
    const { index, file, connectDragSource } = this.props;
return ( 
<div
          ref={elm => {
            connectDragSource(elm)
            if (!elm) return;
            this.props.getRef(elm);
          }} 
          className={isSelectCard ? "filemanage-content-main-card selected" : "filemanage-content-main-card"}
          key={index}
          style={{ width: '110px' }}
          onClick={(e) => { this.handleClick(e) }}
          onDoubleClick={(e) => { this.handleDoubleClick(e, type, path, name, extension) }}>
          <div className="card-prew">
            <CardImage type={type} extension={extension}></CardImage>
          </div>
          <div className="card-filename">
            {name}
          </div>
        </div>
    );
  }

核心代码为子组件中调用父组件的getRef方法并把当前dom传入进去;

ref={elm => {
            connectDragSource(elm)
            if (!elm) return;
            this.props.getRef(elm);
          }}

父组件中列表清空以及getRef的回调push

this.cardObjList = [] //渲染之前列表清空
   files.map((file, index) => {
     cardList.push(
       <Card getRef={elm => (  this.cardObjList.push(elm.getBoundingClientRect())  )} key={index} index={index} file={file} />
)

@SunXinFei SunXinFei changed the title Electron文件管理项目总结 Electron项目总结 Aug 12, 2020
@SunXinFei SunXinFei removed the ECMA6 label Aug 18, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant