reactjs React -将组件可视化保存为JSON并读回

m3eecexj  于 2023-01-30  发布在  React
关注(0)|答案(2)|浏览(187)

假设我有一个React组件的层次结构,例如一天的膳食

|------- breakfast --------|
|  Meal1_image.png banana  |
|  Meal2_image.png porridge|

|------- lunch-------------|
|  Meal3_image.png toast   |
|  Meal4_image.png apple   |

我可以将餐食添加到餐食组(例如,添加到午餐组),我可以添加更多午餐组(例如,午餐)等等。这是一个可变的组件列表,我给予用户能够使用“+”按钮添加餐食和餐食组,或者删除它们等等。
我该如何把这些保存在一个文本json中并读回它们呢?我读过关于“序列化react组件”的文章,但也许我不需要所有这些东西,我只需要保存一个json,就像

{
   "breakfast": {
      {"food": "banana", "image": "Meal1_image.png"},
      {"food": "porridge", "image": "Meal2_image.png"},
   },
   "lunch" : ... and so on ...
}

有什么简单的方法可以实现这一点,或者我应该只使用https://github.com/zasource-dev/React-Serialize之类的组件序列化?

l2osamch

l2osamch1#

如果你指的是物理保存在一个文件中,那么你需要有node js来访问你的手机或PC的文件系统,你的服务器:

// file system module to perform file operations
    const fs = require('fs');
     
    // json data
    var jsonData = '{"persons":[{"name":"John","city":"New York"},{"name":"Phil","city":"Ohio"}]}';
     
    // parse json
    var jsonObj = JSON.parse(jsonData);
    console.log(jsonObj);
     
    // stringify JSON Object
    var jsonContent = JSON.stringify(jsonObj);
    console.log(jsonContent);
     
    fs.writeFile("output.json", jsonContent, 'utf8', function (err) {
        if (err) {
            console.log("An error occured while writing JSON Object to File.");
            return console.log(err);
        }
        console.log("JSON file has been saved.");
    });

如果我们讨论的是axios请求的转换,那么您需要使用下面的javascript方法JSON.stringify()进行json转换,JSON.parse()进行阅读到javascript中的转换。
如果只想在挂钩状态下变换对象,也可以这样做。

zz2j4svz

zz2j4svz2#

问题基本上太宽泛了,但无论如何,只要把你的任务分成子任务就行了。
1.设计你将要使用的数据模型。创建一个原型,试着按原样呈现它。关于你的原型--那不是有效的js对象,所以我在我的例子中稍微改变了一下。注意--对于.map方法,你需要使用唯一的keys
1.找出保存数据的最佳位置(状态)。您可以将其存储在某个组件中,也可以将其存储在context中,然后向其添加所有需要的方法,并将其传递给您的组件。为了简化示例,我在组件中做了所有事情。
1.添加下载/上传/解析函数,并将一切连接起来。
如果我没猜错的话-您希望每个客户端都能够下载和上传数据到客户端上的本地JSON文件,这样就没有服务器交互了。

const { useState } = React;

function download(content, mimeType, filename) {
  const a = document.createElement("a");
  const blob = new Blob([content], { type: mimeType });
  const url = URL.createObjectURL(blob);
  a.setAttribute("href", url);
  a.setAttribute("download", filename);
  a.click();
}

function upload(event, callback) {
  const input = event.target;

  const reader = new FileReader();
  reader.onload = function () {
    const text = reader.result;
    callback(text);
  };
  reader.readAsText(input.files[0]);
}

const DEFAULT_DATA = {
  breakfast: [
    { food: "banana", image: "Meal1_image.png" },
    { food: "porridge", image: "Meal2_image.png" }
  ],
  lunch: [{ food: "banana", image: "Meal1_image.png" }]
};

function App() {
  const [data, setData] = useState(DEFAULT_DATA);

  const onDownloadClick = (e) => {
    download(JSON.stringify(data), "application/json", "file1.json");
  };

  const onUpload = (e) => {
    upload(e, (text) => setData(JSON.parse(text)));
  };

  return (
    <div className="App">
      {Object.entries(data).map(([section, items]) => (
        <div key={section}>
          <p>{section}</p>
          <ul>
            {items.map((item) => (
              <li key={item.food}>
                <p>{item.food}</p>
              </li>
            ))}
          </ul>
        </div>
      ))}

      <button onClick={onDownloadClick} type="button">
        Download JSON
      </button>
      <input type="file" accept="application/json" onChange={onUpload} />
    </div>
  );
}


// v18.x+
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.development.js"></script>
<div id="root"></div>

如何测试-下载JSON文件,打开它并更改其中的一些内容,如"banana"更改为"banana111",保存,上传文件并观察更新后的值。
不知道什么是关于图像的计划,但在最坏的情况下-你可以存储图像在JSON作为base64字符串。

相关问题