javascript - 将 Javascript 中的 React.js 元素数组存储到某个文件或任何存储中,以便以后使用
问题描述
注意:我不能使用 Node FS 模块,因为我对 npm 和 fs 不太了解。
我正在创建一个小型虚拟游戏,用户可以单击一个按钮在屏幕上获得一个“鸭子”,但这只是一个<img>
,但所有这些都是在 React.js 中完成的。我有一个数组duckMem
,用于存储 React 通过createElement
调用创建的元素。代码如下所示:
var duckMem = [];
var e = React.createElement('img',{src:'src'},null};
duckMem.push(e);
ReactDom.render(...);
我现在想保存游戏的状态,即当前屏幕上的鸭子。当用户关闭并打开本地 HTML文件时,所有的鸭子都应该在那里。
我尝试了什么:
saveByteArray(duckMem, "duck.txt");
var saveByteArray = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, name) {
var blob = new Blob(data, {type:"application/octet-stream" /*"octet/stream"*/}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = name;
a.click();
window.URL.revokeObjectURL(url);
};
}());
和
这里有一个示例,我对其进行了一些修改以在窗口关闭事件时下载 txt 文件。
到目前为止我取得了什么成就:
我能够获得包含以下内容的文件:
[object Object], [object Object], [object Object]
这是一个对应于 的对象数组duckMem
。
typeof React.createElement
也评估为Object
。
我想做什么:
我使用了一个文本文件,所以我可以很容易地看到文件中的数据(如果它是随机或非 ASCII 字符,那么数据已经成功写入,我认为)否则可以使用任何文件扩展名。
我会创建一个包含二进制数据的文件,当用户打开 HTML 文件时,读取该二进制数据并渲染所有鸭子以恢复保存的状态。
解决方案
我不确定您是否以正确的方式进行此操作。的输出React.createElement()
是否实际上是可序列化的(也可以表示为字符串)目前我还不清楚。
但有一点是肯定的:如果是你要保存的状态,就src
在文件中写入实际的属性。duck.txt
只会列出鸭子的 URL。这有一些优点:对于初学者来说,它使该文件更易于维护。而且,这个 URL 列表可以成为一个状态条目,强制组件在它(列表)更改时重新呈现。
当你需要恢复状态时
// Read the URLs from the file.
// We expect ducks to be an array of strings.
// We will pass this array to the React Component that renders the ducks.
const ducks = readFromFile("duck.txt");
// Function that renders the ducks.
// It receives a list of ducks URLs as props
function DucksRenderer(ducksURLArray) {
return (
<div className="ducks-container">
{
ducks.map(duckURL => <img src={duckURL}/>)
}
</div>
);
}
注意:您似乎是在浏览器中执行此操作,保存此数据的更好方法是使用LocalStorage。
// To write the list of ducks urls
localStorage.setItem('ducksURLs', JSON.stringify(ducks));
// To read the list
const ducksURLs = JSON.parse(localStorage.getItem('ducksURLs'));
推荐阅读
- javascript - setTimeout 奇怪的结果
- python-3.x - ImportError:没有名为 twilio.rest 的模块错误
- java - 我可以访问“类”对象的静态变量吗?
- java - 处理 AsyncTask 警告类应该是静态的,否则可能会发生泄漏
- java - 在 Springboot 应用程序上添加额外的服务器调用导致 CORS 出现问题
- java - Java/Quarkus Kafka 流式读取/写入基于条件的同一主题
- javascript - 所有浏览器 XHR 请求的 Javascript 侦听器以匹配 url
- node.js - 尝试获取每个类别的帖子列表
- python - 在两个不同列上有两个条件的数据框
- c++ - MFC 丢失 Unicode 文本