20241119

1116起来了,做了23年山东省考卷,69.7/100,才知道只有90道题,慢慢复盘吧。

昨晚上床后看了rust发现果然应该是这边的问题,得手动写些invoke相关的代码。另外了解了js的promise。

1211,结果这rust的问题还没解决,文档也看不懂,cargo是什么。

1228发现我连invoke greet都不行了,开个新项目重新试试。

发现了,网站invoke不行,但软件上invoke行,为什么啊,那不是console用不了吗。

在 Tauri 中,invoke 方法用于与 Rust 后端进行通信。在开发时,invoke 只能在应用的上下文中(即通过 Tauri 启动的桌面应用)有效工作,而不能在传统的 Web 环境中使用。这是因为 invoke 是 Tauri 的一个功能,它依赖于 Tauri 框架的本地后端来执行操作。

受不了啦,path.appLocalDataDir()果然能直接获得,不用写啥rust。先吃饭再看吧。

吃饭的时候在看沙雕动漫,都一个模子,穿越然后没能认出皇帝,但各有各的特色,听能看下去的。

1323找到问题啦,default.json 要允许 "fs:allow-applocaldata-write"。看到报错没权限就去看文档,然后github搜搜相关代码怎么写。奖励自己上床躺躺。刚还觉得没饱弄了几个牛筋丸,现在也不想吃了。

1350起来,床上好舒服啊,等下再上。

1444,每次处理数据都要loadFromJson才能成功,问了好像和React 状态有关,以为和ts和tsx后续有关,结果好像也不是,所以没有和React渲染有关的类内数据会自己刷新掉吗?得到的答案是否定呢。那为什么我一度能够获取到的数据在后面再次访问时会被重置呢?

2. 将 RecordManager 实例存储在应用级别

如果你希望在整个应用中都能共享 RecordManager 实例,你可以将它存储在 React 的 useState 中或者通过外部状态管理工具(如 Context API 或 Redux)来保持对实例的引用。这样,实例不会在每次渲染时被重置。

使用

const [recordManager] =useState(() =>newRecordManager()); // 只创建一次 RecordManager 实例

代替

const recordManager = new RecordManager();

成功了,不用每次load了,怎么会这样呢,react,我真搞不懂你。

在 React 中,useState 是用来持久化和管理组件的状态的。当你写 const recordManager = new RecordManager(); 时,每次组件重新渲染时都会重新创建一个新的 RecordManager 实例,这意味着你失去了之前的状态,因为 React 会重新执行组件函数。

useState(() => new RecordManager()) 这种写法会在组件的第一次渲染时创建 RecordManager 实例,并且保持这个实例直到组件卸载。这样,recordManager 就保持了同一个实例,不会在组件重新渲染时丢失数据。

这里的关键是 useState 的惰性初始化特性。useState 接受一个函数(即 () => new RecordManager()),这个函数会在组件首次渲染时执行,并且返回的值会作为该 state 的初始值。因为 React 会记住 useState 返回的状态,即使组件重新渲染,也会重用 recordManager 实例,而不会重新创建它。

为什么这样能避免每次 load

  • 当你在 useState 中创建 recordManager 时,React 会在首次渲染时创建并初始化它,在后续的渲染中不会重新创建。
  • useState 保证了 recordManager 实例的持久性,这意味着你在调用 loadFromJson() 后,数据会保存在实例中,而不会每次渲染时丢失。
  • 每次渲染时 React 会保留 recordManager 的状态,即使组件被重新渲染,recordManager 仍然是同一个实例,数据也得以保存。

总结

  • 使用 useState 时,React 保证了在组件生命周期内,状态是持久的,并且不会丢失。
  • useState(() => new RecordManager()) 通过惰性初始化确保 RecordManager 只会被创建一次,并且在每次渲染时都使用同一个实例。

React 的这种行为可以看作是它对组件状态管理的一种优化,确保我们不必每次都手动管理对象的生命周期。通过理解 React 的渲染机制,你就能更好地控制数据的持久性和状态更新。

解决了就是好事,1453,再去躺躺吧。

1529起来,床上好舒服,来创git仓库了,得记录,看不到之前的代码有时很痛苦。

1539提交了,每次都记不得命令。

.gitignore 文件存在之前,某些文件(如大文件、临时文件或敏感信息)可能被错误地添加到 Git 仓库中。如果这些文件已经被提交,即使后来添加了 .gitignore,也无法直接忽略这些文件。

1617,在调UI,唉UI。手累了,躺躺。

1636起来了,写写代码等等吃饭了,唉也不敢躺太久。

key可以重复,感觉和最开始想的有区别,但也行,这样就这样。算了,还是别能重复,不然之前添加也要改。

门口有老太敲门,问了又不讲来干嘛的,直接不理了。

1718写完update,UIbug以后再看。吃饭喵。

1756吃完晚饭,看行测吧,早晨做的卷子现在还没看完。言语是真不理解答案啊。

1818复盘完了,好抽象。没心情看,判断都不是很能接受答案,以后可能要再复盘。

UI抖来抖去找不到原因,今晚怎么度过呢。npm run tauri build会因为网络原因失败,唉,墙。

发现是 .record-details-modal {position: fixed;的问题,但是为什么呢。好吧其实是它父组件css的问题。

因为父组件上按钮的效果,子组件也会放大缩小,然后UI移位。

1
2
3
4
5
.record-item:hover {
    transform: scale(1.02);
    /* 鼠标悬浮放大效果 */
    box-shadow: 04px8pxrgba(0, 0, 0, 0.1);
}

直接删掉动效了,懒得管原理了,不知道为什么打开子组件后父组件还能有hover效果。

边看别人打屎不拉通就边在想,update与其判断key有没有更改,不如直接把原数组原位置删掉,在最后面添加新的。就得是这个功能吧,后添加的显示在前。

2002了,随便锻炼锻炼洗澡上床吧。明天看看tauri客户端怎么一直置顶。

2100运动完,2109洗好澡,等下晒衣服,今天就这样吧,上床吧,想想明天。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计